我需要从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。
我认为这可能更容易实现。请告知以这种方式是否正确。
答案 0 :(得分:1)
在入站通道适配器上设置auto-startup="false"
(因此它不会轮询)。
获取对其MessageSource
的引用(通过@Autowire
或以其他方式注入或context.getBean()
)。 bean名称为adapterid.source
,类型为JmsDestinationPollingSource
。
然后调用receive()
方法。
或者您可以自己连接JmsDestinationPollingSource
bean,而无需使用命名空间支持。