如何配置J2EE应用程序以便可以与tomcat服务器一起调用ActiveMQ服务?我知道嵌入式代理,这里询问如何在每次启动tomcat时启动ActiveMQ
当前代码(工作正常): 现在我想删除main()方法并使用代码在tomcat运行时运行。
public class JMSService {
public void produceJMS() throws NamingException, JMSException {
ConnectionFactory connFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection conn = connFactory.createConnection();
conn.start();
Session session = conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("testQueue");
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage message = session.createTextMessage("Test Message ");
// send the message
producer.send(message);
System.out.println("sent: " + message);
}}
这是我的消费者:
public class JMSReceiver implements MessageListener,ExceptionListener {
public static void main(String args[]) throws Exception {
JMSReceiver re = new JMSReceiver();
re.receiveJMS();
}
public void receiveJMS() throws NamingException, JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
// Getting the queue 'testQueue'
Destination destination = session.createQueue("testQueue");
MessageConsumer consumer = session.createConsumer(destination);
// set an asynchronous message listener
JMSReceiver asyncReceiver = new JMSReceiver();
consumer.setMessageListener(asyncReceiver);
connection.setExceptionListener(asyncReceiver);
}
@Override
public void onMessage(Message message) {
System.out.println("Received message : " +message);
}
}
答案 0 :(得分:1)
您没有在任何时候给消费者应用程序实际接收消息,您创建它,然后关闭它。您需要使用定时接收调用来从队列执行消息的同步接收,或者您需要在主方法中添加某种等待,例如CountDownLatch等,以允许异步onMessage调用在处理后触发关闭消息已完成。
答案 1 :(得分:1)
@Tim Bish所说的是对的。您需要有一个计时器,例如接收器应该监听1小时 - 或者在程序终止之前使其可用。无论哪种情况,您都需要启动一次消费者计划:
按如下方式更改您的receiveJMS方法:
finally
上述节目最多可听1个小时。如果只要程序运行就需要它,请删除ServletContextlistner
块。但推荐的方法是以某种方式关闭它。由于您的应用程序似乎是独立的,因此您可以查看java runtime shutdown hook,您可以在其中指定在程序终止时如何释放此类资源。
如果您的消费者是网络应用程序,您可以在#! /bin/sh
。