イベントは、以下のコードによって読み取られるクライアント ソケットに転送されます。ほとんどの場合、コードは期待どおりに機能します。場合によっては、データ パケットがソケットに送信され、それによって readline がヌル メッセージでブロック解除されることがあります。その時点から、readline 呼び出しが再びブロックされることはなく、CPU スパイクが発生します。ソケットが閉じられていないこと、入力ストリームがシャットダウンされていないこと、isSocketClosed と isInputShutdown の両方が false を返すことをコードで確認しました。ready 呼び出しは、何が起こっているかを確認するための単なる試みであり、read 呼び出しは常に -1 を返します。ソケットはまだデータを受け入れており、新しい有効なパケットが入ってきて正しく処理されていますが、readline が再びブロックされることはありません。なぜreadlineがこのように振る舞うのか考えていますか?
while (!this.isInterrupted())
{
String message = null;
do {
message = reader.readLine();
if ( message != null && message.length() > 0 ) {
//if ( log().isDebugEnabled())
log().info( "Got a message, raw data: " + message );
createEvent( message );
}
} while ( message != null && !this.isInterrupted());
if(!reader.ready()) {
log().info("Bytes read: " + reader.read());
Thread.sleep(1000);
}
}