主题订阅者没有收到消息

Topic subscriber didn't receive a message

我最近在 jms 中使用 Topic 时遇到了问题。我的 TopicSubscriber 没有收到发布者的消息,我不明白为什么。

这是我的 TopicPublisher:

public class Publisher
{
    private static final String CONNECTION_URL = "tcp://localhost:61616";

    public static void main(String[] args) throws Exception
    {
        BrokerService service = BrokerFactory.createBroker(new URI("broker:(" + CONNECTION_URL + ")"));
        service.start();
        TopicConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTION_URL);

        // create a topic connection
        TopicConnection topicConn = connectionFactory.createTopicConnection();

        // create a topic session
        TopicSession topicSession = topicConn.createTopicSession(false,
                Session.AUTO_ACKNOWLEDGE);

        // lookup the topic object
        Topic topic = topicSession.createTopic("test");

        // create a topic publisher
        TopicPublisher topicPublisher = topicSession.createPublisher(topic);
        topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // create the "Hello World" message
        TextMessage message = topicSession.createTextMessage();
        message.setText("Hello World");

        // publish the messages
        topicPublisher.publish(message);

        // print what we did
        System.out.println("Message published: " + message.getText());

        // close the topic connection
        topicConn.close();
    }
}

我的主题订阅者:

public class Subscriber
{
    private static final String CONNECTION_URL = "tcp://localhost:61616";

    public static void main(String[] args) throws Exception
    {
        TopicConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTION_URL);

        // create a topic connection
        TopicConnection topicConn = connectionFactory.createTopicConnection();

        // create a topic session
        TopicSession topicSession = topicConn.createTopicSession(false,
                Session.AUTO_ACKNOWLEDGE);


        Topic topic = topicSession.createTopic("test");

        // create a topic subscriber
        TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);

        // start the connection
        topicConn.start();

        // receive the message
        TextMessage message = (TextMessage) topicSubscriber.receiveNoWait();

        // print the message
        System.out.println("Message received: " + message.getText());

        // close the topic connection
        topicConn.close();
    }
}

在我的订户中,我在 message.getText() 上有一个 NullPointer 那是什么问题?我做错了什么以及如何解决?

您似乎是在创建订阅之前发送消息。 JMS 主题使用发布-订阅语义,其中发布的任何消息都会发送到所有订阅。如果没有订阅,则消息将被丢弃。

此外,由于您使用的是 receiveNoWait(),因此您的客户收到消息的可能性大大降低了。为了让您的客户真正收到消息,消息必须在您调用 createSubscriber(topic) 和调用 receiveNoWait() 之间发送。由于这 2 个调用非常接近,因此 window 的时间非常短。

如果你真的想让你的订阅者收到消息,那么先 运行 Subscriber 并使用 receive() 而不是 receiveNoWait() 然后 运行 Publisher。这将确保订阅在发送消息时存在,并且客户端在退出之前等待接收消息。