【问题标题】:Kafka Consumer poll() returns empty set when used inside while loopKafka Consumer poll() 在 while 循环中使用时返回空集
【发布时间】:2016-11-24 00:44:02
【问题描述】:

我有一个 Kafka Consumer 的基本实现。当它在按钮单击时调用 poll() 方法时,我让它正常工作(我们称之为 V1)。

但是,只要我将 poll() 方法放入 while 循环(我们称之为 V2),我就会停止接收消息。

奇怪的是 V1 仍然能够接收到新消息,但 V2 仍然收到一个空的 ConsumerRecords 对象。

我已确定 V1V2 位于不同的 ConsumerGroups

这里,V2包含如下代码。

并且 V1 删除了 while 循环。否则没有其他区别。

谁能告诉我发生了什么以及为什么?

代码转载如下:

btnButton.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent arg0){
         while(true) {
             ConsumerRecords<String, String> records = consumerGroupObj.consumerObj.poll(100);

             // Trying to insert into DefaultTableModel here for an existing jTable

             // Some other processing code
         }
    }
}

更新:

我在这里注意到了一些东西。这可能不是导致此问题的 poll() 方法。但封闭的eventHandler。请检查上面提供的代码以获取更新。

我注意到的是,在控件退出此 mouseClicked() 方法之前,内部代码所做的更改在 GUI 中是不可见的。

那么,我的新问题是:如何让 Kafka 消费者在由按钮单击事件启动的无限循环中运行?

【问题讨论】:

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


    【解决方案1】:

    超时参数太短可能导致空结果,你可以尝试增加它。

    timeout - 如果有数据,则等待轮询所花费的时间(以毫秒为单位) 在缓冲区中不可用。

    【讨论】:

    • 我在poll() 中使用的超时之外添加了我自己的超时。另外,增加和减少poll()使用的超时时间,范围从100ms到5000ms。没有效果。我确实认为这与通过事件处理程序的控制流有关。
    【解决方案2】:

    我发现(通过非常复杂的搜索)不能在事件侦听器内有一个循环,原因现在看起来很明显。

    话虽如此,我确实发现我可以使用扩展 SwingWorker 类的类。

    所以基本上,我所做的就是从mouseClicked() 方法中删除所有代码,并将其放入我的SwingWorker 类的doInBackground() 方法中。显然,这造成了很多错误。

    为了解决这些错误,我需要将我需要的所有信息从 GUI 组件传递给 SwingWorker 类。我通过使用参数化构造函数来做到这一点。

    之后,我只是用正确的值实例化了SwingWorker 类并执行了该对象。 瞧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-07
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2011-08-09
      • 1970-01-01
      相关资源
      最近更新 更多