JMS Consumer终止并且不接收Message

时间:2016-08-18 16:45:28

标签: eclipse jboss jms

所以我正在使用JBoss关注Java消息服务的this youtube教程。我的代码与视频相同,但是当我运行我的catchTopicConsumer应用程序时,两个终止并且不会保持活着,以便我接收我的消息。我读到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;
    }
}

1 个答案:

答案 0 :(得分:0)

所以问题是你依靠JMS库来维护至少一个非守护进程线程,以便在你创建使用者并分配消息监听器之后保持你的应用程序活着,但实际上并不能保证它会做任何这样的事情。

确实,许多JMS提供程序确实尝试始终在内部运行单个非守护程序线程,但假设始终如此,这是不可取的。您似乎发现您的特定提供商不会为您执行此操作,因此如果您想确保您的应用程序保持运行,您应该自己完成此操作。