如何在JEE服务器(Wildfly)中的JMS临时队列上创建侦听器?

时间:2017-10-06 17:11:55

标签: java java-ee jms 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,因为在编译时不知道Destination。那么我该如何收听临时队列?

1 个答案:

答案 0 :(得分: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连接工厂,因此我不需要设置明确的。{/ p>

作为警告 - 最后我运行此代码的是Wildfly 8,所以有些事情可能会有所改变。另外,我没有使用远程连接,所以可能会有一些差异。