如何在其他类中读取netty中的消息

我想在除InboundHandler之外的类中的特定位置读取消息。 我找不到在channelRead0方法中读取它的方法,这是从netty框架调用的。

例如:

 context.writeMessage("message"); String msg = context.readMessage; 

如果这是不可能的,我怎样才能将我在channelRead0方法中得到的结果映射到我在另一个类中进行的特定调用?

Netty框架旨在异步驱动。 使用这个类比,它可以处理大量的连接,并且线程使用最少。 我是在创建一个使用netty框架将呼叫分派到远程位置的api,你应该对你的呼叫使用相同的类比。

而不是让你的api返回值直接,让它返回FuturePromise 。 在您的应用程序中有不同的方法来实现此系统,最简单的方法是创建一个自定义处理程序,将传入的请求映射到FIFO队列中的Promise

这方面的一个例子如下:

这很大程度上取决于我过去提交的这个答案。

我们从处理器开始,将请求映射到管道中的请求:

 public class MyLastHandler extends SimpleInboundHandler { private final SynchronousQueue> queue; public MyLastHandler (SynchronousQueue> queue) { super(); this.queue = queue; } // The following is called messageReceived(ChannelHandlerContext, String) in 5.0. @Override public void channelRead0(ChannelHandlerContext ctx, String msg) { this.queue.remove().setSuccss(msg); // Or setFailure(Throwable) } } 

然后,我们需要一种将命令发送到远程服务器的方法:

 Channel channel = ....; SynchronousQueue> queue = ....; public Future sendCommandAsync(String command) { return sendCommandAsync(command, new DefaultPromise<>()); } public Future sendCommandAsync(String command, Promise promise) { synchronized(channel) { queue.offer(promise); channel.write(command); } channel.flush(); } 

完成我们的方法之后,我们需要一种方法来调用它:

 sendCommandAsync("USER anonymous", new DefaultPromise<>().addListener( (Future f) -> { String response = f.get(); if (response.startWidth("331")) { // do something } // etc } ) ); 

如果被叫者希望使用我们的api作为阻止呼叫,他也可以这样做:

 String response = sendCommandAsync("USER anonymous").get(); if (response.startWidth("331")) { // do something } // etc 

请注意,如果线程状态被中断,则Future.get()可以抛出InterruptedException ,这与套接字读取操作不同,后者只能通过套接字上的某些交互来取消。 FutureListener不应该出现此exception。