Spring Cloud Stream Kafka错误频道

时间:2018-03-09 12:11:12

标签: java spring spring-cloud-stream spring-kafka

我正在尝试设置绑定以将来自Spring Integration errorChannel的Kafka消息转发到自定义通道(用于集中式错误处理)。

错误消息正在发送到已配置的通道,但它们以GenericMessage的形式到达,带有byte []有效负载,其中包含异常详细信息和失败的消息。

我的配置:

spring:
  cloud:
    stream:
      kafka:
        bindings:
          accountOut.producer:
            sync: true
        binder:
          autoCreateTopics: false
          headers:
               - spanId
               - spanTraceId
               - spanSampled
               - spanParentSpanId
               - spanName
               - spanFlags
               - eventType
               - Authorization
      bindings:
        error:
          destination: test-error
        accountOut:
          producer.partitionKeyExpression: payload.key
          content-type: application/json
          destination: account
  kafka:
    producer.keySerializer: org.apache.kafka.common.serialization.StringSerializer
    consumer.valueDeserializer: org.apache.kafka.common.serialization.StringDeserializer

我正在用@StreamListener(target = "kieran-error")听 以及使用@Input("kieran-error") SubscribableChannel

配置的消费者

正在阅读the docs,我希望该邮件能够以及ErrorMessage到达。有没有办法可以实现这个目标?或者将有效负载配置为以对象形式到达?

我使用的版本:

  • Spring Boot 1.5.8
  • Spring Cloud Edgware
  • Kafka 11客户
  • Spring Integration core 4.3.12

---问题更新---

我现在意识到我可以通过聆听errorChannel来配置Spring Integration转发到Kafka主题,例如

@Bean
@ServiceActivator(inputChannel = "errorChannel")
public MessageHandler handler() throws Exception {
    KafkaProducerMessageHandler<String, String> handler =
            new KafkaProducerMessageHandler<>(kafkaTemplate());
    handler.setTopicExpression(new LiteralExpression("someTopic"));
    handler.setMessageKeyExpression(new LiteralExpression("someKey"));
    return handler;
}

但是可以在属性yaml而不是代码中配置此流吗?所有其他Kafka配置在代码中配置kafka模板的地方并不理想。

另一个选择是显式监听ErrorMessage并发送到代码中的kafka输出通道:

@ServiceActivator(inputChannel = "errorChannel")
public void handle(ErrorMessage em) {
    outputChannel.kieranError().send(...)
}

1 个答案:

答案 0 :(得分:1)

你到底在哪里消费这样的消息?

当消费者enableDlq为真时,您描述的消息听起来像是发送到DLQ主题的消息;你没有显示任何消费者配置,所以我很难猜到。

发送到目标特定错误频道的ErrorMessage(并桥接到全局errorChannel可以使用

@ServiceActivator(inputChannel = "errorChannel")
public void handle(ErrorMessage em) {
    ...
}

error:
  destination:

是遗留的,用于将用户代码发送到errorChannel的用户代码。