如何在Jetty客户端异步API中从CompleteListener获取内容

如何在Jetty客户端异步API中从CompleteListener获取内容,jetty,embedded-jetty,Jetty,Embedded Jetty,在下面的Jetty文档示例中,描述了一种执行高效异步HTTP请求的简单方法。然而,在本例中,它从未指定您实际应该如何检索服务器的回复,我似乎无法理解 结果对象有getResponse()和getRequest(),但这两个对象都没有访问内容的方法 有人知道吗 码头文件 简单的异步GET请求可以这样编写: httpClient.newRequest(“http://domain.com/path") .send(新响应.CompleteListener() { @凌驾 未完成的公共无效(结果)

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

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

有人知道吗


码头文件

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

httpClient.newRequest(“http://domain.com/path")
.send(新响应.CompleteListener()
{
@凌驾
未完成的公共无效(结果)
{
//你的逻辑在这里
}
});

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

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

您的问题的详细答案将在
响应内容处理
部分进行解释

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

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

request.send(新的BufferingResponseListener(){…});
如果您在内容到达时对其感兴趣,则应传递
响应.ContentListener
,该响应将逐块通知您内容

您可以通过两种方式执行此操作:使用
Response.Listener
(它扩展了
Response.ContentListener
):

request.send(newresponse.Listener())
{
内容(…){…}中的公共无效
已完成(…){…}的公共空
});
或使用多个侦听器:

request.onResponseContent(newresponse.ContentListener(){…});
send(新的CompleteListener(){…});
您拥有所需的所有灵活性,现成的实用程序类可以帮助您(无需编写复杂的缓冲代码,只需使用
BufferingResponseListener
)。

虽然前面的答案(第一天:2013-06\u Jun-24)将让您开始,但需要比当前(Jetty v9.2)文档中的更多内容

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

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


同样重要的是做一些家务来确保线程在并发处理情况下“运行良好”。

是的,我发现了同样的问题。一些文档显示的调用不是最新版本接口的一部分。我使用的是Jetty 9.2.1 v20140609(通过maven)。没有明确的方法可以从结果对象中找到内容,除非人们有信心将getResponse()转换为(ContentResponse)getResponse(),从下面的答案来看,这也行不通。不过,严肃地说,示例应该展示如何做一些功能性的事情,而不仅仅是“onComplete{…dosomething…”。我也不确定当前的答案是否真的澄清了它。@will,没有信心的飞跃,只需阅读文档并理解示例。我必须看到不同的方法。该方法采用Response.CompleteListener,它只继承Response.ResponseListener…它没有方法和源代码注释:Common,empty,super interface for response listeners.CompletedListener和ContentListener是对等的。如果其中一个确实传递了response.Listener,那么它的语义与将一个侦听器转换为另一个侦听器的语义完全相同。虽然它可能会起作用,但语义明确地说不要这样做。我相信你最后的建议是更好的方式,尊重语义我认为第二种方法应该推荐给Eclipse Jetty项目,将Send方法改为take Request.Listener,而不是completedspeaking@will,handing send()以
请求为例。Listener
显然是错误的,因此我们不会这样做。响应中链接的文档清楚地显示了如何以同步和异步方式检索内容,只要阅读并理解示例即可。@sbordet--是的,这正是我所说的,我同意,它不仅是“错误的”“事实上,我主张第三种选择(“最后的建议”)。。。“request.onResponseContent(newresponse.ContentListener(){…});”我的讽刺翻译得不好。