【问题标题】:How to notify "content consumed" for Jetty 9.02. ContentListener?如何通知 Jetty 9.02 的“内容消耗”。内容监听器?
【发布时间】:2014-10-29 07:50:57
【问题描述】:

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

此侦听器类型不在 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 中使用异步是否存在潜在的问题?

它似乎工作正常;我需要确保我们没有资源泄漏或潜在泄漏等。当然,我们需要程序干净整洁,以便它可以 24x7 运行。 提前感谢您的欢迎帮助。

注意:

【问题讨论】:

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


    【解决方案1】:

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

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

    一些异步接口使用诸如“consume content”之类的调用。但是使用 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(),stop 调用似乎对调用很满意。我不清楚你是否不能确定 onComplete 的内部时间。否则,这一切似乎都令人满意。我真的相信 API 文档应该包含用于此类操作的“清理代码” - 数据通信、数据库等。希望这篇文章可以为其他人节省时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2016-05-24
      • 2022-06-14
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多