Асинхронный обмен сообщениями в JMS - PullRequest
1 голос
/ 27 марта 2020

У меня вопрос по JMS. Я прочитал соответствующие вопросы и ответы, но не смог найти четкого ответа.

У меня есть базовый c продюсер, подобный этому:

public class AsyncProducer {

public static void main(String[] args) throws Exception {

    InitialContext initialContext = new InitialContext();
    Queue queue = (Queue) initialContext.lookup("queue/asyncQueue");

    try (
        ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
        JMSContext jmsContext = cf.createContext();
        ){

        JMSProducer producer = jmsContext.createProducer();
        producer.send(queue, "Async Message");

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

  }

}

Это мой MessageListener:

public class AsyncConsumerListener implements MessageListener {

   @Override
   public void onMessage(Message message) {
      try {
         TextMessage text = (TextMessage) message;
         System.out.println("Consumer: message received: " + text.getText());
      } catch (JMSException e) {
         e.printStackTrace();
      }
   }
}

А это мой потребитель:

public class AsyncConsumer {

public static void main(String[] args) throws Exception{

    InitialContext initialContext = new InitialContext();
    Queue queue = (Queue) initialContext.lookup("queue/asyncQueue");

    try (
        ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
        JMSContext jmsContext = cf.createContext();
        ){

        JMSConsumer consumer = jmsContext.createConsumer(queue);

        consumer.setMessageListener(new AsyncConsumerListener());

        //Thread.sleep(10000);  

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

  }

}

Сначала я запускаю класс Producer и отправляю сообщение в очередь. Затем, когда я запускаю класс Consumer. Если строка Thread.sleep(10000); закомментирована, то Consumer не получит сообщение. Но когда я отлаживаю Consumer, он получает сообщение.

Я знаю, что когда приходит сообщение, слушатель вызывается в отдельном потоке. В этом примере в очереди есть сообщение, но потребитель не получает сообщение, пока не запущен Thread.sleep(10000).

Почему мой Consumer не получает сообщение, когда строка Thread.sleep(10000); закомментировано?

1 Ответ

2 голосов
/ 27 марта 2020

Потребитель не получит сообщение без Thread.sleep(10000), потому что программа выйдет , прежде чем брокер отправит ему сообщение. Это характер асинхронных (то есть неблокирующих) потребителей сообщений. Если у вас нет чего-то, что препятствует выходу из вашего main метода, он просто достигнет конца и завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...