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

时间:2016-03-14 19:43:19

标签: java activemq

我使用默认端口61616在localhost上运行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

1 个答案:

答案 0 :(得分:2)

默认情况下,主题不会保留邮件,因此如果您在生成邮件后启动了邮件,则在邮件到达之前发送的任何邮件都将消失。如果要使用消费者脱机时生成的消息,则需要在生成消息之前使用队列或在主题上注册持久的主题订阅者。