在弹簧集成中需要时选择jms消息

时间:2014-12-17 13:04:26

标签: spring-integration spring-jms

我需要从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 个答案:

答案 0 :(得分:1)

在入站通道适配器上设置auto-startup="false"(因此它不会轮询)。

获取对其MessageSource的引用(通过@Autowire或以其他方式注入或context.getBean())。 bean名称为adapterid.source,类型为JmsDestinationPollingSource

然后调用receive()方法。

或者您可以自己连接JmsDestinationPollingSource bean,而无需使用命名空间支持。