2013-05-03 88 views
5

全部,AsyncHttpClient可以执行非阻塞异步HTTP调用吗?

我想决定是否使用NodeJS或Java为我的应用程序。我将通过HTTP与CouchDB进行通信,并希望有一个异步非阻塞设计,我的应用程序线程可以处理其他请求,同时等待来自CouchDB的查询响应。

我宁愿使用Java,我一直在寻找AsyncHttpClient几天作为潜在的解决方案。但是,我在理解图书馆方面遇到了一些困难,并认为我可能对某些事情有根本性的误解。

我这里张贴一个要点:“请求X派” https://gist.github.com/conorgil/5505603

我希望这个要点打印出来和每个请求的“响应X:某事”。但是,在每个Future调用get()之前,似乎没有进行HTTP调用(因此,处理程序未执行)。取消注释第23行f.get()使代码按预期工作,但对Future#get()的调用被阻止,是否正确?有没有办法提供一个回调函数,一旦HTTP响应被完全检索而没有被阻塞就会被执行?

类似如下: 1)请求进入主线程 2)异步,对CouchDB进行非阻塞HTTP调用。注册完成处理程序以处理来自CouchDB的响应3)主线程现在可以自由处理下一个请求 4)来自CouchDB的HTTP响应到达某个点,并且调用注册的处理程序以执行某些业务逻辑 5)主线程继续处理请求(对于不需要访问CouchDB的请求,它们可以很快响应)

我是否从根本上误解了某些东西?在Java中可以做这种事情吗? AsyncHttpClient是答案吗?这个问题是相关的,但不知道自2011年以来事情是否发生了变化(Perform Async Connect with Java AsyncHttpClient Library?

由于NodeJS运行事件循环,因此此非阻塞异步行为是标准的。你只需要注册一个回调函数来处理数据库响应,并且事件循环会在处理其他事情的时候处理。

任何和所有的建议表示赞赏。

感谢, 康纳尔

+0

是的。看看vert.x – 2013-05-06 12:23:03

+0

node.js作为一个轻量级的反向代理/网关,使用couchdb只需很少的应用程序逻辑,这很简单,因为沙发的http接口和节点的简单异步http插件。java对沉重的应用程序逻辑更具操作性。 – 2015-12-05 00:02:16

回答

0

如果你能提高你的数据库http服务器,支持异步请求,那么我会建议这样做。

通常Http异步请求是使用请求提交 - >请求接受 - >作业轮询 - >作业响应实现的。

Asyn请求是使用POST/PUT在您提交请求的地方实现的,您可以在HTTP头中同时使用轮询URL以异步获取结果。现在你可以轮询这个来得到结果,如果结果是可用的,你应该得到200 OK,并得到一些结果作为XML/JSON /文本输出,否则你可能会得到错误的HTTP代码,如503服务不可用。

2

AsyncHttpClient的主要目的是非阻塞HTTP,我已经成功地使用它来达到这个效果。例如,我运行了这个简化版本的代码:

public class MyAsyncHttpClientTest { 
    public static void main(String[] args) throws Exception { 
    AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); 
    for (int i = 0; i < 10; i++) { 
     asyncHttpClient.prepareGet("http://www.google.com") 
     .execute(new CompletionHandler(i)); 
     System.out.println(String.format("Request %d sent! ", i)); 
     System.out.flush(); 
    } 
    } 
    static class CompletionHandler extends AsyncCompletionHandler<Void> { 
    private final int reqNumber; 
    public CompletionHandler(int reqNumber) { this.reqNumber = reqNumber; } 
    @Override public Void onCompleted(Response response) throws Exception { 
     System.out.println(String.format("Response %d: %s", reqNumber, 
      response.getResponseBody())); 
     return null; 
    } 
    } 
} 

注意没有涉及期货。它产生下面的输出,就像不要指望:

Request 0 sent! 
Request 1 sent! 
Request 2 sent! 
Request 3 sent! 
Request 4 sent! 
Request 5 sent! 
Request 6 sent! 
Request 7 sent! 
Request 8 sent! 
Request 9 sent! 
Response 1: <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>302 Moved</TITLE></HEAD><BODY> 
<H1>302 Moved</H1> 
The document has moved 
<A HREF="http://www.google.hr/">here</A>. 
</BODY></HTML> 

Response 0: <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>302 Moved</TITLE></HEAD><BODY> 
<H1>302 Moved</H1> 
The document has moved 
<A HREF="http://www.google.hr/">here</A>. 
</BODY></HTML> 

... 

唯一的麻烦是,该过程一直吊在那儿,因为没有代码,关闭客户端,但是这是一个不同的故事。