2016-11-23 26 views
0

我有一個Kafka Consumer的基本實現。當它調用按鈕單擊的方法(我們稱之爲V1)時,我可以正確調用方法。Kafka Consumer poll()在while循環中使用時返回空集

但只要我放置while循環內的poll()方法(我們稱之爲V2),我停止接收郵件。

奇怪的是,V1仍然能夠拿起新郵件,但V2仍然會收到一個空ConsumerRecords對象。

我已經確保V1V2在不同ConsumerGroups

這裏,V2包含如下所示的代碼。

而且V1while循環中去除。否則有沒有其他點差異。

有人能告訴我發生了什麼,爲什麼?

代碼轉載如下:

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 
     } 
    } 
} 

更新:

我發現了一些在這裏。它可能不是導致此問題的方法。但封閉的eventHandler。請檢查上面提供的代碼以獲取更新。

我注意到的是,直到控件退出這個方法,GUI中的代碼所做的更改在內部看不到。

所以,我的新問題:如何使一個卡夫卡使用者在由按鈕單擊事件啓動的無限循環中運行?

回答

0

我發現(通過一個非常令人費解搜索)不能有一個事件監聽器內循環,對於現在看來很明顯的原因。

這就是說,我確實發現我可以使用擴展類SwingWorker的類。

所以基本上,我做的是從mouseClicked()方法中刪除所有的代碼,並將其放在我的SwingWorker類的doInBackground()方法中。顯然,這造成了很多錯誤。

要解決這些錯誤,我需要將所需的所有信息從GUI組件傳遞到SwingWorker類。我通過使用參數化構造函數來完成此操作。

之後,我剛剛用適當的值實例化SwingWorker類並執行該對象。 Et Voila!

0

空的結果可能由短超時參數引起,您可以嘗試增加它。

timeout - 如果數據在 在緩衝區中不可用,則等待輪詢的時間(以毫秒爲單位)。

+0

我在'poll()'中使用的超時時間外加了一個超時時間。此外,增加和減少'poll()'使用的超時,範圍從100ms到5000ms。沒有效果。我認爲這與通過事件處理程序的控制流有關。 – GaidinD