使用Java AsyncHttpClient库执行异步连接?

时间:2011-08-12 13:44:47

标签: java http asynchronous

我只是将一些代码从.net移植到Java。我一直在使用AsyncHttpClient(https://github.com/sonatype/async-http-client)库和Netty提供程序。

进行一些测试我很惊讶地发现在执行调用期间,例如:

httpClient.prepareGet("http://bbc.co.uk").execute(
                  new AsyncCompletionHandler<Response>() { ... });

NettyAsyncHttpProvider执行到站点的引导连接,即:。

bootstrap.connect(new InetSocketAddress(
                                        AsyncHttpProviderUtils.getHost(uri), 
                                        AsyncHttpProviderUtils.getPort(uri)));

编辑:澄清NettyAsyncHttpProvider类是AsyncHttpClient库的一部分。它与Netty本身无关。

对于像bbc网站这样的东西(在我的低连接上),执行完成需要大约300ms(然后几乎立即发生异步接收/完成)。这真的杀死了我的调度程序的性能,该调度程序试图启动多个异步调用。当每个呼叫到达同一个域时,它运行良好。在我的情况下,我有数百个不同的域,因此每次调用都会产生初始延迟,同时建立连接会导致调度程序的吞吐量下降。

有人可以提供有关如何使用此库的任何建议,以便它真正以异步方式或替代库工作吗?

谢谢, 保罗

2 个答案:

答案 0 :(得分:2)

回答我自己的问题...最后我尝试了原始的AsyncHttpClient库,Jetty和Apache HttpAsyncClient(http://hc.apache.org/httpcomponents-asyncclient-dev/index.html)来尝试找到一个100%异步的库。

据我所知,这些库中的每一个都在异步执行实际的http请求之前执行阻塞连接。

为了继续前进,我已经完成了在自己的线程中执行每个http请求。我遵循了“2.9。多线程请求执行”(http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html)一节中概述的模式,详细说明了如何使用这种方法。

这种方法现在运行良好,允许我的“调度程序”快速创建大量异步调用,而不会在主线程中出现任何阻塞。

答案 1 :(得分:0)

是的,你看过java非阻塞api吗? (a.k.a NIO)? 关于它有一个stack overflow thread是有用的。 此article by IBM developerWorks也可以帮助您确定它是否符合您的要求。