所以我正在使用JBoss关注Java消息服务的this youtube教程。我的代码与视频相同,但是当我运行我的catch
和TopicConsumer
应用程序时,两个终止并且不会保持活着,以便我接收我的消息。我读到TopicProducer
会创建一个新线程,所以即使主线程已经终止但是我仍然没有收到消息,就应该收到消息。
我发现它没有调用setMessageListener
,是因为onMessage
在有机会之前被终止了吗?
我的JBoss 5.0服务器正在运行,就像我首先运行TopicConsumer
的视频一样(但它在print语句后不像视频那样终止)然后是TopicConsumer
(它也会在之后终止打印声明)我没有收到我的消息。
感谢。
TopicConsumer.java
TopicProduver
TopicProducer.java
package jmspubsubtutorial;
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class TopicConsumer implements MessageListener {
public static void main(String[] args) throws JMSException, NamingException{
System.out.println("---Starting TopicConsumer---");
Context context = TopicConsumer.getInitialContext();
TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) context.lookup("ConnectionFactory");
Topic topic = (Topic) context.lookup("topic/JMS_tutorial");
TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();
TopicSession topicSession = topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
topicSession.createSubscriber(topic).setMessageListener(new TopicConsumer());
topicConnection.start();
System.out.println("---Exiting TopicConsumer---");
}
@Override
public void onMessage(Message message) {
System.out.println("--- onMessage ---");
try {
System.out.println("Incoming message: " + ((TextMessage)message).getText());
} catch (JMSException e) {
System.out.println("onMessage failed");
e.printStackTrace();
}
}
public static Context getInitialContext() throws JMSException, NamingException {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
props.setProperty("java.naming.provider.url", "localhost:1099");
Context context = new InitialContext(props);
return context;
}
}
答案 0 :(得分:0)
所以问题是你依靠JMS库来维护至少一个非守护进程线程,以便在你创建使用者并分配消息监听器之后保持你的应用程序活着,但实际上并不能保证它会做任何这样的事情。
确实,许多JMS提供程序确实尝试始终在内部运行单个非守护程序线程,但假设始终如此,这是不可取的。您似乎发现您的特定提供商不会为您执行此操作,因此如果您想确保您的应用程序保持运行,您应该自己完成此操作。