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

时间:2013-06-24 04:35:34

标签: jetty embedded-jetty

在下面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参数允许您访问响应对象。

2 个答案:

答案 0 :(得分:8)

您可能希望将Jetty 9 HttpClient documentation作为参考。

here部分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)。

答案 1 :(得分:0)

虽然较早的答案(第一次约会:2013-06_Jun-24)将帮助您入门,但需要的工作比当前(Jetty v9.2)文档中的要多。

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

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

做一些家务工作以确保线程好玩'这一点也很重要。在并发处理的情况下。