我需要暂停Kafka使用者从主题中获取消息,直到消息到达其等待时间为止。为此,我在Kafka中使用了暂停/恢复方法。但是当我恢复时,暂停前消耗的第一条消息将不会再收到。但是,由于我进行了手动确认,因此该主题的偏移量尚未更新(滞后为1)。
@StreamListener(ChannelName.MESSAGE_INPUT_RETRY_CHANNEL)
public void onMessageRetryReceive(org.springframework.messaging.Message<Message> message, @Header(KafkaHeaders.CONSUMER)KafkaConsumer<?,?> consumer){
long waitTime = //Calculate the wait time of the message
Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);
if(waitTime > 0){
consumer.pause(Collections.singleton(new TopicPartition("message-retry-topic",0)));
}else{
messageProducer.sendMessage(message.getPayload());
acknowledgment.acknowledge();
}
}
@Bean
public ApplicationListener<ListenerContainerIdleEvent> idleListener() {
return event -> {
boolean isReady = //Logi to check if ready to resume
if(isReady){
event.getConsumer().resume(event.getConsumer().paused());
}
};
}
这与KafkaConsumer resume partition cannot continue to receive uncommitted messages中提到的问题有关。但是我不确定seeks方法如何有助于检索第一个消耗的消息。我正在使用春季云流。我需要一些建议
答案 0 :(得分:1)
您没有调用acknowledgment.acknowledge();
的事实,并不意味着您的KafkaConsumer
实例没有将最后消耗的位置保留在内存中。
我们肯定需要为分区上的后续使用者提交偏移量。当前运行的消费者不需要提交此类信息,因为它处于自己的内存状态。
要重新使用同一记录,您需要执行seek()
操作。
有关更多信息,请参阅文档:https://docs.spring.io/spring-kafka/docs/current/reference/html/#seek