JMS 中的异步消息传递
Asynchronously Messaging in 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
class 并向队列发送消息。然后,当我运行 Consumer
class。如果 Thread.sleep(10000);
行被注释掉,则 Consumer
不会收到消息。但是当我调试 Consumer
时,它会收到消息。
我知道当消息到来时,侦听器会在单独的线程中调用。在此示例中,队列中有一条消息,但消费者不会收到消息,除非 Thread.sleep(10000)
为 运行.
为什么在 Thread.sleep(10000);
行被注释掉后我的 Consumer
收不到消息?
消费者不会收到没有 Thread.sleep(10000)
的消息,因为在代理向其发送消息之前程序将 退出 。这是 异步(即非阻塞)消息消费者的本质。如果您没有任何东西可以阻止您的 main
方法退出,那么它将简单地到达终点并终止。
我有一个关于 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
class 并向队列发送消息。然后,当我运行 Consumer
class。如果 Thread.sleep(10000);
行被注释掉,则 Consumer
不会收到消息。但是当我调试 Consumer
时,它会收到消息。
我知道当消息到来时,侦听器会在单独的线程中调用。在此示例中,队列中有一条消息,但消费者不会收到消息,除非 Thread.sleep(10000)
为 运行.
为什么在 Thread.sleep(10000);
行被注释掉后我的 Consumer
收不到消息?
消费者不会收到没有 Thread.sleep(10000)
的消息,因为在代理向其发送消息之前程序将 退出 。这是 异步(即非阻塞)消息消费者的本质。如果您没有任何东西可以阻止您的 main
方法退出,那么它将简单地到达终点并终止。