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

con*_*gil 5 java netty asynchttpclient

所有,

我正在尝试决定是否将NodeJS或Java用于我的应用程序.我将通过HTTP与CouchDB进行通信,并希望采用异步非阻塞设计,我的应用程序线程可以在等待来自CouchDB的查询响应时处理其他请求.

我更喜欢使用Java,我一直在寻找AsyncHttpClient作为潜在的解决方案.但是,我在理解图书馆方面遇到了一些麻烦,并认为我可能对某些内容存在根本性的误解.

我在这里发布了一个要点:https://gist.github.com/conorgil/5505603

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

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

我从根本上误解了一些事情吗?是否可以在Java中执行此类操作?是AsyncHttpClient的答案吗?这个问题是相关的,但不确定自2011年以来情况是否发生了变化(使用Java AsyncHttpClient库执行异步连接?)

由于NodeJS运行事件循环,因此这种非阻塞的异步行为是标准的.您只需注册一个回调函数来处理收到的DB响应,并且事件循环在此期间只处理其他事情.

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

谢谢,康纳

Jun*_*san 0

如果您可以增强 DB http 服务器以支持异步请求,那么我建议您这样做。

一般来说,Http异步请求是通过REQUEST SUBMIT->REQUEST ACCEPTED-> JOB POLLING -> JOB RESPONSE来实现的。

异步请求是使用 POST/PUT 实现的,您提交请求后会收到 202 Accepted 以及 HTTP 标头中的轮询 URL,以异步获取结果。现在您可以轮询它以获取结果,如果结果可用,您应该得到 200 OK,其中一些结果为 xml/json/text 输出,否则您可能会收到错误 HTTP 代码,例如 503 Service Unavailable。