5

全部,

我正在尝试决定是否为我的应用程序使用 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) 对 CouchDB 进行异步、非阻塞 HTTP 调用。注册完成处理程序以处理来自 CouchDB 的响应 3) 主线程现在可以自由处理下一个请求 4) 来自 CouchDB 的 HTTP 响应到达某个点并调用注册的处理程序以执行某些业务逻辑 5) 主线程继续只是处理请求(对于不需要打CouchDB的请求,可以很快得到响应)

我从根本上误解了这里的东西吗?有可能在 Java 中做这种类型的事情吗?AsyncHttpClient 是答案吗?这个问题是相关的,但不确定自 2011 年以来情况是否发生了变化(使用 Java AsyncHttpClient 库执行异步连接?

由于 NodeJS 运行一个事件循环,这种非阻塞的异步行为是标准的。您只需注册一个回调函数来在收到数据库响应时处理它,而事件循环将同时处理其他事情。

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

谢谢,康纳

4

2 回答 2

3

The main purpose of AsyncHttpClient is non-blocking HTTP and I have successfully used it to that effect. For example, I ran this simplified version of your code:

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;
    }
  }
}

Notice no futures are involved. It produces the following output, just as one should expect:

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>

...

The only trouble is, the process is left hanging because there is no code that shuts down the client, but that's a separate story.

于 2013-05-06T12:18:07.937 回答
0

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

一般 Http Async 请求使用 REQUEST SUBMIT->REQUEST ACCEPTED-> JOB POLLING -> JOB RESPONSE 来实现。

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

于 2013-05-03T01:24:04.113 回答