我正在尝试设置绑定以将来自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
到达。有没有办法可以实现这个目标?或者将有效负载配置为以对象形式到达?
我使用的版本:
---问题更新---
我现在意识到我可以通过聆听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(...)
}
答案 0 :(得分:1)
你到底在哪里消费这样的消息?
当消费者enableDlq
为真时,您描述的消息听起来像是发送到DLQ主题的消息;你没有显示任何消费者配置,所以我很难猜到。
发送到目标特定错误频道的ErrorMessage
(并桥接到全局errorChannel
可以使用
@ServiceActivator(inputChannel = "errorChannel")
public void handle(ErrorMessage em) {
...
}
error:
destination:
是遗留的,用于将用户代码发送到errorChannel
的用户代码。