2013-03-25 63 views
5

我的Netty渠道处理程序channelClosed()被阻止,而在messageReceived()收到另一个消息。我使用OrderedMemoryAwareThreadPoolExecutor来同步消息。
是由低优先级线程处理channelClosed()Netty简单渠道处理程序断开被阻止

请问您可以告诉netty中的线程优先级。 谢谢

objChannelPipeline.addLast("ipFilter", objCustomIPFilterHandler); 
    objChannelPipeline.addLast("idleHandler", new IdleStateHandler(timer,5,5, 0)); 
    objChannelPipeline.addLast("loggingHandler", objLoggingHandler);   
    objChannelPipeline.addLast("frameDecoder", 
      new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, false, ChannelBuffers.copiedBuffer("\n\n".getBytes(CharsetUtil.UTF_8)))); 
    objChannelPipeline.addLast("messageDecoder", new CustomMessageDecoder()); 
    objChannelPipeline.addLast("groupOrder", executionHandler); 
    objChannelPipeline.addLast("ProtocolMultiplexer", CustomHandler); 

回答

2

我想这是因为你使用OrderedMemoryAwareThreadPoolExecutor,在这种情况下,活动将在其发生的顺序执行。因此messageReceived()将始终在channelClose()之前执行。

因此,如果您收到3条消息并且之后通道关闭,那么将执行前三次messageReceived,之后将只执行channelClose()

如果您使用的是MemoryAwareThreadPoolExecutor而不是在这种情况下channelClose可以在messageReceived()之前调用,因为这里的事件执行没有排序。

希望这有助于!

+0

该场景是一个通道关闭,同时另一个通道连接并通过该通道接收消息。 – user2067201 2013-03-25 11:19:05

+0

@ user2067201。在这种情况下,'messageReceived'也可以在'channelClose()'事件之前调用,因为它们在不同的通道上发生。但是没有线程优先级与事件相关联,因此它们可以按任何顺序发生。 – 2013-03-25 11:48:02

+0

谢谢您的回复。我首先收到频道关闭事件,但是当messageReceived()m – user2067201 2013-03-25 11:50:08