首页 文章

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

提问于
浏览
0

我需要从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 回答

  • 1

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

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

    然后调用 receive() 方法 .

    或者您可以在不使用命名空间支持的情况下自己连接 JmsDestinationPollingSource bean .

相关问题