Краткое описание проблемы
Проблема не в вашей программе, проблема в очереди моделей, связанной с темой, на которую вы подписываетесь.
В диспетчере очереди, если вы посмотритеу объекта темы, которому будет соответствовать ваша подписка, у него будет параметр MNDURMDL
, указывающий на очередь модели.
Если вы посмотрите на очередь модели, вы заметите два параметра, в которых один или оба могут вызватьошибка, которую вы получаете:
[ DEFSOPT( EXCL | SHARED ) ]
[ SHARE | NOSHARE ]
Они должны быть установлены на DEFSOPT(SHARED)
и SHARE
.Если для одного из них задано другое значение, у вас будет только один подписчик в общей подписке.
Дополнительные сведения о причине проблемы
В IBM MQ Pub/ Sub, когда вы создаете подписку JMS, MQ рассматривает это как управляемую подписку, в фоновом режиме IBM MQ создаст временную очередь для подписки на строку темы.Если это недолговременная подписка, очередь является временной динамической очередью.
Причина сбоя заключается в том, что первый поток откроет временную динамическую очередь в монопольном режиме, а другие потоки не смогут открытьвременная динамическая очередь, и вы получаете сообщение об ошибке MQRC_OBJECT_IN_USE
.
Возможная причина, при которой была создана очередь модели MNDURMDL
для конкретного приложения
Я подозреваю, что причина в том, что IBMс несколькими различными очередями моделей по умолчанию.
По умолчанию для недолговечного абонента установлены следующие параметры:
QUEUE(SYSTEM.NDURABLE.MODEL.QUEUE) TYPE(QMODEL)
DEFSOPT(SHARED) SHARE
Существует еще одна очередь по умолчанию, которая не является специфичной для публикации / подписки и имеет этинастройки:
QUEUE(SYSTEM.DEFAULT.MODEL.QUEUE) TYPE(QMODEL)
DEFSOPT(EXCL) NOSHARE
Вероятно, очередь модели, созданная для использования вашим тематическим объектом, была создана с помощью команды, подобной следующей, которая по умолчанию будет использовать настройку SYSTEM.DEFAULT.MODEL.QUEUE
.:
DEFINE QMODEL(xxx)
В будущем вы можете либо специально установить эти два параметра, либо определить его с помощью ключевого слова LIKE
, чтобы заставить егоиспользуйте другую очередь для моделирования параметров, обе команды приведены ниже:
DEFINE QMODEL(xxx) DEFSOPT(SHARED) SHARE
DEFINE QMODEL(xxx) LIKE(SYSTEM.NDURABLE.MODEL.QUEUE)
Дополнительные сведения о создании и использовании специфических для приложения объектов TOPIC и очередей MODEL
По умолчанию корневой каталогузел дерева представлен стандартным объектом TOPIC с именем SYSTEM.BASE.TOPIC
, очереди модели по умолчанию, связанные с этой темой, показаны ниже:
TOPIC(SYSTEM.BASE.TOPIC) TYPE(LOCAL)
TOPICSTR() MDURMDL(SYSTEM.DURABLE.MODEL.QUEUE)
MNDURMDL(SYSTEM.NDURABLE.MODEL.QUEUE)
Если вы не определите никаких дополнительных административных объектов TOPIC, то всетемы совпадают с SYSTEM.BASE.TOPIC
.Кроме того, если вы не определяете какие-либо дополнительные административные объекты TOPIC и хотите предоставить разрешение приложения для определенного подмножества дерева тем (например, строк тем, начинающихся с TESTSUB
), вы должны предоставить разрешения через SYSTEM.BASE.TOPIC
, это вturn предоставляет приложению доступ к любой произвольной строке темы без ограничений.
Рекомендуется создать объект TOPIC со строкой темы, которая соответствует части дерева тем, к которой приложение должно иметь доступ.Для вашего примера TESTSUB/#
, если ваш администратор определил новый объект TOPIC и указал TOPICSTR(TESTSUB)
, значения по умолчанию создадут его следующим образом:
TOPIC(TESTSUB.TOPIC) TYPE(LOCAL)
TOPICSTR(TESTSUB) MDURMDL( )
MNDURMDL( )
пустые значения MDURMDL
и MNDURMDL
скажите MQ использовать значение из ближайшего более высокого объекта темы в дереве, если больше ничего не определено, это будет SYSTEM.BASE.TOPIC
, а очереди модели по-прежнему будут использовать очереди моделей SYSTEM.DURABLE.MODEL.QUEUE
и SYSTEM.NDURABLE.MODEL.QUEUE
.
Администратор может вместо этого создать объект TOPIC и указать различные очереди моделей, например:
TOPIC(TESTSUB.TOPIC) TYPE(LOCAL)
TOPICSTR(TESTSUB) MDURMDL(TESTSUB.DURABLE.MODEL.QUEUE)
MNDURMDL(TESTSUB.NDURABLE.MODEL.QUEUE)
Таким образом, они могут определять очереди моделей для конкретных приложений, которые имеют параметры, необходимые для общих подписок, а невоздействовать на очереди модели SYSTEM.Другое преимущество заключается в том, что они могут предоставлять приложениям разрешения только для строк тем, начинающихся с TESTSUB
, например TESTSUB/A
или TESTSUB/B
или TESTSUB/X/Y/Z
.