我已经成功地使用一个简单的流程来评估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源不是这样。
那么,这可以吗?
答案 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(如果不是很好的话)列表上发生。也许我会提出这个请求。