我尝试使用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。那么我该如何收听临时队列?
答案 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,所以有些事情可能会有所改变。另外,我没有使用远程连接,所以可能会有一些差异。