如何通知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。 结果 ;
真的有两个问题:
- Response.ContentListener是否需要通知Jetty客户端内容已被使用?
- 如果是这样:如何使用Jetty v9.0.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文档应包含此类操作的“ 清理代码 ” – 数据通信,数据库等。希望这篇文章能为其他人节省时间。