Spring Cloud DataFlow Rabbit来源:如何拦截和丰富Source中的消息

时间:2016-11-23 10:20:18

标签: spring-cloud-dataflow

我已经成功地使用一个简单的流程来评估Spring Cloud DataFlow:source |处理器|下沉。

对于部署,将有多个源提供给此管道,我可以使用数据流标签。一切都很好。

每个源都是一个不同的rabbitmq实例,因为处理器需要知道消息来自哪里(因为它必须回调源系统以获取更多信息),我想到的策略是丰富每个带有关于源系统的标题详细信息的消息,然后透明地传递给处理器。

现在,我精通Spring,Spring Boot和Spring Integration,但我无法了解如何在数据流组件中丰富每条消息。

源组件绑定到org.springframework.cloud.stream.app.rabbit.source.RabbitSourceConfiguration。源使用默认的Source.OUTPUT通道。如何获取源中的每条消息以丰富它?

我的处理器组件使用一些Spring Integration DSL来完成它需要做的一些事情,但是根据定义,这个处理器组件同时具有INPUT和OUTPUT通道。使用RabbitSourceConfiguration源不是这样。

那么,这可以吗?

2 个答案:

答案 0 :(得分:0)

我认为您需要在RabbitSourceConfiguration中的MessageListener上使用自定义MessageListenerContainer

RabbitSourceConfiguration中,您可以在ChannelAwareMessageListener上设置自定义MessagingMessageListenerAdapter(您也可以从MessageListenerContainer延伸)。 / p>

答案 1 :(得分:0)

最终有用的是将org.springframework.cloud.stream.app.rabbit.source.RabbitSourceConfiguration子类化为:

  • 覆盖公共SimpleMessageListenerContainer容器(),以便在调用super.container()之前插入自定义运行状况检查。我的业务逻辑丰富了每条消息(参见下一篇文章),详细说明了消息的来源(注意,这是消息的发布者,而不是兔子队列)。需要进行运行状况检查以验证其他丰富信息(通过配置提供),以确保消息不会从队列中消耗并使用错误信息进行丰富。如果验证失败,则源组件无法启动,因此不会消耗任何消息。

  • 覆盖AmqpInboundChannelAdapter bean的创建,以便可以在适配器上设置DefaultAmqpHeaderMapper的自定义子类。此自定义映射器在公共Map toHeadersFromRequest(最终MessageProperties源)中添加了丰富的标头。

对我来说,流/数据流无法拦截和修改Source组件中的消息是有问题的。我真的不应该以我的方式摆弄底层的消息代理API。我应该可以用例如Spring集成。实际上,我可以注册一个全局消息拦截器,但我无法更改消息的标题。

这种能力会在我的WIBNI(如果不是很好的话)列表上发生。也许我会提出这个请求。