2017-10-06 48 views
1

我想在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,因爲在編譯時不知道目的地。那麼,我如何收聽臨時隊列呢?

回答

1

我只能通過使用JMS 1.0來解決這個問題。我有代碼是這樣的:

TopicConnectionFactory topicConnectionFactory; 
Topic topic; 
TopicConnection topicConnection; 

try { 
    InitialContext context = new InitialContext(); 
    topicConnectionFactory = (TopicConnectionFactory)jndi.lookup("jboss/DefaultJMSConnectionFactory"); 
    topic = (Topic)jndi.lookup("jms/myTopicName"); 

    topicConnection = topicConnectionFactory.createTopicConnection(); 

    TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 

    TopicSubscriber topicSubscriber = topicSession.createSubscriber(projectTopic, null, false); 
    topicSubscriber.setMessageListener(listenerClass); 
    topicConnection.start(); 
} 
... 

其中listenerClass是實現javax.jms.MessageListener類。

這利用了在standalone-full.xml內的Wildfly中定義的預定義的JMS連接工廠,所以我不需要設置一個明確的。

作爲一個警告 - 我運行此代碼的最後一次是在Wildfly 8中,所以有些事情可能已經發生了一些變化。另外,我沒有使用遠程連接,因此,可能會有一些差異。

+0

謝謝 - 我也試過,但仍然得到相同的異常拋出。不特別感到驚訝,因爲客戶端仍在使用相同的ActiveMARASession,無論它使用的是JMS2還是JMS1 facade。我無法想象這是沒有合理的解決方案。 –

+0

爲什麼你需要一個臨時隊列呢?如果您希望容器爲部署的整個生命週期提供mdb實例,那麼這也需要隊列存在,否則它們將附加到什麼位置? –

+0

@willt我需要有一個發佈/訂閱隊列,這對我的集羣中的每個節點都是唯一的。隊列必須在運行時的生命週期內存活;它不需要堅持重新啓動。另外我不想手動管理這些隊列。因此,有一個臨時隊列的想法......但是如果沒有辦法聽到它,那麼jee中的臨時隊列的目的是什麼? –

相關問題