【发布时间】:2019-04-03 03:59:36
【问题描述】:
我有一个消费者消息的 Kafka 消费者。我在 KafkaListenerContainerFactory 中设置了重试模板。但不知道为什么它两次消费相同的消息。当应用程序通过指定计数调用异常重试模板时,Kafka 也会使用相同计数的相同消息。
@Bean
RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(1000L);
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(3);
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
@Bean("KafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<String, String> KafkaListenerContainerFactory(RetryTemplate retryTemplate) {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setRetryTemplate(retryTemplate);
factory.setRecoveryCallback(context -> {
log.error("Maximum retry policy has been reached");
return null;
});
factory.setConcurrency(Integer.parseInt(kafkaConcurrency));
return factory;
}
消费者
@KafkaListener(topics = "${kafka.topic.json}", containerFactory = "kafkaListenerContainerFactory")
public void recieveSegmentService(String KafkaPayload) throws Exception {
KafkaSegmentTrigger kafkaSegmentTrigger;
kafkaSegmentTrigger = TransformUtil.fromJson(KafkaPayload, KafkaSegmentTrigger.class);
log.info("Trigger recieved from segment service {}", kafkaSegmentTrigger);
try {
processMessage(kafkaSegmentTrigger);
} catch (Exception e) {
retryTemplate.execute(arg0 -> {
processMessage(kafkaSegmentTrigger);
return null;
});
}finally {
}
}
processMessage 正在抛出异常
【问题讨论】:
标签: spring-boot kafka-consumer-api spring-retry