事件被转发到客户端套接字,下面的代码正在读取该套接字。大多数情况下,代码按预期工作。有时数据包被发送到套接字,这会导致 readline 以空消息解除阻塞。从那时起,readline 调用不再阻塞,从而导致 CPU 峰值。我用代码验证了socket没有关闭,输入流没有关闭,isSocketClosed和isInputShutdown都返回false。就绪调用只是尝试查看正在发生的事情,读取调用总是返回-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);
}
}