繁体   English   中英

如何避免为我的死信主题使用模式注册表?

[英]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 的标头。 这篇文章很有帮助。

Spring 云 Stream JSON 带有 Avro 消息的死信队列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM