0

新しいjavanioライブラリの主要コンポーネントとしてtcpフロー制御を取得したいと思います。このように動作します...

  1. ライブラリは、データをListener.incomingData(DataChunk dataChunk);に起動します。
  2. dataChunk.processed()が呼び出されるまで、ライブラリはデータが存在する場合でもそれ以上データを起動しません。
  3. 通常、最初のいくつかのdataChunkでprocessed()メソッドを呼び出すことができますが、メッセージの最後の1つで、リモートソケットに書き込み、コールバックハンドラーを指定します。
  4. 書き込みコールバックが呼び出されたら、最後のdataChunk.processed()を呼び出して、tcpフロー制御を再度解除します。

大きな注意:ステップ2は、NICバッファーから読み取らない場合に、tcpフロー制御が自動的に開始される場所です。これはすべて自動です(Java nioでテストしました)。ただし、問題は、ポーラーが解放を停止し、このソケットを除く他のすべてのソケットでデータを待機する状態にキーをどのように配置するかです。最後のdataChunkが処理されていないことがわかり、無視されるため、新しいデータがあるときにリリースされてもかまいませんが、ポーラースレッドが100%CPUを循環することは望ましくありません。この潜在的なオープンソースのnioフレームワークを使用して、任意のサーバーの自動スロットリングを実現できるように、これを実現する方法はありますか。

4

2 に答える 2

1

キャンセルして後でチャンネルを再登録するか、チャンネルOP_READ,を変更して登録を解除しinterestOps()、もう一度読む準備ができたら元に戻します。

于 2012-12-11T07:39:51.847 に答える
1

いいえ、セレクターはシステムからのイベントではなく内部状態を確認します。そのため、キーが読み取り可能なデータを感知するように設定されている間は、データがバッファー内で読み取りを待機している間は常に戻ります。

あなたが持っている3つのオプションがあります

前のチャンクが処理されるのを待つ間、バッファからデータを読み取り、ローカルに保存します。

セレクターからキーを登録解除し、チャンクが処理されたときに再登録します。

チャンクが処理されたときに読み取り可能とリセットを感知しないようにキーを設定します。

読書の興味を切り替えるには、これがあなたが望むものだと思います

selectionKey.interestOps(selectionKey.interestOps() ^ SelectionKey.OP_READ);
于 2012-12-11T03:16:36.773 に答える