gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:28:31 24 4
gpt4 key购买 nike

我正在尝试使用 Wildfly 10 中的 JMS 2.0 和注入(inject)的连接工厂创建临时 JMS 队列。

我正在使用@JMSConnectionFactory注入(inject)我的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 中,所以有些事情可能已经发生了一些变化。此外,我没有使用远程连接,因此可能存在一些差异。

关于java - 如何在 JEE 服务器 (Wildfly) 中的 JMS 临时队列上创建监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46610764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com