如何通知Jetty 9.02的“内容消耗”。 ContentListener?

我有一个Jetty HttpClient使用Jetty v9.0.2发送异步请求。 我有一个成功缓冲响应的Response.ContentListener和一个在调用完成时调用的Response.CompeleteListener。

  • Jetty 9.2 JavaDocs有一个Request.AsyncContentListener ,它有一个参数告诉Jetty已经消耗了内容:
    • callback – 内容消耗时调用的回调。

此侦听器类型不在Jetty v9.0.2响应API中:

  • import org.eclipse.jetty.client.api。 结果 ;

真的有两个问题:

  1. Response.ContentListener是否需要通知Jetty客户端内容已被使用?
    • 如果是这样:如何使用Jetty v9.0.2进行管理
  2. 使用这两个Response.ContentListener和Response.CompeleteListener设置的异步调用需要什么样的清理?
    • 是否有使用Jetty v9.0.2异步的潜在gottchas?

它似乎工作正常; 我需要确保我们没有资源泄漏或潜在的泄漏等。当然,我们需要程序很好,干净,所以它可以24×7全天候运行。 在此先感谢您的欢迎帮助。

注意:

  • Request.AsyncContentListener – Stable Jetty doc (jetty 9.2,我相信)

对这个问题的简短回答是在异步调用完成处理后调用HttpClient.stop ()。 本教程示例概述了解决方案方法:

  • Jetty的HTTP客户端

主要方面是直到(所有)侦听器完成并且处理完成后才可以调用stop ()。 在上面的示例中, CountdownLatch用于同步stop()调用。 这在Jetty示例中没有真正解释,例如:

  • 新的Jetty 9 HTTP客户端
  • 第28章HTTP客户端 – 异步API
  • HttpClient类

一些异步接口使用“ 消费内容 ”等调用。但是对于Jetty 9,stop()调用会进行清理。

我们的用例很直接。 在侦听器的onComplete()方法中,调用setCompleted ()方法,该方法递减Httpclient.send ()的倒计时锁存器。 在send()调用之后,我们有一个名为finished ()的同步方法,它等待setCompleted()的调用。

public boolean finish(){ boolean result = false; int retryCount = 0; try { if( !this.latch.await( 5, TimeUnit.SECONDS ) ) { Util.warn(LOG,"Timed-out -- msg #", String.format("%0,4d", this.msgId) ); } this.httpClient.stop(); result = this.httpClient.isStopped(); } catch (InterruptedException ex ) { log.warn("Interrupted -- msg #", String.format("%0,4d", this.msgId)" ); } catch (Exception ex) { log.error(LOG,"Stop-exception -- msg #", String.format("%0,4d", this.msgId) ); } if( !result ) { log.warn(" * HttpClient NOT stopped -- msg #", String.format("%0,4d", this.msgId) ); } return result; } 

只要在onComplete()方法结束时调用setCompleted(),停止调用似乎对调用感到满意。 我不清楚你是否不能确定onComplete的内部时间。 否则一切似乎都令人满意。 我真的相信API文档应包含此类操作的“ 清理代码 ” – 数据通信,数据库等。希望这篇文章能为其他人节省时间。