Netty 4.0.0.Beta2 を使用しています
いくつかのハンドラーで構成されたパイプラインがあり、最後のハンドラーは独自の EventExecutorGroup で実行されます。少し似ています:
DefaultEventExecutorGroup separateGroup = new DefaultEventExecutorGroup();
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(AGGREGATE, new SomeHandler());
pipeline.addLast(ENCODE, new OtherHandler());
pipeline.addLast(extractEventGroup, EXECUTE, new ExecuteHandler());
次に、ChannelInitalizer の一部として、このパイプライン構成を使用して ServerBootstrap を構成します。
サーバーの実行中、「channels」と呼ばれる ChannelGroup で現在のすべてのクライアントを追跡します。
後で、サーバーをシャットダウンするときに、すべてのチャネルをフラッシュして閉じてから、
bootstrap.shutdown();
これにより、NIO EventExecutorGroup がシャットダウンされますが、ChannelHandler のパイプラインに追加した別個の DefaultEventExecutorGroup はシャットダウンされません。つまり、スレッドがまだアクティブであるため、JVM は終了しません (待機しているだけで解放されていません)。
これも閉じられていないことに少し驚いたので、DefaultEventExecutorGroup への参照を保持し、bootstrap.shutdown() 呼び出しの後に手動で閉じます。
separateEventGroup.shutdown();
私は何かを見逃していましたか、それとも Netty の予期された動作ですか?