簡體   English   中英

AsyncHttpClient可以執行非阻塞,異步HTTP調用嗎?

[英]can AsyncHttpClient perform non-blocking, async HTTP calls?

所有,

我正在嘗試決定是否將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響應,並且事件循環在此期間只處理其他事情。

任何和所有的建議表示贊賞。

謝謝,康納

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>

...

唯一的麻煩是,由於沒有關閉客戶端的代碼,因此流程處於懸空狀態,但這是一個單獨的故事。

如果你可以增強你的數據庫http服務器以支持異步請求,那么我建議你這樣做。

通常,Http異步請求使用REQUEST SUBMIT-> REQUEST ACCEPTED-> JOB POLLING - > JOB RESPONSE來實現。

Asyn請求是使用POST / PUT實現的,您可以在其中提交請求,並在HTTP標頭中獲得202 Accepted以及輪詢URL以異步獲取結果。 現在你可以輪詢這個以獲得結果,如果結果可用你應該得到200 OK,一些結果為xml / json / text輸出,否則你可能會得到錯誤的HTTP代碼,例如503 Service Unavailable。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM