2016-03-14 9 views
-1

我使用默认端口61616在本地主机上运行ActiveMQ。我在一个名为topic.STUDENTS的主题中放置了一些消息。我有一个客户端程序,我试图用它来读取主题中的消息。这是程序的主要部分,不能按预期工作。我期待收到一些消息,但我只收到null为什么我的JMS客户端不使用主题中的消息?

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 

回答

2

主题不保留默认的消息,因此,如果您是在制作则消息的任何消息后,启动消费是在消费者到达消失之前发送。如果您想要使用消费者脱机时生成的消息,那么在生成消息之前,您需要使用Queue或在Topic上注册持久的Topic订户。

+0

我认为你对此可能是正确的。我在创建'Destination'到'createQueue'时改变了对会话参考的调用,并且我收到了我期望的消息。 :D这工作。 – user3870315