Как найти локальную очередь передачи удаленной очереди MQ в Java?

в моем приложении Java я получаю объект MQQueue, используя

MQQueue tQueue  = qManager.accessQueue(tqName, tqOptions);

Очередь является удаленной очередью. Есть ли способ получить соответствующую локальную очередь передачи?

(Используя MQ 7.5)

Спасибо


person Aleksandr Broytman    schedule 29.06.2015    source источник


Ответы (2)


Да, используя runmqsc консоль.

Сначала в командной строке запустите

runmqsc <qmgr>.

Как только консоль откроется, запустите

dis qr<remote q> XMITQ

для отображения очереди передачи, используемой определением удаленной очереди.

ОБНОВЛЕНИЕ

Другой метод заключается в использовании классов PCF.

      PCFMessageAgent pcfma = new PCFMessageAgent("QM");
      PCFMessage pcfCmd = new PCFMessage(MQConstants.MQCMD_INQUIRE_Q);
      pcfCmd.addParameter(MQConstants.MQCA_Q_NAME, "Q.REMOTE");
      PCFMessage[] pcfResponse = pcfma.send(pcfCmd);
      String xmitQName = (String) pcfResponse[0].getParameterValue(MQConstants.MQCA_XMIT_Q_NAME);
      System.out.println("XmitQ name " + xmitQName);
person Shashi    schedule 30.06.2015
comment
Мой вопрос касается программного способа получить его из моей программы Java. Программа знает имя администратора очередей и имя очереди. Вызов getQueueType() позволяет узнать, является ли очередь локальной или удаленной. Теперь, если очередь удалена, как программа найдет соответствующую ей локальную очередь передачи? Есть ли какие-либо вызовы API, которые я могу использовать? - person Aleksandr Broytman; 30.06.2015

Когда MQ открывает очередь, он запускает процесс разрешения имен, чтобы решить, какую локальную очередь открыть. Если приложение открывает QRemote, оно обычно преобразуется в очередь передачи.

Узнать имя разрешенной очереди несложно. Просто запросите его у MQ после того, как очередь будет успешно открыта:

public java.lang.String getResolvedQName( )

person T.Rob    schedule 30.06.2015
comment
Спасибо, но, к сожалению, это не сработало. Вот мой код: - person Aleksandr Broytman; 01.07.2015
comment
Спасибо, но, к сожалению, это не сработало. Когда я вызываю getResolvedType(), он возвращает мне 1 (локальный), но getResolvedName() по-прежнему возвращает имя удаленной очереди - person Aleksandr Broytman; 01.07.2015
comment
Мне удалось получить имя с помощью getAttributeString(CMQC.MQCA_XMIT_Q_NAME, CMQC.MQ_Q_NAME_LENGTH); - person Aleksandr Broytman; 01.07.2015
comment
Либо вы обращаетесь к полю до открытия очереди, либо вы нашли ошибку. Интерфейс C возвращает разрешенное имя локальной очереди в этом поле, и если интерфейс Java возвращает что-то другое, IBM исправит это в PMR. Но я подозреваю, что это может быть проблема времени. Единственный раз, когда разрешенное имя очереди может всегда быть чем-то отличным от QLOCAL, до того, как QMgr запустит разрешение имени. Возможно, даже в этом случае это будет ошибкой, поскольку поле должно оставаться пустым до тех пор, пока вызов API не вернется. - person T.Rob; 01.07.2015
comment
int openOptions = CMQC.MQOO_OUTPUT | CMQC.MQOO_FAIL_IF_QUIESCING | CMQC.MQOO_INQUIRE;MQQueue rQueue = sender.qMgr.accessQueue(queueName, openOptions);Имя строки = rQueue.getResolvedQName(); - это пример кода. Извините, не научился форматировать здесь - person Aleksandr Broytman; 02.07.2015
comment
Вы натыкаетесь на преднамеренные ограничения дизайна, что Stack Overflow не является форумом. Как сайт вопросов и ответов, цель состоит в том, чтобы соответствующие обновления вопроса добавлялись к вопросу, а те, которые касались ответа, добавлялись к ответу. Комментарии предназначены для запроса дополнительной информации или разъяснений. Если вы сделаете это обновление в своем вопросе, вы сможете его отформатировать. - person T.Rob; 02.07.2015