kafka consumer poll()在while循环中使用时返回空集

lp0sw83n  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(344)

我有一个Kafka消费者的基本实现。我有它正常工作时,它是调用 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() 导致此问题的方法。但是封闭的事件处理程序。请检查以上提供的代码以获取更新。
我注意到的是,在控件退出之前 mouseClicked() 方法时,内部代码所做的更改在gui中不可见。
那么,我的新问题是:如何让kafka消费者在一个由按钮点击事件启动的无限循环中运行?

jtoj6r0c

jtoj6r0c1#

我发现(通过一个非常复杂的搜索)在事件侦听器中不能有循环,原因现在看来非常明显。
也就是说,我发现我可以使用一个类来扩展 SwingWorker 班级。
所以基本上,我所做的就是从 mouseClicked() 方法并将其放入 doInBackground() 我的方法 SwingWorker 班级。显然,这造成了很多错误。
为了解决这些错误,我需要将gui组件中需要的所有信息传递给 SwingWorker 班级。我是通过使用参数化的构造函数来实现的。
在那之后,我只是示例化 SwingWorker 用适当的值初始化并执行对象。瞧!

gdx19jrr

gdx19jrr2#

空结果可能是由短超时参数引起的,您可以尝试增加它。
超时—如果缓冲区中没有数据,则等待轮询所用的时间(以毫秒为单位)。

相关问题