kafka.consumer.SimpleConsumer:由于套接字错误而重新连接:java.nio.channels.ClosedChannelException

13 java sockets nio apache-kafka kafka-consumer-api

我正在为kafka运行一个简单的消费者,例如:

int timeout = 80000;
int bufferSize = 64*1024;
consumer = new SimpleConsumer(host, port,timeout, bufferSize, clientName);
Run Code Online (Sandbox Code Playgroud)

这运行好几个小时,但后来我在kafka.consumer.SimpleConsumer上得到一个例外:由于套接字错误重新连接:

java.nio.channels.ClosedChannelException

和消费者停止......以前有人遇到过这个问题吗?

Den*_*din 1

一个略有不同的问题,但也许具有相同的根本原因和解决方案,相关部分在这里得到了回答:

您已关闭该频道并仍在尝试使用它。

您的代码有几个问题。

首先,你对 EOS 的测试是错误的。删除 limit() == 0 测试。这并不表示 EOS,它只是表示零长度读取,这可能在非阻塞模式下随时发生。这并不意味着对等方已经关闭了他的连接端,也不意味着您应该关闭您的端。

其次,关闭通道也会关闭套接字。您应该仅关闭通道,而不是套接字。

第三,关闭通道会取消密钥。您不需要在每次结束后都取消。

您也可能无法在使用之前检查就绪键在选择循环中是否有效,例如用于读取。