Постоянный подписчик не получает сообщения от темы

Я использовал подписчик SYSTEM.JMS.D.SUBSCRIBER.QUEUE и идентификатор клиента как setClientID("USER1") и использовал topicSubscriber = topSession.createDurableSubscriber(topic,"SUB1");

Создан topicSubscriber, и при попытке получить с помощью этого topicSubscriber.receive(); он не получает сообщения из темы, но в теме есть сообщения.

Может ли кто-нибудь сказать, почему он не получает сообщения и нужно ли мне проверять какие-либо конфигурации очереди.

Любая помощь приветствуется.

Заранее спасибо.


В моем коде уже был themeConnection.Start(), также я проверил в TopicSession, что нет метода Start().

Тот же код с методом ненадежного подписчика topicSession.createSubscriber(topic); работает, но не работает на устойчивый.

Спасибо


Извините, да, я имел в виду themeConnection.Start(). Это стоило проверки.


Я получил ответ, что постоянный подписчик не работает. Глубина моей очереди достигла максимальной глубины очереди, поэтому подписчик не может подписаться на сообщение.

напр. моя максимальная глубина очереди для очереди SYSTEM.JMS.D.SUBSCRIBER.QUEUE установлена ​​на 100, и если мы проверим нашу текущую глубину очереди, и если она достигнет 100, подписчик не будет работать.

В качестве альтернативного способа я пытаюсь создать временную тему, здесь я получаю сообщение об ошибке при создании долговременного подписчика topicSession.createDurableSubscriber(topic,"SUB1");

Исключение JMS :: javax.jms.InvalidDestinationException: MQJMS0003: пункт назначения не понят или больше недействителен

Может кто поможет решить эту ошибку.

Заранее спасибо.


person user1252076    schedule 06.03.2012    source источник
comment
Вы вызвали themeSession.start()? Это распространенный шаг, пропущенный в приложениях JMS. Никакие сообщения не будут доставлены, пока сеанс не будет запущен.   -  person Brian Cope    schedule 06.03.2012
comment
Пожалуйста, не публикуйте ответы в качестве продолжения вашего вопроса, вместо этого отредактируйте свой вопрос. SO - это не форум, это движок вопросов и ответов. Вопросы вверху, ответы внизу (отсортированы по количеству голосов).   -  person Tim Post♦    schedule 09.03.2012


Ответы (1)


Проблема, похоже, в том, как вы используете SYSTEM.JMS.D.SUBSCRIBER.QUEUE. Похоже, вы направляете сообщения и подписчиков в эту очередь как место назначения для долгосрочной подписки. IBM MQ использует эту очередь для управления постоянными подписками.

Как правило, очереди, имена которых начинаются с SYSTEM, предназначены для внутреннего использования системой MQ. Некоторые из них, такие как SYSTEM.ADMIN.*.EVENT, подходят для получения сообщений, но вы также не будете использовать их в качестве адресата подписки для несвязанных сообщений.

Во многих руководствах в качестве места назначения для сообщений используется SYSTEM.DEFAULT.LOCAL.QUEUE, но это только потому, что известно, что очередь существует во всех версиях MQ, а MQ использует только определение очереди, а не содержимое этой очереди. Автору учебника (и IBM тоже виновата здесь) проще указать на SYSTEM.DEFAULT.LOCAL.QUEUE, чем объяснить учащемуся необходимость и средства для создания собственной очереди. Таким образом, хотя лучшие практики предполагают, что это не должно быть исключением из правила «не использовать SYSTEM объекты», обычное использование делает SYSTEM.DEFAULT.LOCAL.QUEUE исключением де-факто.

Другими исключениями являются, конечно же, очереди команд для MQ, MFT и IIB. Это также имена SYSTEM.*, но они предназначены для взаимодействия пользователей с программным обеспечением, прослушивающим очередь.

Обратите внимание, что все исключения из правила «не использовать объекты SYSTEM» являются интерфейсами между приложениями и системными ресурсами MQ. Очереди событий — это MQ, отправляющий информацию пользователю. Очереди команд — это пользователь, отправляющий информацию системным компонентам. Подписка не относится ни к одной из этих категорий. Назначение подписки считается объектом, принадлежащим приложению, даже если система управляет им от имени подписчика.

Если вам нужна постоянная подписка, либо позвольте системе назначить постоянную очередь и использовать ее, либо предварительно определить очередь (которая не называется SYSTEM.*) и использовать ее. Что бы вы ни делали, пожалуйста, НЕ пытайтесь захватить внутренние системные очереди MQ для целей уровня приложения.

person T.Rob    schedule 18.06.2015