tomcat启动时如何启动ActiveMQ?

How to start ActiveMQ when tomcat starts?

如何配置我的 J2EE 应用程序以便我可以调用 ActiveMQ 服务以及 tomcat 服务器?我知道嵌入式代理,这里询问如何在我启动时启动 ActiveMQ tomcat

当前代码(工作正常): 现在我想删除 main() 方法并使用代码 运行 when tomcat 运行s.

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);
}

}

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

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

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

 public void receiveJMS() throws NamingException, JMSException {
try{
     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
     Connection connection = connectionFactory.createConnection();
     connection.start(); // it's the start point


     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(); 
   //no need to create another object
    consumer.setMessageListener(this);

     connection.setExceptionListener(this);

     // connection.close(); once this is closed consumer no longer active

    Thread.sleep(60 *60 * 1000);             // receive messages for 1 hour
   }finally{
      connection.close();// after 1 hour close it
   }

}

以上节目最多收听1小时。如果你想要它只要程序运行,去掉finally块。但推荐的方法是以某种方式关闭它。由于您的应用程序似乎是独立的,您可以检查 java runtime shutdown hook,您可以在其中指定程序终止时如何释放此类资源。

如果您的消费者是 Web 应用程序,您可以在 ServletContextlistner 中关闭它。