【发布时间】:2017-08-21 07:09:00
【问题描述】:
我正在尝试处理一个有两个或多个消费者的案例,他们正在收听一个只包含一个分区的常见主题。我正在暂停其中一个消费者,在此期间,其他未暂停的消费者应该能够从主题中获取消息。 我观察到,只有当暂停的消费者恢复时,其他活动消费者之一才能接收消息。 我怎样才能通过spring kakfka实现这一点。我正在使用 Spring kafka 2.0.0.M2。
下面是我的代码行
public class listener{
@KafkaListener(id = "id2", topics = "abcd", group = "group1", containerFactory = "kafkaListenerContainerFactory")
public void listenPartition1(String data, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions, @Header(KafkaHeaders.OFFSET) Long offsets, Acknowledgment acknowledgment, Consumer consumer) throws InterruptedException {
count_consumer2 = count_consumer2 + 1;
if(count_consumer2 == 10) {
consumer.pause(consumer.assignment());
}
acknowledgment.acknowledge();
}
@KafkaListener(id = "id1", topics = "abcd", group = "group1", containerFactory = "kafkaListenerContainerFactory")
public void listenPartition1(String data, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions, @Header(KafkaHeaders.OFFSET) Long offsets, Acknowledgment acknowledgment, Consumer consumer) throws InterruptedException {
count_consumer1 = count_consumer1 + 1;
if(count_consumer1 == 5) {
consumer.pause(consumer.assignment());
while(data.database <10){
consumer.resume(consumer.assignment());
}
}
acknowledgment.acknowledge();
}
}
【问题讨论】:
-
使用 pause,实际上是在暂停多个分区。当一个分区暂停时,在它再次恢复之前,不会从中消耗任何记录。见kafka.apache.org/0110/javadoc/org/apache/kafka/clients/consumer/…
-
在你的情况下,你需要做的是关闭一个消费者,然后另一个消费者会自动处理分区。
-
@amethystic 你知道我如何实现消费者关闭。我正在使用 consumer.close() 但它抛出了一个错误。谢谢
-
什么错误? Close() 应该可以工作。
标签: apache-kafka kafka-consumer-api spring-kafka