I am using Spring Cloud Stream binder Kafka for message processing. As part of my requirement I need to send message to DLQ for only specific user defined exception and not for all RuntimeExceptions.
I followed this link and configured ListenerContainerCustomizer like below but still my code is sending all exceptions to DLQ. Also I tried to skip exception stacktrace in message header, even that is not happening. What am I missing here?
@Bean
public ListenerContainerCustomizer<AbstractMessageListenerContainer<byte[], byte[]>> customizer(DefaultErrorHandler errorHandler) {
return (container, dest, group) -> container.setCommonErrorHandler(errorHandler);
}
@Bean
public DefaultErrorHandler errorHandler(DeadLetterPublishingRecoverer recovered) {
recovered.excludeHeader(DeadLetterPublishingRecoverer.HeaderNames.HeadersToAdd.EX_STACKTRACE);
recovered.addNotRetryableExceptions(UserException.class);
return new DefaultErrorHandler(recovered, new FixedBackOff(0L, 1L));
}
@Bean
public DeadLetterPublishingRecoverer publisher(KafkaTemplate<Object, SpecificRecord> kafkaOperations) {
return new DeadLetterPublishingRecoverer(
kafkaOperations,
(consumerRecord, exception) -> {
return new TopicPartition(dlqTopicName, 0);
}
);
}