如何在tomcat启动时启动ActiveMQ?

时间:2015-10-05 09:31:17

标签: java jms activemq

如何配置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);
}

}

2 个答案:

答案 0 :(得分:1)

您没有在任何时候给消费者应用程序实际接收消息,您创建它,然后关闭它。您需要使用定时接收调用来从队列执行消息的同步接收,或者您需要在主方法中添加某种等待,例如CountDownLatch等,以允许异步onMessage调用在处理后触发关闭消息已完成。

答案 1 :(得分:1)

@Tim Bish所说的是对的。您需要有一个计时器,例如接收器应该监听1小时 - 或者在程序终止之前使其可用。无论哪种情况,您都需要启动一次消费者计划:

按如下方式更改您的receiveJMS方法:

finally

上述节目最多可听1个小时。如果只要程序运行就需要它,请删除ServletContextlistner块。但推荐的方法是以某种方式关闭它。由于您的应用程序似乎是独立的,因此您可以查看java runtime shutdown hook,您可以在其中指定在程序终止时如何释放此类资源。

如果您的消费者是网络应用程序,您可以在#! /bin/sh

中关闭它