我很高兴改进在Apache Tomcat 上运行的 Web应用程序 。一个 ActiveMQ的 JMS服务器添加到发送和接收消息。
我已经可以发送和接收消息,但是在接收方需要帮助。
我的Web应用程序应如何连续侦听一个队列以接收消息?
新消息到达,服务器应对其进行操作。例如:将数据添加到数据库或发送回消息。
我已经可以发送消息了。 这是代码。
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 }
我应该如何让Web应用程序连续监听队列? 建议的方法是什么?
热忱感谢所有帮助。 谢谢。
编辑-解决方案
我添加了一个ServletContextListener来连续监听我的消息。
web.xml
<listener> <listener-class>com.test.JMSContextListener</listener-class> </listener>
Listeren:
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(此处为示例)。在Context Listener中,在单独的线程中启动队列侦听代码。
编辑: 我用这个建议的解决方案,并将上面的代码添加到问题。