我正在使用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
时,将创建一个新线程。因此,即使主线程终止,会话线程也应继续运行。
您的代码对我来说看起来是正确的。您确定有关该主题的消息吗?而且,仅会在消费者上线之后接收发布到该主题的消息。