簡體   English   中英

實施自定義的Kafka Consumer

[英]Implement custom Kafka Consumer

我有一個kafka用戶,它接收有關該主題的最新消息。 代碼如下:

topic = my_topic;
KafkaConsumer.subscribe(Collections.singleton(topic));
try {
        while (true) {
            ConsumerRecords<String, String> consumerRecords = KafkaConsumer.poll(10);
            for(ConsumerRecord<String, String> consumerRecord : consumerRecords){
                LOGGER.info("proceess mesage received from kafka topic=" + topic);
                System.out.println(consumerRecord.value());
            }
        }
    }catch (Exception e){
        throw new KafkaException(e.getMessage());
    }

因此,我想擺脫while循環並實現這樣的包裝器:

customConsumer((x) - > {
    System.out.println("I have received " + x + "from kafka topic");
});
//run code 

每次發布消息時,customConsumer方法都會知道新消息,該方法每次都會在kafka主題上進行偵聽。 我嘗試了ExecutorService,但沒有成功。 有什么想法嗎?

不確定我是否完全理解了這個問題,但是這里有:

void customConsumer(java.util.function.Consumer<ConsumerRecord<String, String>> consumer) {
    KafkaConsumer.subscribe(Collections.singleton(topic));
    try {
        while (true) {
            ConsumerRecords<String, String> consumerRecords = KafkaConsumer.poll(10);
            for(ConsumerRecord<String, String> consumerRecord : consumerRecords){
                consumer.accept(consumerRecord);
            }
        }
    } catch (Exception e){
        throw new KafkaException(e.getMessage());
    }
}

然后可以像描述的那樣調用此方法:

customConsumer(x -> {
    System.out.println("I have received " + x + " from kafka topic");
});

僅當需要與消息處理並行執行某項操作或要在多個線程中同時處理消息時,才需要ExecutorService等。 如果是這樣,我建議您使用.mapAsync()查看akka-stream-kafka及其示例。 它們還使您可以輕松地進行操作,例如正確地將偏移量提交回kafka(也可以成批分配,以提高性能),如果在多個線程中處理消息時手動執行偏移操作,則容易出錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM