【问题标题】:How do I keep my JMS message listener listening indefinitely如何让我的 JMS 消息侦听器无限期地收听
【发布时间】:2019-11-08 01:39:17
【问题描述】:

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

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

【问题讨论】:

    标签: java jms activemq listener


    【解决方案1】:

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

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

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

    另外,我建议您将 aMessageListener.destroy(); 放在 finally 块中,而不是将其放在您的代码中两次。

    【讨论】:

      【解决方案2】:

      这是最简洁的永久锁定方式

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

      也就是说,您确实应该拥有一个应用程序,该应用程序要么重新启动失败的连接,要么与连接一起终止,以便更高层的东西可以重新启动您的 JVM。为此,我会将 main 变成一个轮询循环,每秒检查一次 SessionConnection

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        相关资源
        最近更新 更多