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