2017-04-10 31 views
0

Kafka API 0.10.1:LinkKafkaProducer onCompletion()回調是否總是在同一個線程中執行?

有沒有保證onCompletion回調在同一個線程中被順序調用?該文檔說「請注意,回調通常會在生產者的I/O線程中執行」。所以我會認爲不。

如果我想跟蹤保持一個整數計數器發生的異常數量,是否需要使用AtomicInteger?

或者,如果我想保留一個布爾標誌來跟蹤是否在最後一次回調中發生異常,我是否需要使其變爲volatile?

回答

0

有沒有保證onCompletion回調在同一個線程中被順序調用?該文檔說「請注意,回調通常會在生產者的I/O線程中執行」。所以我會認爲不。

總體上沒有。例如,默認情況下,並行請求中有多個請求 - 它也取決於您的重試次數(默認值不是重試次數)。

如果我想跟蹤,例如,通過保持一個整數計數器發生的異常的數量,我是否需要使用AtomicInteger?

只有一個線程寫入。所以嚴格沒有。閱讀線程可能會「錯過」更新,但稍後您將閱讀此更新。

或者如果我想保留一個布爾標誌來跟蹤是否在上次回調中發生異常,我是否需要使其變爲volatile?

可能會有幫助。

此外:您可以在回調的主線程中「阻止並等待」。

有關詳細信息,請參閱 http://docs.confluent.io/current/clients/producer.html#synchronous-writes

+0

所以你說什麼是我應該刪除回調,而是做的Future.get()? – rents

+0

如果你想獲得同步處理,是的。它當然會帶來性能上的衝擊。 –

+0

對,這應該是一個評論,沒有答案。我沒有尋找替代方案,只是想檢查是否應該保持變量的原子性/易失性。 – rents

相關問題