【发布时间】:2018-03-18 13:21:44
【问题描述】:
我正在尝试使用 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,因为目标在编译时未知。那么如何收听临时队列呢?
【问题讨论】:
标签: java jakarta-ee jms wildfly