【问题标题】:How to start ActiveMQ when tomcat starts?tomcat启动时如何启动ActiveMQ?
【发布时间】:2016-01-01 21:54:19
【问题描述】:

如何配置我的 J2EE 应用程序以便我可以调用 ActiveMQ 服务和 tomcat 服务器?我知道嵌入式代理,这里询问如何在我启动 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);
}

}

【问题讨论】:

  • 您是否尝试从您的消费者中删除connection.close()
  • 感谢您的宝贵时间。请检查我的更新
  • 因为它是 java 程序,它应该在 jvm (java.exe) 中运行。可能是在像 tomcat 这样的服务器中运行您的消费者或作为主线程运行。

标签: java jms activemq


【解决方案1】:

@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 中关闭它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您询问的是一个普通的 Java 应用程序,因此需要一个 main 方法,对于服务类型场景,请查看 Tomcat 之类的容器,JMS 没有定义任何关于容器或服务的内容。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多