如何通知"消费的内容"对于Jetty 9.02。 ContentListener?

时间:2014-10-23 01:31:20

标签: java asynchronous listener jetty-9 resource-cleanup

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

此侦听器类型不在Jetty v9.0.2 Response api中:

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

确实有两个问题:

  1. Response.ContentListener是否需要通知Jetty客户端内容已被占用?
    • 如果是这样:如何使用Jetty v9.0.2进行管理
  2. 使用这两个Response.ContentListener和Response.CompeleteListener设置的异步调用需要什么样的清理?
    • 是否有潜在的gottchas与Jetty v9.0.2使用异步?
  3. 似乎工作正常;我需要确保我们没有资源泄漏或潜在的泄漏等。当然,我们需要程序很好,干净,所以它可以24x7全天候运行。 提前致谢以获得欢迎帮助。

    请注意:

1 个答案:

答案 0 :(得分:0)

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

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

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

我们的用例很直接。在侦听器的onComplete()方法中,调用 setCompleted ()方法,该方法递减Httpclient.send()的倒计时锁存器。在send()调用之后,我们有一个名为已完成()的同步方法,它等待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文档应该包含“清理代码”这样的操作 - 数据通信,数据库等。希望这个帖子可以节省其他人的时间。