[英]spring-kafka: DeadLetterPublishingRecoverer vs RetryTopicConfiguration
[英]spring-kafka: DefaultErrorHandler with DeadLetterPublishingRecoverer(BiFunction) not considered. No DL topic created
在我的 Spring 使用spring-kafka
啟動應用程序中,我試圖用兩件事配置錯誤處理程序:-
FixedBackOff
)使用
// Version highlights
id 'org.springframework.boot' version '2.7.2'
...
implementation 'org.springframework.kafka:spring-kafka' // 2.8.8
這是我使用的代碼,基於我在 Spring 文檔中閱讀的內容,並在幾篇在線文章中重申:
@Bean
public DefaultErrorHandler byteArrayDefaultErrorHandler(KafkaTemplate<String, byte[]> template) {
var recoverer =
new DeadLetterPublishingRecoverer(
template,
(record, e) -> new TopicPartition("%s.deadLetter".formatted(record.topic()), 0);
);
return new DefaultErrorHandler(recoverer, new FixedBackOff(3000, 3));
}
但是上面的bean沒有被考慮/使用。 所以,當消費遇到失敗(目前是通過拋出異常來模擬失敗),
FixedBackOff
,但使用默認的背靠背嘗試 10 次。目前,消費者配置 class 有最少的東西:
@Bean public ConsumerFactory<String, byte[]> byteArrayConsumerFactory() { ... }
@Bean public ConcurrentKafkaListenerContainerFactory<String, byte[]> byteArrayListenerContainerFactory() { .. }
@Bean public DefaultErrorHandler byteArrayDefaultErrorHandler(KafkaTemplate<String, byte[]> template) { ...code pasted above... }
監聽器如下:
@KafkaListener(
topics = "${app.config.kafka.topic}",
containerFactory = "byteArrayListenerContainerFactory"
)
public void consumeMessage(ConsumerRecord<String, byte[]> record) { ... }
我不知道我錯過了什么或添加了一些與接線沖突的東西。 高度贊賞幫助弄清楚。
如果您使用的是 Boot 的自動配置容器工廠,錯誤處理程序 bean 將僅通過 boot 連接。
由於您正在創建自己的容器工廠 bean...
@Bean public ConcurrentKafkaListenerContainerFactory<String, byte[]> byteArrayListenerContainerFactory() { .. }
...您必須自己添加錯誤處理程序 - 請參閱setCommonErrorHandler()
。
框架不會自動提供死信主題; 添加一個@Bean NewTopic dlt() {... }
。
https://docs.spring.io/spring-kafka/docs/current/reference/html/#configuring-topics
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.