Kafka Consumer poll() returns 在 while 循环中使用时为空集

Kafka Consumer poll() returns empty set when used inside while loop

我有一个 Kafka 消费者的基本实现。当它在单击按钮时调用 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 消费者 运行 处于由按钮单击事件启动的无限循环中?

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

timeout - The time, in milliseconds, spent waiting in poll if data is not available in the buffer.

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

也就是说,我确实发现我可以使用 class 来扩展 SwingWorker class.

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

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

来做到这一点

之后,我只是用适当的值实例化了 SwingWorker class 并执行了对象。 瞧瞧!