[英]Different GCP PubSub dead letter topics for different types of failures
[英]How can I avoid using a schema registry for my Dead Letter Topics?
我有一个 KafkaListener 使用来自 Kafka 的 Avro 消息。 如果处理消费消息的逻辑抛出异常,错误处理程序会将消息发送到 DLT。 我想将该消息作为 JSON 发送并忽略任何架构注册表内容。 我遇到了问题,因为如果我尝试使用 JSON 序列化器,它无法序列化,因为它是 Avro object。
错误处理器
@Bean
public DefaultErrorHandler errorHandler(final KafkaTemplate<String, ?> template) {
DefaultErrorHandler handler =
new DefaultErrorHandler(
new DeadLetterPublishingRecoverer(template), new FixedBackOff(0L, 0L));
handler.addNotRetryableExceptions(
IllegalArgumentException.class, SaveFactFailedException.class);
return handler;
}
生产者配置
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: com.amazonaws.services.schemaregistry.serializers.avro.AWSKafkaAvroSerializer
这是第一个问题。
第二个问题是原始监听器和 DLT 监听器都使用在application.yml
中设置的相同反序列化器。 如何为每个侦听器配置不同的反序列化器?
消费者配置
consumer:
enable-auto-commit: false
group-id: mobile-layout-group
key-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
value-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
properties:
spring.deserializer.key.delegate.class: org.apache.kafka.common.serialization.StringDeserializer
spring.deserializer.value.delegate.class: com.amazonaws.services.schemaregistry.deserializers.avro.AWSKafkaAvroDeserializer
auto-offset-reset: earliest
所以我能够弄清楚。 我所要做的就是创建DeadLetterPublishingRecoverer
的子类并覆盖createProducer()
function。然后我就可以对记录值进行修改。 在我的例子中,我只是将它设为 null,因为我只需要 DLT 的标头。 这篇文章很有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.