Подписчик темы не получил сообщение - PullRequest
1 голос
/ 19 апреля 2019

Я недавно работаю с Темой в jms, и у меня есть проблема. Мой 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();
    }
}

У моего подписчика есть NullPointer на message.getText() Что это за проблема? Что я делаю не так и как это можно исправить?

1 Ответ

1 голос
/ 19 апреля 2019

Похоже, что вы отправляете сообщение до создания подписки.В темах JMS используется семантика публикации-подписки, где любое опубликованное сообщение отправляется всем подпискам.Если подписок нет, сообщение отбрасывается.

Кроме того, поскольку вы используете receiveNoWait(), вы значительно снижаете вероятность того, что ваш клиент когда-либо получит сообщение.Чтобы ваш клиент действительно получил сообщение, оно должно быть отправлено между временем, когда вы звоните createSubscriber(topic), и временем, когда вы звоните receiveNoWait().Поскольку эти 2 вызова происходят очень близко друг к другу, окно времени очень мало.

Если вы действительно хотите, чтобы ваш подписчик получил сообщение, сначала запустите Subscriber и используйте receive() вместо receiveNoWait(), а затемзапустить Publisher.Это гарантирует, что подписка существует при отправке сообщения и что клиент ожидает получения сообщения, прежде чем выйти.

...