簡體   English   中英

如何在 JEE 服務器(Wildfly)中的 JMS 臨時隊列上創建偵聽器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM