我想在Wildfly 10中使用JMS 2.0創建臨時JMS隊列,並且注入連接工廠。如何在JEE服務器(Wildfly)的JMS臨時隊列中創建監聽器?
我使用@JMSConnectionFactory注入我的ConnectionFactory。這工作正常。
@Inject @JMSConnectionFactory("java:/jms/RemoteConnectionFactory") JMSContext jmsContext
創建一個臨時隊列也能正常工作:
Destination jmsQueue = jmsContext.createTemporaryQueue();
創建出版商和出版信息工作好,以及:
JMSProducer producer = jmsContext.createProducer();
TextMessage msg = jmsContext.createTextMessage(Long.toString(new Date().getTime()));
producer.send(jmsQueue, msg);
但是,我怎麼創建了一個監聽器隊列?由於臨時隊列未預定義,因此無法使用MDB。如果我嘗試創建一個消費者,並分配一個消息監聽器給它,我收到以下錯誤信息:
JMSConsumer consumer = jmsContext.createConsumer(jmsQueue);
consumer.setMessageListener(new MessageListener() {
...
...
});
錯誤跟蹤:
Caused by: javax.jms.IllegalStateException: This method is not applicable inside the application server. See the J2EE spec, e.g. J2EE1.4 Section 6.6
at org.apache.activemq.artemis.ra.ActiveMQRASession.checkStrict(ActiveMQRASession.java:1452)
at org.apache.activemq.artemis.ra.ActiveMQRAMessageConsumer.setMessageListener(ActiveMQRAMessageConsumer.java:123)
at org.apache.activemq.artemis.jms.client.ActiveMQJMSConsumer.setMessageListener(ActiveMQJMSConsumer.java:59)
這樣看來,我不能明確地設定一個消息聽衆與JEE控制連接工廠。但考慮到它是一個臨時隊列,我無法創建一個MDB,因爲在編譯時不知道目的地。那麼,我如何收聽臨時隊列呢?
謝謝 - 我也試過,但仍然得到相同的異常拋出。不特別感到驚訝,因爲客戶端仍在使用相同的ActiveMARASession,無論它使用的是JMS2還是JMS1 facade。我無法想象這是沒有合理的解決方案。 –
爲什麼你需要一個臨時隊列呢?如果您希望容器爲部署的整個生命週期提供mdb實例,那麼這也需要隊列存在,否則它們將附加到什麼位置? –
@willt我需要有一個發佈/訂閱隊列,這對我的集羣中的每個節點都是唯一的。隊列必須在運行時的生命週期內存活;它不需要堅持重新啓動。另外我不想手動管理這些隊列。因此,有一個臨時隊列的想法......但是如果沒有辦法聽到它,那麼jee中的臨時隊列的目的是什麼? –