我正在使用ActiveMQ。我的使用者代码是从main方法调用的。一旦主类终止,我希望JMSMessageListener已在队列上注册,并且只要在“ TestTopic”上有一条消息被调用,则onMessage都不会发生。

//JMS Consumer
public class JMSConsumer {
    public void consume() {
        String url = "tcp://localhost:61616";
        ConnectionFactory factory = new ActiveMQConnectionFactory(url);
        try {
            Connection connection = factory.createConnection();
            Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic("TestTopic");
            MessageConsumer consumer = session.createConsumer(topic);
            JMSMessageListener listener = new JMSMessageListener();
            consumer.setMessageListener(listener);
            connection.start();
        } catch (JMSException exp) {}
    }
}

//JMS Message Listener
public class JMSMessageListener implements MessageListener {
    @Override
    public void onMessage(javax.jms.Message msg) {
        System.out.println(msg.toString());
    }
}


这是因为主线程已终止并且侦听器不再处于活动状态吗?我认为,使用setMessageListener,以上代码应在内部创建一个始终运行的线程。

最佳答案

这是因为主线程已终止并且侦听器不再处于活动状态吗?我认为使用setMessageListener时,以上代码应在内部创建一个始终运行的线程。


setMessageListener不会创建新线程。从Session创建新的Connection时,将创建一个新线程。因此,即使主线程终止,会话线程也应继续运行。

您的代码对我来说看起来是正确的。您确定有关该主题的消息吗?而且,仅会在消费者上线之后接收发布到该主题的消息。

10-04 11:03