如何使我的JMS消息监听器无限期地监听

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

还有其他/更好的方法吗?

yuagqian 回答:如何使我的JMS消息监听器无限期地监听

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

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

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

此外,我建议您将aMessageListener.destroy();放在finally块中,而不要两次输入代码。

,

这是永远锁定的最简洁的方法

Thread.currentThread().join(); // Sleep forever,waiting for ourselves to finish

那表示您确实应该有一个应用程序,该应用程序可以重新启动失败的连接或与连接一起消失,因此更高级别的应用程序可以重新启动JVM。为此,我将main变成一个轮询循环,该循环每秒检查一次SessionConnection

本文链接:https://www.f2er.com/3144401.html

大家都在问