JMS 消费者未收到消息
JMS consumer not receiving messages
我刚刚完成了关于 JMS 的教程,所以它对我来说是超级新的,我正在尝试了解基础知识。如果重要的话,我正在使用 ActiveMQ Artemis。我创建了两个简单的应用程序,一个名为 Producer
,另一个名为 Consumer
。我先运行Producer
然后运行Consumer
。 Consumer
应用程序永远不会终止并且不会将消息打印到控制台。奇怪的是,如果我没有第二次手动终止 Consumer
和 运行 Producer
,那么我会在控制台上看到 Consumer
应该收到的消息。这里发生了什么?如何让 Consumer
接收和打印来自 Producer
的消息?
这里是Producer
:
public class Producer {
public static void main(String[] args) throws Exception {
InitialContext initialContext = null;
Connection connection = null;
initialContext = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
connection = cf.createConnection();
Session session = connection.createSession();
Queue queue = (Queue) initialContext.lookup("queue/myQueue");
Topic topic = (Topic) initialContext.lookup("topic/myTopic");
MessageProducer queueProducer = session.createProducer(queue);
MessageProducer topicProducer = session.createProducer(topic);
TextMessage queueMessage = session.createTextMessage("This message is for the queue2");
TextMessage topicMessage = session.createTextMessage("This message is for the topic2");
queueProducer.send(queueMessage);
topicProducer.send(topicMessage);
System.out.println("Message to queue sent: "+ queueMessage.getText());
System.out.println("Message to topic sent: "+ topicMessage.getText());
initialContext.close();
}
}
这里是Consumer
:
public class Consumer {
public static void main(String[] args) throws Exception {
InitialContext initialContext = null;
Connection connection = null;
initialContext = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
connection = cf.createConnection();
Session session = connection.createSession();
Queue queue = (Queue) initialContext.lookup("queue/myQueue");
Topic topic = (Topic) initialContext.lookup("topic/myTopic");
MessageConsumer queueConsumer = session.createConsumer(queue);
MessageConsumer topicConsumer1 = session.createConsumer(topic);
MessageConsumer topicConsumer2 = session.createConsumer(topic);
connection.start();
TextMessage messageReceivedByQueueConsumer = (TextMessage) queueConsumer.receive();
TextMessage messageReceivedByTopicConsumer1 = (TextMessage) topicConsumer1.receive();
TextMessage messageReceivedByTopicConsumer2 = (TextMessage) topicConsumer2.receive();
System.out.println("Message received by queue consumer: "+ messageReceivedByQueueConsumer.getText());
System.out.println("Message received by topic consumer 1: "+ messageReceivedByTopicConsumer1.getText());
System.out.println("Message received by topic consumer 2: "+ messageReceivedByTopicConsumer2.getText());
connection.close();
initialContext.close();
}
}
您所观察到的实际上是预期的行为。
由于您 运行 Producer
应用程序首先将一条消息发送到队列和一个主题,但两者都不存在 consumer/subscriber。发送到队列的消息存储在队列中,因为 JMS 队列就是这样工作的。发送到主题的消息被丢弃,因为没有订阅来接收消息。同样,这就是 JMS 主题的工作方式。
然后当您的 Consumer
应用程序 运行 时 queueConsumer
接收到发送到队列的消息,但是由于您正在调用 receive()
[没有超时] =14=] 该应用程序将永远阻塞,因为主题消费者的订阅中没有消息。此阻塞阻止打印从队列接收的消息。
您应该 运行 您的消费应用程序 首先 然后 运行 您的生产者,同时消费应用程序仍在 运行ning。然后您应该会看到所有收到的消息并按照您的预期打印出来。
我刚刚完成了关于 JMS 的教程,所以它对我来说是超级新的,我正在尝试了解基础知识。如果重要的话,我正在使用 ActiveMQ Artemis。我创建了两个简单的应用程序,一个名为 Producer
,另一个名为 Consumer
。我先运行Producer
然后运行Consumer
。 Consumer
应用程序永远不会终止并且不会将消息打印到控制台。奇怪的是,如果我没有第二次手动终止 Consumer
和 运行 Producer
,那么我会在控制台上看到 Consumer
应该收到的消息。这里发生了什么?如何让 Consumer
接收和打印来自 Producer
的消息?
这里是Producer
:
public class Producer {
public static void main(String[] args) throws Exception {
InitialContext initialContext = null;
Connection connection = null;
initialContext = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
connection = cf.createConnection();
Session session = connection.createSession();
Queue queue = (Queue) initialContext.lookup("queue/myQueue");
Topic topic = (Topic) initialContext.lookup("topic/myTopic");
MessageProducer queueProducer = session.createProducer(queue);
MessageProducer topicProducer = session.createProducer(topic);
TextMessage queueMessage = session.createTextMessage("This message is for the queue2");
TextMessage topicMessage = session.createTextMessage("This message is for the topic2");
queueProducer.send(queueMessage);
topicProducer.send(topicMessage);
System.out.println("Message to queue sent: "+ queueMessage.getText());
System.out.println("Message to topic sent: "+ topicMessage.getText());
initialContext.close();
}
}
这里是Consumer
:
public class Consumer {
public static void main(String[] args) throws Exception {
InitialContext initialContext = null;
Connection connection = null;
initialContext = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
connection = cf.createConnection();
Session session = connection.createSession();
Queue queue = (Queue) initialContext.lookup("queue/myQueue");
Topic topic = (Topic) initialContext.lookup("topic/myTopic");
MessageConsumer queueConsumer = session.createConsumer(queue);
MessageConsumer topicConsumer1 = session.createConsumer(topic);
MessageConsumer topicConsumer2 = session.createConsumer(topic);
connection.start();
TextMessage messageReceivedByQueueConsumer = (TextMessage) queueConsumer.receive();
TextMessage messageReceivedByTopicConsumer1 = (TextMessage) topicConsumer1.receive();
TextMessage messageReceivedByTopicConsumer2 = (TextMessage) topicConsumer2.receive();
System.out.println("Message received by queue consumer: "+ messageReceivedByQueueConsumer.getText());
System.out.println("Message received by topic consumer 1: "+ messageReceivedByTopicConsumer1.getText());
System.out.println("Message received by topic consumer 2: "+ messageReceivedByTopicConsumer2.getText());
connection.close();
initialContext.close();
}
}
您所观察到的实际上是预期的行为。
由于您 运行 Producer
应用程序首先将一条消息发送到队列和一个主题,但两者都不存在 consumer/subscriber。发送到队列的消息存储在队列中,因为 JMS 队列就是这样工作的。发送到主题的消息被丢弃,因为没有订阅来接收消息。同样,这就是 JMS 主题的工作方式。
然后当您的 Consumer
应用程序 运行 时 queueConsumer
接收到发送到队列的消息,但是由于您正在调用 receive()
[没有超时] =14=] 该应用程序将永远阻塞,因为主题消费者的订阅中没有消息。此阻塞阻止打印从队列接收的消息。
您应该 运行 您的消费应用程序 首先 然后 运行 您的生产者,同时消费应用程序仍在 运行ning。然后您应该会看到所有收到的消息并按照您的预期打印出来。