繁体   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