2013-03-25 2 views
5

내 네트워크 채널 처리기 channelClosed()이 (가) messageReceived()에 다른 메시지를 수신하는 동안 차단됩니다.
메시지 동기화에 OrderedMemoryAwareThreadPoolExecutor을 사용했습니다.
channelClosed()은 낮은 우선 순위 스레드로 처리됩니다.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() 전에 실행됩니다.

수신 된 메시지를받은 후 채널이 닫히면 처음으로 messageReceived 번 세 번 실행되고 그 후에는 channelClose() 만 실행됩니다.

channelClose보다 MemoryAwareThreadPoolExecutor을 사용하는 경우 messageReceived() 앞에 이벤트가 실행되지 않도록 호출 될 수 있습니다.

희망이 도움이됩니다!

+0

시나리오는 하나의 채널이 닫히는 동시에 다른 채널이 연결되고 해당 채널을 통해 메시지가 수신됩니다. – user2067201

+0

@ user2067201 이 경우'channelReceived'는'channelClose()'이벤트가 다른 채널에서 일어나기 전에 호출 될 수 있습니다. 그러나 이벤트와 관련된 스레드 우선 순위가 없으므로 순서에 관계없이 발생할 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 먼저 채널 종료 이벤트를 받았지만 messageReceived() 일 때 – user2067201