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
中关闭它。
如何配置我的 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
中关闭它。