Агент PCB IMB возвращает ошибку при запросе статуса канала - PullRequest
0 голосов
/ 25 февраля 2020

У меня проблема с агентом сообщений PCF при запросе канала для получения информации о хостах, подключенных к данному администратору очередей. Код PCFAgent -

 MQGetMessageOptions getMessageOptions = new MQGetMessageOptions();
 getMessageOptions.options = MQC.MQGMO_BROWSE_NEXT + MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING;
 messageAgent = new PCFMessageAgent(MQEnvironment.hostname, MQEnvironment.port, MQEnvironment.channel);

, а код опций -

 inquireOptions = new PCFMessage(CMQCFC.MQCMD_INQUIRE_CHANNEL_STATUS);
            inquireOptions.addParameter(CMQCFC.MQCACH_CHANNEL_NAME, "*");
            inquireOptions.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_TYPE, CMQC.MQOT_CURRENT_CHANNEL);
            inquireOptions.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_ATTRS, new int[]{
                    CMQCFC.MQCACH_CHANNEL_NAME, CMQCFC.MQCACH_CONNECTION_NAME, CMQCFC.MQIACH_MSGS,
                    CMQCFC.MQCACH_LAST_MSG_DATE, CMQCFC.MQCACH_LAST_MSG_TIME, CMQCFC.MQIACH_CHANNEL_STATUS
            });
            responses = messageAgent.send(inquireOptions); 

Не всегда, но иногда приложение перезапускает исключение, которое говорит: «Код завершения 2, причина 2100» и мой host (тот, на котором запущено приложение) оставляет ожидающее соединение на сервере, которое никогда не закрывается, пока MQManager не будет перезапущен.

Я читал, что это исключение связано с конфликтом при создании динамического интерфейса c очередей, но в моем коде я не создаю никакой очереди. Кто-нибудь может мне помочь? Извините, у меня нет опыта работы с администраторами очередей.

Спасибо

1 Ответ

3 голосов
/ 26 февраля 2020

2100 (MQRC_OBJECT_ALREADY EXISTS) действительно проблема с созданием динамической c очереди.

Объяснение

An Был выполнен вызов MQOPEN для создания динамической очереди c, но очередь с тем же именем, что и у динамической c очереди, уже существует.

Код завершения

MQCC_FAILED

Ответ программиста

При полном предоставлении динамического имени очереди c убедитесь, что оно соблюдает правила именования для динамических c очередей; если это так, либо укажите другое имя, либо удалите существующую очередь, если она больше не требуется. Или же разрешите менеджеру очередей сгенерировать имя.

Если администратор очередей генерирует имя (частично или полностью), повторите вызов MQOPEN.

В разделе В этом случае PCFMessageAgent создаст сообщение формата PCF, используя данные, которые вы указали в PCFMessage, и откроет очередь модели для создания временной очереди для получения ответа от командного сервера. Эти временные очереди именуются администратором очередей путем создания уникальной части с использованием метки времени, в результате чего имя выглядит как AMQ.5E47207E2227AA02. Если у вас есть много параллельных приложений, делающих это, возможно, вы могли бы в итоге получить cla sh имен, а второй запрос одновременно мог бы привести к конфликту имен.

Если у вас есть способ сделать имя временной очереди более уникальным, если такой параллелизм будет проблемой в вашей системе, вы можете установить префикс, используемый для имени временной очереди, используя метод setReplyQueuePrefix . Например, вы можете использовать идентификатор пользователя, под которым выполняется каждое приложение, если он уникален.

publi c void setReplyQueuePrefix (java .lang.String prefixP)

Устанавливает строку, используемую в качестве первой части имени очереди ответа агента. Очередь ответов, используемая PCFAgent, является временной динамической очередью c. По умолчанию префикс очереди ответов, используемый PCFAgent, представляет собой пустую строку (""). Когда это используется, имя очереди ответов полностью генерируется администратором очередей. Если метод вызывается с указанным префиксом, то PCFAgent передает этот префикс администратору очередей всякий раз, когда ему необходимо создать временную очередь. Затем администратор очередей сгенерирует оставшуюся часть временного имени очереди. Это означает, что администратор очередей генерирует уникальное имя, но PCFAgent все еще имеет некоторый контроль. Указанный префикс должен содержать не более 33 символов. Если префикс содержит 33 символа или более, то этот метод усекает префикс до 32 символов в длину. Если в конце префикса нет символа звездочки (*), то в конце добавляется звездочка.

...