1

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 の予期された動作ですか?

4

2 に答える 2

1

これは実際にはバグではなく、予期される動作です。複数のプロトコル サーバーを実行する JVM について考えてみましょう。これらのサーバーがディスク I/O を実行し、JVM 全体でブロッキング ディスク I/O を実行するスレッドの数を制限したいとします。ディスク I/O を実行するハンドラー用に共有を作成EventExecutorGroupし、JVM 内の複数のプロトコル サーバーで使用することができます。

于 2013-04-02T06:48:46.340 に答える
-1

私はあなたが正しいと思います.これはバグです..修正を忘れないようにバグレポートを開いていただけますか?

https://github.com/netty/netty/issues

于 2013-03-28T07:09:21.180 に答える