【问题标题】:JMS Consumer terminates and doesn't receive MessageJMS 消费者终止并且没有收到消息
【发布时间】:2016-08-22 01:54:49
【问题描述】:

所以我正在关注this youtube 上关于 JBoss 的 Java 消息服务的教程。我的代码与视频相同,但是当我运行我的 TopicConsumerTopicProducer 应用程序时,它们都会终止并且不会让我继续接收消息。我读到setMessageListener 会创建一个新线程,因此即使主线程终止但我仍然没有收到消息,也应该收到消息。

我发现它没有调用onMessage,是因为TopicConsumer在它有机会之前就被终止了吗?

我的 JBoss 5.0 服务器正在运行,就像在视频中我首先运行 TopicConsumer(但它在 print 语句之后终止,与视频中不同)然后是 TopicProduver(它也在 print 语句之后终止)我没有收到我的消息。

谢谢。

TopicConsumer.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;
    }
}

TopicProducer.java

package jmspubsubtutorial;

import javax.jms.JMSException;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.NamingException;

public class TopicProducer {

    public static void main(String[] args) throws JMSException, NamingException{
        System.out.println("---Starting TopicProducer---");
        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);
        topicConnection.start();
        TopicProducer topicProducer = new TopicProducer();
        String text = "message 1 from TopicProducer...";
        topicProducer.sendMessage(text, topicSession, topic);

        System.out.println("---Exiting TopicProducer---");
    }

    public void sendMessage(String text, TopicSession topicSession, Topic topic) throws JMSException {
        System.out.println("Send Message: " + text + " " + topicSession + " " + topic);
        TopicPublisher topicPublisher = topicSession.createPublisher(topic);
        TextMessage textMessage = topicSession.createTextMessage(text);
        topicPublisher.publish(textMessage);
        topicPublisher.close();
    }
}

【问题讨论】:

    标签: eclipse jboss jms


    【解决方案1】:

    所以问题是您依赖 JMS 库来维护至少一个非守护线程,以便在创建消费者并分配消息侦听器后保持应用程序处于活动状态,但实际上并不能保证它会做任何这样的事情。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2018-09-12
      • 2020-11-15
      • 2022-08-13
      • 2013-08-13
      • 2017-11-29
      • 2020-07-24
      相关资源
      最近更新 更多