我需要从IBM MQ获取jms消息 . 但是只有在需要时才会获取消息,比如调用方法时 . 拾取的消息需要依次放入另一个队列 . 也就是说,此方案用于在需要时将消息从一个队列复制到另一个队列 .
我怎样才能在Spring Integration中实现这一点 .
我相信我可以使用入站通道适配器创建一个流,设置为定期轮询消息,以及出站通道适配器 . 但有了这个,我无法在需要时选择消息 .
请指教 .
问题更新:
1)在网上搜索实现建议的解决方案时,我踩了JmsDestinationPollingSource的spring文档说 - “这个源只推荐用于非常低的消息量” .
2)由于我们需要高容量环境并且需要本地事务,因此我查看了建议的JmsMessageDrivenEndpoint解决方案,该解决方案看起来像使用MessageDrivenChannelAdapter . 你能告诉我如何继续吗?
3)此外,在这种情况下,我如何检测是否已读取所有消息以停止收听者 . 请指教
问题更新:
我可以在与MessageDrivenChannelAdapter一起使用的DefaultMessageListener容器上调用start和stop .
你还能告诉我当队列中没有消息或者队列为空时我怎么能找到,以便我可以调用stop .
问题更新:
谢谢加里 . 对不起,我迟到了 .
要查找队列何时变空,我们是否可以覆盖DefaultMessageListenerContainer的noMessageReceived方法(继承自AbstractPollingMessageListenerContainer)并在DMLC上调用stop . 这种解决方案在Spring integration inbound-gateway Fire an event when queue is empty中给出 .
我认为这可能更容易实现 . 请告知以这种方式是否正确 .
1 回答
在入站通道适配器上设置
auto-startup="false"
(因此它不会轮询) .获取对其
MessageSource
的引用(通过@Autowire
或以其他方式注入或context.getBean()
) . bean名称为adapterid.source
,类型为JmsDestinationPollingSource
.然后调用
receive()
方法 .或者您可以在不使用命名空间支持的情况下自己连接
JmsDestinationPollingSource
bean .