gpt4 book ai didi

java - 如何从 Web 应用程序收听消息队列? (Tomcat, ActiveMQ)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:32 25 4
gpt4 key购买 nike

我很高兴改进我在 Apache Tomcat 上运行的网络应用程序。添加了一个 ActiveMQ JMS 服务器来发送和接收消息。

我已经可以发送和接收消息,但在接收方方面需要帮助。

我的网络应用程序应该如何持续监听一个队列以接收消息?

新消息到达,服务器应对它们采取行动。例如:将数据添加到数据库或发回消息。

我已经可以发送消息了。这是代码。

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("clientQueue");
MessageProducer publisher = session.createProducer(queue);
connection.start();

Message message = null;
message = session.createTextMessage("Text Message");
publisher.send(message);

我已经可以在请求后收到消息(点击 ;-))

connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("serverQueue");
consumer = session.createConsumer(destination);

while (true) {
Message message = consumer.receive(300000);
//Do message stuff
}

如何让网络应用持续监听队列?建议的方法是什么?

热烈感谢所有帮助。谢谢。

编辑 - 解决方案

当前的工作解决方案与来自 DaveH 的建议

我添加了一个 ServletContextListener 来持续收听我的消息。

网络.xml

<listener>
<listener-class>com.test.JMSContextListener</listener-class>
</listener>

听众:

public class JMSContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent arg0) {
Thread thread = new Thread(new JMSConnector());
thread.start();
}

@Override
public void contextDestroyed(ServletContextEvent arg0) {
//Nothing
}
}

连接:

public class JMSConnector implements Runnable {
public void run() {
try {
Context context = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("java:comp/env/jms/ConnectionFactory");
Connection connection = factory.createConnection();
Queue queue = (javax.jms.Queue) context.lookup("java:comp/env/jms/serverQueue");
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

MessageConsumer consumer = session.createConsumer(queue);

//This MessageListener will do stuff with the message
MessageListenerImpl messageListener = new MessageListenerImpl();
consumer.setMessageListener(messageListener);
connection.start();

// Start connection or nothing will happen!!!
connection.start();
} catch (JMSException ex) {
//TODO
} catch (NamingException ex) {
//TODO
}
}
}

这是一种推荐的方法还是应该改进?

热烈感谢所有帮助。谢谢。

最佳答案

如果您的代码已经可以使用队列中的消息(看起来您这样做了),那么我认为您的问题归结为如何让这段代码运行。

看来您没有使用任何框架,所以我认为我将采用的方法是采用可以从队列中检索消息的代码,并在应用程序服务器的单独线程中运行它。让该线程在应用服务器启动时启动,并在应用服务器关闭时自行整理。

在应用服务器启动时启动线程的最简单方法是引入一个 ServletContextListener(示例 here。)在上下文监听器中,在单独的线程中启动队列监听代码。

编辑:我使用了这个建议的解决方案并将上面的代码添加到问题中。

关于java - 如何从 Web 应用程序收听消息队列? (Tomcat, ActiveMQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669219/

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