Netty 在网中不间断地等待

Netty 在网中不间断地等待,netty,Netty,我认为“不间断地等待”意味着在操作完成之前执行块代码,但似乎不是这样: public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { ChannelFuture f = e.getChannel().close(); f.awaitUninterruptibly(); // ok, not netty i/o thread, I use a Execution Handler System

我认为“不间断地等待”意味着在操作完成之前执行块代码,但似乎不是这样:

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    ChannelFuture f = e.getChannel().close();
    f.awaitUninterruptibly(); // ok, not netty i/o thread, I use a Execution Handler
    System.out.println("bbb " + System.currentTimeMillis());
}
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
    System.out.println("aaa " + System.currentTimeMillis());
}
我发现“bbb”在“aaa”之前执行,如果我转到调试模式并逐行执行,“aaa”在“bbb”之前,因为代码执行速度变慢了。我是否不断地误解了你


仅等待对当前线程有效,但使用ExecutionHandler或线程池工作线程时,关闭可能由另一个线程执行,因此等待是无用的。为此,需要添加ChannelFutureListener。

一旦通道关闭,I/O工作线程就会发出未来信号,然后继续处理回调。在这种情况下,在I/O工作者能够触发相关的断开连接、解除绑定和关闭事件之前,线程池线程正在重新调度。当您运行调试器时,您正在更改线程的调度方式

一般来说,future用于确定请求的操作何时完成,而不是由完成的操作触发的任何其他操作是否也已完成


具体来看一看void close(NioSocketChannel channel,ChannelFuture future)方法,了解确切的逻辑。

有什么方法可以实现我想要的吗?如果使用执行处理程序,似乎很难将什么类型的执行器传递给执行处理程序。回想起来,我有点惊讶,如果您使用的是OrderMemoryWareThreadPoolExecutor,那么在调试模式下您会看到“aaa”在“bbb”之前,因为在messageReceived返回之前,您不应该看到更多的事件。上述两种方法是否在同一个上游处理程序中?另外,您能解释一下为什么需要在messageReceived返回之前看到channelDisconnected吗?是的,我使用的是OrderMemoryWareThreadPoolExecutor,2个方法属于管道中执行处理程序下方的一个处理程序。当一个帐户登录两次时,我需要将前一个帐户踢到脱机状态,但在关闭前一个通道之前,我需要保存它的数据。所以我希望channelDisconnected中的代码可以在messageReceived中的代码之前完成,messageReceived中的代码可以处理下一次登录。有什么建议吗?在netty doc中,典型的方式似乎应该是登录到一个独立的处理程序,并将其置于执行句柄之上。这就是为什么在调试中“aaa”在“bbb”之前,因为messageReceived调用和channelDisconnected调用属于不同的处理程序对象。我以为你会问是否属于一个处理程序类,对不起