繁体   English   中英

Netty的异步应用程序设计

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM