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

Java 如何在JEE服务器(Wildfly)中的JMS临时队列上创建侦听器?,java,jakarta-ee,jms,wildfly,Java,Jakarta Ee,Jms,Wildfly,我正在尝试使用Wildfly 10中的JMS 2.0和注入连接工厂创建一个临时JMS队列 我正在使用@JMSConnectionFactory注入我的ConnectionFactory。这个很好用 @Inject @JMSConnectionFactory("java:/jms/RemoteConnectionFactory") JMSContext jmsContext 创建临时队列也可以正常工作: Destination jmsQueue = jmsContext.createTempor

我正在尝试使用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
的类

这利用了Wildfly在
standalone full.xml
中定义的预定义JMS连接工厂,因此无需设置显式连接工厂


作为一个警告,我上一次运行这段代码是在Wildfly 8中,所以有些事情可能已经发生了一些变化。此外,我没有使用远程连接,因此可能会有一些不同。

谢谢-我也尝试过,但仍然引发了相同的异常。这并不特别奇怪,因为客户机仍然使用相同的ActiveMARASession,无论它使用的是JMS2还是JMS1 facade。我无法想象没有一个合乎逻辑的解决方案。为什么你需要一个临时队列呢?如果您希望容器在部署生命周期内提供mdb实例,那么这也要求队列存在,否则它们将附加到什么?@willt我需要一个对群集中每个节点都唯一的发布/订阅队列。队列必须在运行时的生命周期内生存;它不需要持续重新启动。另外,我不想手动管理这些队列。因此,临时队列的想法。。。但是如果没有办法听它,那么在jee中临时队列的目的是什么呢?@EricB您的部署环境是什么样的?我最终放弃了JMS代码,转而使用AWS SQS队列。它不是100%替换,因为SQS队列需要轮询,但对于我的代码来说,它工作得很好。@stdunbar Jboss EAP 7/Wildfly 10。移动到第三方mq代理在tous时间点上不是一个选项,但我认为它将在未来成为一个选项。但是现在需要一个解决方案