Как сохранить прослушиватель сообщений JMS на неопределенный срок - PullRequest
0 голосов
/ 07 ноября 2019

Мой код имеет две разные очереди 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). Я действительно не чувствую, что это чистый способ сделать это.

Есть ли другие / лучшие способы?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Вот самый краткий способ навсегда заблокировать

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

При этом у вас должно быть приложение, которое либо перезапускает сбойные соединения, либо умирает вместе с соединением, чтобы что-то более высокое могло перезапустить вашу JVM. Для этого я бы превратил main в цикл опроса, который проверяет Session или Connection каждую секунду.

0 голосов
/ 07 ноября 2019

Поскольку это, очевидно, простое приложение командной строки, вы можете использовать System.in.read(), чтобы программа закрывалась, когда пользователь нажимает клавишу ввода. Или, если вы хотите предотвратить случайное закрытие, вы можете сделать так, чтобы пользователю приходилось вводить определенное ключевое слово, например «выход» или «выход», и т. Д.

Кроме этого, я не вижу никаких проблем с использованиемwhile(true) хотя я бы использовал его в сочетании с Thread.sleep(), например:

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

Кроме того, я бы порекомендовал поместить aMessageListener.destroy(); в блок finally вместо того, чтобы использовать его в коде дважды.

...