如何在Jetty Client Async API中从CompleteListener获取内容



在下面Jetty文档中的示例中,描述了一种执行高效异步HTTP请求的简单方法。然而,在本例中,它从未指定实际应该如何检索服务器的回复,而且我似乎无法弄清楚。

Result对象有getResponse()和getRequest(),但这两个对象都没有访问内容的方法。

有人知道吗?


Jetty的文档

一个简单的异步GET请求可以这样写:

httpClient.newRequest("http://domain.com/path")
        .send(new Response.CompleteListener()
        {
            @Override
            public void onComplete(Result result)
            {
                // Your logic here
            }
        });

方法Request.send(Response.CompleteListener)返回void并且不阻塞;当请求/响应会话完成时,作为参数提供的Response.CompleteListener会得到通知,Result参数允许您访问响应对象。

您可能需要Jetty 9 HttpClient文档作为参考。

关于您问题的详细答案,请参阅Response Content Handling部分。

如果您将一个普通的CompleteListener传递给Request.send(CompleteListener),则表示您对内容不感兴趣,内容将被丢弃。

如果您对内容感兴趣,但仅在响应完成时,您可以传递提供的实用程序类,如BufferingResponseListener:

request.send(new BufferingResponseListener() { ... });

如果您对到达的内容感兴趣,那么应该传递一个Response.ContentListener,它会逐个块地通知您内容。

您可以通过两种方式做到这一点:使用Response.Listener(它扩展了Response.ContentListener):

request.send(new Response.Listener() 
{
    public void onContent(...) { ... }
    public void onComplete(...) { ... }
});

或使用多个侦听器:

request.onResponseContent(new Response.ContentListener() { ... });
request.send(new CompleteListener() { ... });

您拥有所需的所有灵活性,还有现成的实用程序类可以帮助您(无需编写复杂的缓冲代码,只需使用BufferingResponseListener)。

虽然前面的答案(第一个日期:2013-06_Jun-24)会让你开始,但需要比当前(Jetty v9.2)文档中更多的内容。

首先需要的是一种调用HttpClient来关闭/完成处理的方法——在CompleteListener完成后,需要调用HttpClient.stop()。如果这就是我们所做的,代码有时会崩溃(Java异常),这里显示了一种适当关闭HttpClient的可靠方法:

  • 如何通知";消耗的内容";用于码头9.02。ContentListener

必须调用HttpClient.stop()方法,否则Jetty可能会使JVM缺少线程(或资源)。这就是这里讨论的问题:

  • 在Jetty HttpClient Hang上寻求建议

做一些家务也很重要,以确保线程"在并发处理情况下发挥良好的"。

相关内容

  • 没有找到相关文章

最新更新