2017-04-26 142 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