我想知道如何在AckMode
設置爲MANUAL
在spring kafka中時提交如何工作。我如何知道我的記錄是否使用Spring Kafka手動提交
以下是我在KafkaConfig
中設置的屬性 containerProperties.setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL);
的listener
代碼
@KafkaListener(id="POC", topics = "TestTopic", group = "TestGroup")
public void listen(ConsumerRecord<String,KafkaPayload> record, Acknowledgment acknowledgment) {
countDownLatch.countDown();
acknowledgment.acknowledge();
}
我做acknowledgement
按春卡夫卡的文件,但這只是意味着我的郵件標記爲發送但不消耗(這是我的理解) 。
在這種情況下,我應該叫
commitSync()
方法。 如果是,我從哪裏調用它,因爲我需要獲得對KafkaConsumer
的引用。 如果否,它如何在內部工作,我可以跟蹤它嗎?是否有
commitId
或返回的某個值? 我的想法是知道某個特定的消費者記錄是否被消費。 我想存儲用於內部跟蹤目的的值。- 是否卡夫卡內部維護像消費者記錄(已確認,致力於,沒有犯),它可以幫助進行分類的任何狀態。
這將幫助我區分有多少記錄被消耗以及有多少記錄正在進行以及它們的狀態。
感謝Artem的詳細回覆。 所以,我從上面的答案中瞭解到,當我們調用'acknowledgement.acknowledge()'時,'consumer.commitSync()'發生在另一個線程上。 因此,確保提交正在發生。 'commitAsync()'也是同樣的行爲嗎? 我希望它'AckMode.MANUAL'相同,因爲我沒有使用'MANUAL_IMMEDIATE' – user1564626
是的,的確如此。任何「消費者」操作都發生在同一個線程上。 'MANUAL_IMMEDIATE'不同於'MANUAL',只能通過直接調用'consumer.wakeup()'來打破當前的民意調查。 –