JMS 消费者未收到消息

JMS consumer not receiving messages

我刚刚完成了关于 JMS 的教程,所以它对我来说是超级新的,我正在尝试了解基础知识。如果重要的话,我正在使用 ActiveMQ Artemis。我创建了两个简单的应用程序,一个名为 Producer,另一个名为 Consumer。我先运行Producer然后运行ConsumerConsumer 应用程序永远不会终止并且不会将消息打印到控制台。奇怪的是,如果我没有第二次手动终止 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。然后您应该会看到所有收到的消息并按照您的预期打印出来。