我的代码在不同的地方有两个不同的JMS队列。它从一个队列中获取一条消息,进行一些处理,生成一条新消息,然后将其放在另一个队列中,以供其他进程处理。虽然可以,但我希望监听器连续监听,以便每当将新消息放入第一个队列时,它就会被拾取。 我的听众的主要方法:
public static void main(String[] args) throws JMSException {
parseArgs(args);
AMessageListener aMessageListener = new AMessageListener();
try {
aMessageListener.startListener();
Thread.sleep(100000);
aMessageListener.destroy();
} catch (JMSException e) {
// TODO handle exception
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
aMessageListener.destroy();
}
还有我用来启动侦听器的代码:
public void startListener() throws JMSException{
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVE_MQ_FACTORY_URL);
conn = connectionFactory.createConnection(jmsBrokerUser, jmsBrokerPass);
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("some.in.queue");
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(this);
}
我一直在网上寻找最佳实践,但几乎找不到。得到我想要的东西的一种明显方法是将while(true)
放在我有Thread.sleep(100000)
的位置。我真的不觉得这是一种干净的方法。
还有其他/更好的方法吗?
答案 0 :(得分:0)
由于这显然是一个简单的命令行应用程序,因此可以使用System.in.read()
,以便在用户按下Enter键时退出程序。或者,如果您想防止意外关闭,可以这样做,以便用户必须输入特定的关键字,例如“ exit”或“ quit”等。
除此之外,尽管我将while(true)
与Thread.sleep()
结合使用,但没有任何问题,例如:
while(true) {
Thread.sleep(100000);
}
此外,我建议您将aMessageListener.destroy();
放在finally
块中,而不要两次输入代码。
答案 1 :(得分:0)
这是永远锁定的最简洁的方法
Thread.currentThread().join(); // Sleep forever, waiting for ourselves to finish
那表示您确实应该有一个应用程序,该应用程序可以重新启动失败的连接或与连接一起消失,因此更高级别的应用程序可以重新启动JVM。为此,我将main变成一个轮询循环,该循环每秒检查一次Session
或Connection
。