我为带有Json有效负载的AMQP入站消息编写了一个简单的流程,类似于
IntegrationFlows
.from(Amqp.inboundGateway(connectionFactory, new Queue("qin"))
.errorChannel(Amqp.channel("dlx", connectionFactory))
)
.handle(new MessageTransformingHandler(m -> {
Object result = null;
try {
result = (...)
} catch (Exception e) {
throw new MessageTransformationException(m, e.getMessage());
}
(...)
}))
.transform(Transformers.toJson(...))
.handle(Amqp.outboundAdapter(new RabbitTemplate(connectionFactory))
.routingKey("qout"))
.get();
}
这完全可以,除了,当出现错误时!就像现在一样,我确实在DLX中得到了错误,但是在 content_type:application / x-java-serialized-object 中,它必须是 application / json 。
我可以通过让错误通道指定2个转换器
来做到这一点 .amqpMessageConverter(...)
.messageConverter(...)
但问题是我必须自己实现这并不容易,因为我必须处理将消息转换为ampqmessages,加上业务对象,插入错误对象和文本等等......
所以我在想,如果我在错误通道前面没有适配器,至少要处理message-> amqpmessage转换(希望有效载荷)。
我也尝试过使用errorHandler而不是errorChannel,但问题是一样的。
任何消化?
提前致谢。
EDITED
非常感谢你的回复。但是我正在努力。经过多次尝试和错误后,我终于认为我理解了解决方案(使用“中间”通道,以便我可以在将其发送给Amqp之前处理该消息?)但我仍然无法使其工作。我现在有
.errorChannel(MessageChannels.direct("amqpErrorChannel").get())
和听取该频道的流程
@Bean
public IntegrationFlow errorFlow() {
return IntegrationFlows.from("amqpErrorChannel")
.handle(new MessageTransformingHandler(m ->(...)
但我仍有错误
MessageDeliveryException:Dispatcher没有频道订阅者 'amqpErrorChannel'。
指出我做错了什么?
干杯。
答案 0 :(得分:1)
是的,您可以在.transform()
前面放置(Amqp.channel("dlx", connectionFactory)
或任何其他适配器。实际上.errorChannel()
只是一个向错误处理流程发送错误的钩子。因此,您可以在那里使用任何简单的Spring Integration通道(而不是AMQP通道)并构建任何复杂的错误处理逻辑。
正确,在该流程结束时,您可以向AMQP dlx
发送结果消息(经过一堆转换,丰富等),但为此目的,简单的单向{{1}就够了。
说实话,Amqp.outboundAdapter()
是双向的,如果你有订阅者,那真的会更好。但是你的情况是单向的,所以你应该在那里使用Amqp.channel()
。