サーバーに間隔を置いて「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());