1

サーバーに間隔を置いて「ping」を送信しているときに、IdleStateHandler がタイムアウトしないようにするのに問題があります。これは、エグゼキュータ スレッドが (同じチャネルに対して) 処理で長時間ビジー状態になっている場合に発生します。

パイプラインの最初のステップは、タイムアウトが 20 秒に設定された IdleStateHandler です。

数ステップ後、小さなキュー サイズが 3 (maxChannelMemorySize) に設定された OrderedMemoryAwareThreadPoolExecutor でパイプラインがセットアップされます。

エグゼキューターからディスパッチされたワーカー スレッドが長時間処理されている場合 (最大 90 秒かかる場合があります)、IdelStateHandler は 3 つのメッセージ (messageReceived) しか受信できないようです。エグゼキューターのキュー サイズを 30 に変更すると、IdleStateHandler で 30 の messageReceived 呼び出しが許可されます。その後、さらに 20 秒後にタイムアウトします。channelIdle は GameServerHandler に実装されています (最後のステップ)。

私は Netty にかなり慣れていないので、パイプラインの概念を理解していない可能性があります。私の期待は、メッセージが常にレイヤー間を行き来することです。後で追加されるため、実行プログラムのキュー サイズに関係なく、すべての受信メッセージに対して IdleStateHandle が呼び出されることを期待します。

netty 3.5.8 final を使用しています。

私は何が欠けていますか?

OrderedMemoryAwareThreadPoolExecutor eventExecutor = new OrderedMemoryAwareThreadPoolExecutor(100, 3, 300);
Timer timer = new HashedWheelTimer();
...


pipeline.addLast("idleHandler", new IdleStateHandler(timer, 20, 0, 0));
...
pipeline.addLast("executionHandler", executionHandler);
pipeline.addLast("handler", new GameServerHandler());
4

1 に答える 1

0

ExecutionHandler は、IdleStateEvents の生成に影響を与えるべきではありません。理解する必要があるのは、IdleStateEvents を処理する「ロジック」が GameServerHandler に実装されている場合、それは ExecutionHandler (または、より詳細にはそれによって使用される Executor) のビジー状態に依存することです。

したがって、私のアドバイスは、IdleStateEvents の処理ロジックを別の IdleAwareUpstreamHandler 実装に配置し、それを ExecutionHandler の前に配置して、ExecutionHandler 経由ではなく IO-Thread によって処理されるようにすることです。

于 2012-10-16T04:50:49.827 に答える