如何获得KafkaListener消费者

时间:2019-06-13 15:48:25

标签: spring spring-kafka

我将spring-kafka用于springboot 2.0.4.RELEASE。

并使用KafkaListener获取消息

现在我想为我的组重置偏移量

但是我不知道如何吸引该群体的消费者

    @KafkaListener(id="test",topics={"test"},groupId="group",containerFactory="batchContainerFactory")
    public String listenTopic33(List<ConsumerRecord<Integer, String>> record, Acknowledgment ack){
// do something

    }


    @Autowired
    KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;

    public void test() {

        MessageListenerContainer test3 = kafkaListenerEndpointRegistry.getListenerContainer("test3");
}

1 个答案:

答案 0 :(得分:0)

如果要在侦听器本身中寻找使用者,只需在侦听器方法中添加一个awk -F'[|]' '$8=="U"{print|"tee -a log1 >&2"; next} 1' file 参数即可。

请记住,该容器可能已提取了更多消息,因此您将在搜索生效之前获取它们。您可以设置Consumer<?, ?> consumer来避免这种情况。

您还可以向容器中添加自定义max.poll.records=1,在侦听器中引发异常,错误处理程序将获取其余记录而不是侦听器。

另请参阅Seeking to a Specific Offset

  

为了进行搜索,您的侦听器必须实现ConsumerSeekAware,它具有以下方法:

RemainingRecordsErrorHandler
  

启动容器时调用第一个方法。在初始化后的任意时间搜索时,应使用此回调。您应该保存对回调的引用。如果在多个容器(或ConcurrentMessageListenerContainer)中使用相同的侦听器,则应将回调存储在ThreadLocal或由侦听器线程作为键的其他结构中。

     

使用组管理时,分配更改时将调用第二种方法。您可以使用此方法,例如,通过调用回调来设置分区的初始偏移量。您必须使用回调参数,而不是传递给registerSeekCallback的参数。如果您自己明确分配分区,则永远不会调用此方法。在这种情况下,请使用TopicPartitionInitialOffset。

     

回调具有以下方法:

void registerSeekCallback(ConsumerSeekCallback callback);

void onPartitionsAssigned(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback);

void onIdleContainer(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback);
  

当检测到空闲容器时,您还可以从onIdleContainer()执行查找操作。有关如何启用空闲容器检测的信息,请参阅检测空闲和无响应的使用者。

     

要在运行时任意查找,请使用registerSeekCallback中的回调引用作为适当的线程。

这是一个例子;我们会跟踪每个主题/分区的回调...

void seek(String topic, int partition, long offset);

void seekToBeginning(String topic, int partition);

void seekToEnd(String topic, int partition);