1

イベントは、以下のコードによって読み取られるクライアント ソケットに転送されます。ほとんどの場合、コードは期待どおりに機能します。場合によっては、データ パケットがソケットに送信され、それによって 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);
    }
}
4

3 に答える 3