2013-03-25 60 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