[英]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.