2017-04-26 84 views
2

当我使用WebSphere MQ如何设置WMQ_MQMD_READ_ENABLED和我创建了一个JMS监听器通过注释阅读收到的消息:配置Spring的JMS的监听

@JmsListener(目的地= “$ {} queues.input”, ContainerFactory通过=“listenerFactory”)

传入消息具有称为会计令牌集MQMD字段和我想读取它。从阅读IBM doc,我需要设置目标的WMQ_MQMD_READ_ENABLED属性为true。但是我配置JmsListener的方式只是注释中的一个String名称。我如何设置这个属性?

+0

我使用IBM MQ,但与Spring并无太大关系。我发现这个帖子可能有帮助,但它没有使用JmsListener。 http://forum.spring.io/forum/spring-projects/integration/jms/97168-how-to-set-wmqconstants-wmq-mqmd-read-enabled-in-spring – JoshMc

+0

@JoshMc感谢您的链接。是的,我也读过那个。我只需要抓住队列对象来设置字段。我只是不知道在春天如何。也许这是不可能通过注释。 – sarahTheButterFly

回答

2

为目的地添加适当配置的@Bean(要求设置属性的MQQueue)。

然后将DefaultJmsListenerContainerFactory配置为在其destinationResolver属性中使用BeanFactoryDestinationResolver

解析器也应该是@Bean,所以它得到了对bean工厂的引用。

然后,${queues.input}应解析为队列的bean名称,并且侦听器容器将使用该目标而不是默认的目标解析器,该解析器会创建一个来自Session的目标。

编辑

只是为了澄清...

注释的destination属性实际上是得到解决使用配置DestinationResolver一个Destination对象目的地名称。

默认解析器(DynamicDestinationResolver)只是简单地调用session.createQueue()session.createTopic() - 因此您可以获取JMS提供程序的客户端库为您提供的任何默认目标位置。

使用BeanFactoryDestinationResolver我们将目标名称解析为应用程序上下文中的bean,该应用程序上下文可以是为您的提供程序库定制的完全配置的目标对象。因此,您只需将DMLC配置为使用BF解析器,或者直接(如您尝试)或通过容器工厂 - 用于为每个找到的@JmsListener创建一个DMLC,并将解析器传递给每个解析器。所以目标名称解析为完全配置的Destination实例。

+0

谢谢。有用!我也通过配置DefaultJmsListenerContainer而不是JmsListenerContainerFactory来实现它。但我更喜欢你的解决方案。你介意给出关于幕后发生的更详细的解释吗? – sarahTheButterFly

+0

我编辑了答案并做了一些澄清;希望有所帮助。 –

+0

感谢您的编辑。稍后我会加注并接受您的答案(由于某些原因,这些功能在工作中不起作用)。 – sarahTheButterFly