我写了一个简单的客户端,可以从Kafka主题中读取内容,该主题一直运行良好,直到我意识到consumer.poll会阻塞,并且在主题结束时再也不会返回。
以下是我的代码示例
Observable
.repeatEval(consumer.poll(java.time.Duration.ofMillis(100)))
.timeoutOnSlowUpstreamOn(FiniteDuration(1000, MILLISECONDS), Observable.empty)
.filter(_ ne null)
我期望在1秒钟之内什么都没用时,timeOnSlowUpStreamOn
会将原始来源转换为空的Observable
。但是,由于Scheduler
在到达主题结尾时在consumer.poll
上被阻止,因此timeout
永远不会发生。
查看线程转储,程序停留在以下位置:
at org.apache.kafka.common.network.Selector.select(Selector.java:689)
at org.apache.kafka.common.network.Selector.poll(Selector.java:409)
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:510)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:271)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:242)
我不太在乎这是设计使然还是“ bug”。我只是想知道是否有一种方法可以使consumer.poll
返回(正常方式或通过抛出异常):阻止调度程序是我想在代码中看到的最后一件事。
答案 0 :(得分:0)
我没有意识到KafkaConsumer
不是线程安全的。多个线程同时调用其方法将抛出ConcurrentModificationException
。经过适当的同步后,问题得到解决。