![](/img/trans.png)
[英]How to create a JMS queue/topic programmatically in wildfly 10 server.
[英]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.