当主题结束时,kafka`consumer.poll`被卡住

时间:2019-06-19 15:46:50

标签: apache-kafka observable kafka-consumer-api

我写了一个简单的客户端,可以从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返回(正常方式或通过抛出异常):阻止调度程序是我想在代码中看到的最后一件事。

1 个答案:

答案 0 :(得分:0)

我没有意识到KafkaConsumer不是线程安全的。多个线程同时调用其方法将抛出ConcurrentModificationException。经过适当的同步后,问题得到解决。