0

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

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

  • 导入 org.eclipse.jetty.client.api。结果

真的有两个问题:

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

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

笔记:

4

1 回答 1

0

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

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

一些异步接口使用诸如“使用内容”等调用。但是使用 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 文档应该包括用于此类操作的“清理代码”——数据通信、数据库等。希望这篇文章可以为其他人节省时间。

于 2014-10-28T23:50:57.163 回答