Spring集成将Adapter设置为错误通道

时间:2016-06-20 14:02:57

标签: spring-integration

我为带有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'。

指出我做错了什么?

干杯。

1 个答案:

答案 0 :(得分:1)

是的,您可以在.transform()前面放置(Amqp.channel("dlx", connectionFactory)或任何其他适配器。实际上.errorChannel()只是一个向错误处理流程发送错误的钩子。因此,您可以在那里使用任何简单的Spring Integration通道(而不是AMQP通道)并构建任何复杂的错误处理逻辑。

正确,在该流程结束时,您可以向AMQP dlx发送结果消息(经过一堆转换,丰富等),但为此目的,简单的单向{{1}就够了。

说实话,Amqp.outboundAdapter()是双向的,如果你有订阅者,那真的会更好。但是你的情况是单向的,所以你应该在那里使用Amqp.channel()