JMS中的异步消息

时间:2020-03-27 15:42:31

标签: java jms

我对JMS有疑问。我阅读了相关的问题和答案,但找不到清晰的答案。

我有一个像这样的基本制作人:

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 个答案:

答案 0 :(得分:2)

没有Thread.sleep(10000),消费者将不会收到消息,因为该程序将在经纪人向其分发消息之前退出。这就是异步(即非阻塞)消息使用者的性质。如果您没有阻止main方法退出的方法,那么它将仅到达末尾并终止。