我有一个Kafka Consumer的基本实现。当按钮点击时调用 poll()
方法时,我可以正常工作(让我们称之为 V1 )。
但是,只要我将 poll()
方法置于 while
循环中(让我们称之为 V2 ),我停止接收消息。
奇怪的是 V1 仍然能够接收新消息,但 V2 仍然会收到空的ConsumerRecords
对象。
我确保 V1 和 V2 位于不同的 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消费者在按钮点击事件启动的无限循环中运行?
答案 0 :(得分:0)
空结果可能由短暂的超时参数引起,您可以尝试增加它。
timeout - 数据所在的轮询等待时间(以毫秒为单位) 缓冲区中没有。
答案 1 :(得分:0)
我发现(通过一个非常复杂的搜索)你不能在事件监听器中有一个循环,原因现在看来非常明显。
话虽如此,我确实发现我可以使用扩展SwingWorker
类的类。
基本上,我所做的就是删除mouseClicked()
方法中的所有代码,并将其放在doInBackground()
类的SwingWorker
方法中。显然,这造成了很多错误。
要解决这些错误,我需要将所需的所有信息从GUI组件传递到SwingWorker
类。我是通过使用参数化构造函数来完成的。
之后,我只使用正确的值实例化SwingWorker
类并执行该对象。 Et Voila!