如何保持JMS消息侦听器无限期地侦听

David Van de Veerdonk:

我的代码在不同的地方有两个不同的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)我真的不觉得这是一种干净的方法。

有什么不同/更好的方法吗?

贾斯汀·贝特拉姆(Justin Bertram):

因为这显然是一个简单的命令行应用程序,System.in.read()所以您可以使用它,以便在用户按下Enter键时退出程序。或者,如果您想防止意外关闭,可以这样做,以便用户必须输入特定的关键字,例如“ exit”或“ quit”等。

除此之外,while(true)尽管我将其与结合使用Thread.sleep()但我看不到使用任何问题,例如:

while(true) {
   Thread.sleep(100000);
}

另外,我建议您放入aMessageListener.destroy();一个finally块中,而不要两次编写代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章