[英]Asynchronous Application Design With Netty
我有一個服務器Foo,可以通過一個簡單的套接字連接到它。 我在套接字中寫入文本以發送消息,處理完后它會回復我的查詢,但是不能保證響應的順序。 我可以用ID鏈接請求和響應。
例如:
Send "1:request" to Foo
Foo Returns "1:response"
Send "1:request" & "2:request" to Foo
Foo Returns "2:response"
10 seconds later
Foo Returns "1:response"
題:
使用Netty處理這種情況的最佳方法是什么,如何提供允許我向Foo服務提交消息的界面,並給我一個Promise或Future來允許我返回而不會阻塞等待對消息的響應(但知道我有一個以后可以阻止的對象)
一種實現方法是在響應處理程序(即客戶端管道中的最后一個處理程序)與發出請求的客戶端之間共享數據結構。 例如,它可以是具有您的ID和阻止隊列的映射,處理程序將在其中放置響應。
您的客戶端中的發送消息類似於:
public Future send(String id, String msg) {
BlockingQueue queue = new ArrayBlockingQueue(1);
handler.responses().put(id, queue);
channel.writeAndFlush(id + ":" + msg);
return new MyFuture(queue);
}
然后,調用send()
的線程可以等待myFuture.get()
的響應,該線程的實現會阻塞在構造函數中傳遞的隊列,例如:
@Override
public String get() throws InterruptedException, ExecutionException {
return queue.take();
}
簽出HTTP / 2示例以獲取另一種方法(仍然非常相似): https : //github.com/netty/netty/blob/4.1/example/src/main/java/io/netty/example/http2/client/HttpResponseHandler的.java
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.