Код прослушивателя IBM MQ JMS java, поддерживающий работу программы - PullRequest
0 голосов
/ 08 января 2020

Этот вопрос является продолжением вопроса, задаваемого Служба прослушивания IBM MQ - onMessage не запускается

Допустим, тот же код находится в производстве, теперь как мы будем поддерживать выполнение программы , Я чувствовал, что добавление кода сканера не является правильным или эффективным способом достижения этого. Есть ли лучшее решение, чтобы программа продолжала работать, чтобы по окончании основной программы программа не закрывалась. В идеале я думаю, что вызов метода start qc.start() должен ждать бесконечно долго. Пожалуйста, дайте мне знать, как мы реализуем это надлежащим и идеальным способом.

Требуется, чтобы слушатель работал бесконечно в ожидании новых сообщений. У меня нет других бизнес-условий, чтобы поместить в метод main метод, чтобы программа работала. Добавление кода сканера не кажется хорошим подходом. Какой идеальный способ ??

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Я думаю, что вы спрашиваете, как сохранить программу Java на неопределенный срок.

Есть несколько способов, но вам нужен способ его завершения, либо с помощью пользовательского прерывания, либо по сигналу, и вы не хотите, чтобы он был ограничен l oop, поэтому он будет использовать весь процессор и стека памяти, ничего не оставляя для вашего onMessage события.

Вы не хотите помещать в режим ожидания onMessage, поэтому его следует порождать во вторичном потоке, что позволяет основному потоку периодически выходить из спящего режима для проверки сигнала завершения.

Основы


Thread worker = new Thread(new yourOnMessageThread());
worker.start();

while(true) {
  try {
    Thread.sleep(sleep duration);
  } catch(InterruptedException ex) {
    // check for termination signal
    // if required, terminate
  }
}
1 голос
/ 09 января 2020

Обратите внимание, что JMS поставляется с 2 способами отправки сообщений: синхронный и асинхронный. Для начала, и если вашей программе не нужно ничего делать , если нет нового сообщения , попробуйте сначала синхронную диспетчеризацию . Вам не нужно создавать и устанавливать объект Listener:

  consumer = queueSession.createConsumer(queue); 
  qc.start();
  while( nummsgs<maxmsgs || maxmsgs==0 ) {

    Message message = consumer.receive(1000); // receive the next message or wait up to 1 second, for example
    if (message != null) {

      nummsgs++;
      ... processing code ...
    }
 }

(я обычно хотел бы сделать условие завершения while основанным на входном параметре, таком как int maxmsgs = 0;, чтобы вы могли автоматически останавливаться после обработки 100000 сообщений например, для тестирования производительности или просто укажите 0, чтобы он работал вечно).

В этом подходе нет ничего плохого, и поскольку код проще писать и понимать, я бы рекомендовал его в качестве подхода первого уровня , Основным l oop является просто MQ-диспетчер l oop, который имеет смысл, если это основная цель вашей программы.

Если ваша программа делает много вещей, одним из которых является получение MQ, асинхронная диспетчеризация может быть лучше. Основной l oop больше не имеет «MQ focus». Он просто сидит и ждет, пока кто-нибудь не нажмет Ctrl- C или не убьет программу.

  consumer = queueSession.createConsumer(queue);
  Listener listener = new Listener();
  consumer.setMessageListener(listener);
  qc.start();

  Object waitLock = new Object();
  while( nummsgs<maxmsgs || maxmsgs==0 ) {

    synchronized(waitLock) {
      waitLock.wait(1000); // wait up to 1 second, for example
    }
  }
...