![](/img/trans.png)
[英]How to create a JMS queue/topic programmatically in wildfly 10 server.
[英]How to create a listener on a JMS Temporary Queue in a JEE server (Wildfly)?
我正在嘗試使用 Wildfly 10 中的 JMS 2.0 和注入的連接工廠創建一個臨時 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,因為在編譯時不知道目標。 那么我如何收聽臨時隊列呢?
我只能通過使用 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 中,所以有些事情可能會有所改變。 此外,我沒有使用遠程連接,因此,可能會有一些差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.