簡體   English   中英

DefaultErrorHandler 不可配置 如果@RetryableTopic 用於重試和 DLT 處理程序

[英]DefaultErrorHandler is not configurable If @RetryableTopic used for retry and DLT handler

Spring Boot 版本:2.7.6 Spring kafka 版本:2.8.11

問題:

我試圖在代碼中處理反序列化問題。 為了在代碼中處理此類問題,我通過擴展創建了自己的類

DefaultErrorHandler

並覆蓋public void handleOtherException(Exception thrownException, Consumer<?, ?> consumer, MessageListenerContainer container, boolean batchListener) {}示例代碼如下

public class CustomDefaultErrorHandler extends DefaultErrorHandler {

    private static Logger log = LoggerFactory.getLogger(CustomDefaultErrorHandler.class);
    @Override
    public void handleOtherException(Exception thrownException, Consumer<?, ?> consumer, MessageListenerContainer container, boolean batchListener) {
        manageException(thrownException, consumer);
    }

    private void manageException(Exception ex, Consumer<?, ?> consumer) {
        log.error("Error polling message: " + ex.getMessage());
        if (ex instanceof RecordDeserializationException) {
            RecordDeserializationException rde = (RecordDeserializationException) ex;
            consumer.seek(rde.topicPartition(), rde.offset() + 1L);
            consumer.commitSync();
        } else {
            log.error("Exception not handled");
        }
    }
}

如果我將@RetryableTopic 與@KafkaListener 一起使用

@RetryableTopic(listenerContainerFactory = "kafkaListenerContainerFactory", backoff = @Backoff(delay = 8000, multiplier = 2.0),
        dltStrategy = DltStrategy.FAIL_ON_ERROR
        , traversingCauses = "true", autoCreateTopics = "true", numPartitions = "3", replicationFactor = "3",
        fixedDelayTopicStrategy = FixedDelayStrategy.MULTIPLE_TOPICS, include = {RetriableException.class, RecoverableDataAccessException.class,
        SQLTransientException.class, CallNotPermittedException.class}
)
@KafkaListener(topics = "${topic.name}", groupId = "order", containerFactory = "kafkaListenerContainerFactory", id = "OTR")
public void consumeOTRMessages(ConsumerRecord<String, PayloadsVO> payload, @Header(KafkaHeaders.RECEIVED_TOPIC) String topicName) throws JsonProcessingException {
    logger.info("Payload :{}", payload.value());
    payloadsService.savePayload(payload.value(), pegasusTopicName);

}

我在調試代碼時看到,@RetryableTopic 在中有自己的 DefaultErrorHandler 配置

ListenerContainerFactoryConfigurer

它會停止我的自定義處理程序,反序列化過程不會在問題上停止。

你能提出任何建議嗎,因為我想在我的代碼中使用注釋進行重試過程

我嘗試配置自己的實現

DefaultErrorHandler

通過擴展它並配置在

ConcurrentKafkaListenerContainerFactory

它非常復雜,但您應該能夠覆蓋RetryTopicComponentFactory bean 並覆蓋listenerContainerFactoryConfigurer()以返回您的自定義錯誤處理程序。

也就是說,反序列化異常無論如何都會直接進入 DLT。

順便說一句,在這里調用commitSync()是沒有價值的,因為poll()沒有返回任何記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM