独自のフレーム デコーダーを実装して、UDP ソケット経由で受信したバイトを (NioDatagramChannelFactory と ConnectionlessBootstrap を使用して) プロトコルに従って解析しました。メッセージの受信中にサーバーで何が起こっているかを追跡するために、デコーダーの各コールバック メソッドにトレース ログを追加しました。
サーバーが受信するほぼすべてのメッセージで、メソッド channelInterestChanged() でイベント「channelInterestChanged」が 2 回受信されていることがわかります。イベントの値は、最初は 0 (OP_NONE)、次に 1 (OP_READ) です。
これに関するドキュメントを読みましたが、なぜこのようなイベントが発生するのかまだよくわかりません。最初に確認したのは、受信バッファー (またはセレクター キュー) がいっぱいだったからですが、サーバーは "messageReceived" イベント (decode() メソッドが呼び出される前) とすべてのメッセージを受け取るのと同じ回数、このイベントを受け取ります。 /frames は期待どおりに正しくデコードされます。メッセージが欠落している場合、イベントはまったく表示されません。この場合、おそらくデータグラム ソケットの受信バッファがいっぱいになっていることが原因です。しかし、この受信バッファーを増やしても、引き続きこれらのイベントが表示され、メッセージが失われます。
したがって、受信したメッセージごとに、サーバーが2つの「channelInterestChanged」も受信する理由が不思議です。1つはOP_NONE値で、もう1つはOP_READ値です。チャネル パイプラインでは、私のフレーム デコーダーの後に、ExecutionHandler と別のビジネス固有のハンドラー (JMS メッセージを ActiveMQ インスタンスに送信する) があることにも注意してください。
私のためのアイデアや説明はありますか?
ありがとうございました。