为什么我的 JMS 客户端不使用来自主题的消息?

Why does my JMS client not consume messages from the Topic?

我在使用默认端口 61616 的本地主机上安装了 ActiveMQ 运行。我将一些消息放在名为 topic.STUDENTS 的主题中。我有一个客户端程序,我试图用它来阅读主题中的消息。这是程序的主要部分,它没有按预期运行。我期待收到一些消息,但我只收到 null

 public void receiveMessages() throws URISyntaxException, JMSException, Exception {

    try { 
    //Create a ConnectionFactory 
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

    //Create a Connection
    Connection connection = connectionFactory.createConnection();
    connection.start();

    //Create a session
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    //Create the destination (Topic or Queue)
    Destination destination = session.createTopic("topic.STUDENTS");

    //Create a MessageConsumer from the Session to the Topic or Queue
    MessageConsumer consumer = session.createConsumer(destination);

    //Wait for a message
    Message message = consumer.receive(1000);

    if (message instanceof TextMessage) { 
        TextMessage textMessage = (TextMessage) message;
        String text = textMessage.getText();
        System.out.println("Received: " + text);

    } else { 
        System.out.println("Received: " + message);
    }

    consumer.close();
    session.close();
    connection.close();

       } catch(Exception e) { 
        System.out.println("Caught: " + e);
        e.printStackTrace();
    }
    }

此代码基本上模仿了 ActiveMQ 'Hello World' 示例中的代码:http://activemq.apache.org/hello-world.html

有谁知道为什么我收不到主题的任何消息?这是主题中的一条消息,我可以通过 ./activemq browse topic.STUDENTS 命令看到它:

JMS_BODY_FIELD:JMSText = Invention-my-dear-friends-is-93%-perspiration-6%-electricity
JMS_HEADER_FIELD:JMSExpiration = 0
JMS_HEADER_FIELD:JMSMessageID = ID:user-thinkpad-335i-59919-1457977678059-1:1:1:1:3
JMS_HEADER_FIELD:JMSPriority = 4
JMS_HEADER_FIELD:JMSDestination = topic.STUDENTS
JMS_HEADER_FIELD:JMSTimestamp = 1457977678409
JMS_HEADER_FIELD:JMSRedelivered = false
JMS_HEADER_FIELD:JMSDeliveryMode = persistent

默认情况下主题不保留消息,因此如果您在生成消息后启动消费者,那么在消费者到达之前发送的任何消息都会消失。如果您想消费在您的消费者离线时生成的消息,那么您需要在生成消息之前使用队列或在主题上注册一个持久的主题订阅者。