2017-01-16 3 views
3

У меня есть код клиента MQ, который может просматривать очередь псевдонимов, чтобы получить базовое имя объекта Alias ​​Queue (то есть имя локальной очереди, на которую указывает очередь псевдонимов). Однако код работает только тогда, когда клиент MQ подключается к MQ Manager, работающему на том же хосте, что и клиентский код, но НЕ, когда клиентский код подключается к диспетчеру MQ на удаленном хосте.Используйте mq-клиент, чтобы получить имя очереди базового объекта Alias ​​Queue

Client Код:

MQEnvironment.hostname = "192.168.1.3"; 
MQEnvironment.port = "1415"; 
MQEnvironment.channel = "ADMIN.SVRCONN"; 

MQQueueManager mqQueueManager = new MQQueueManager(null); 

int openOptions = CMQC.MQOO_BROWSE;// + CMQC.MQOO_RESOLVE_LOCAL_Q; 

MQQueue mqQueue = mqQueueManager.accessQueue("AN.ALIAS.QUEUE.NAME", openOptions); 

String resolvedName = mqQueue.getResolvedQName(); 

// resolvedName is null when the MQ Manager is on a remote host 
System.out.println("Resolved Queue Name: " + resolvedName); 

Когда разрешенное имя очереди псевдонимов очереди пустое, журналы ошибок Музейного диспетчера показывает следующую одну записи:

AMQ9208: Error on receive from host devlaptop (192.168.1.5). 

EXPLANATION: 
An error occurred receiving data from devlaptop (192.168.1.5) over TCP/IP. 
This may be due to a communications failure. 
ACTION: 
The return code from the TCP/IP (recv) call was 10054 (X'2746'). Record these 
values and tell the systems administrator. 

Если это возможно для клиента кода, чтобы получить имя базового объекта удаленного псевдонима MQ Manager? И если да, то как? Я где-то пропускаю удаленные разрешения? Или мой код клиента openOptions не так ли?

ПРИМЕЧАНИЕ. Очередь псевдонимов или любые другие очереди в менеджерах очереди не кластеризованы.

ответ

2

Я был в состоянии получить имя очереди базового объекта Очередь Alias, используя следующий код:

int openOptions = CMQC.MQOO_INQUIRE; 

    MQQueue mqQueue = mqQueueManager.accessQueue("AN.ALIAS.QUEUE.NAME", openOptions); 
    int[] selectors = new int[1]; 
    int[] intAttrs = new int[1]; 
    byte[] charAttrs = new byte[64]; 
    selectors[0] = CMQC.MQCA_BASE_OBJECT_NAME; 
    mqQueue.inquire(selectors, intAttrs, charAttrs); 

    logger.trace("baseObjectName:{}", new String(charAttrs).trim()); 

Я бы приветствовал любые замечания по этому решению или альтернативное более простое решение, если оно существует?

3

То, что вы видите на сервере, - это закрытие клиента, не закрывая соединение. TCP закрывает его, и QMgr испускает ошибку, которую вы видите в журналах QMgr. Если клиент получил ошибку, вы увидите, что он возвращается клиенту.

Вопрос не указывает, является ли псевдоним, который вы пытаетесь открыть, кластеризованным или нет. Если он сгруппирован, мы ожидаем, что разрешенное имя будет пустым в соответствии с документами. В этом случае OPEN разрешает очередь передачи, но приложение не сообщает, какой из них. В возвращаемом дескрипторе приложение видит, что разрешенная очередь и имя QMgr остаются пустыми.

Об этом говорится в разделе Name Resolution в Центре знаний. Обратитесь к строке таблицы с Blank менеджера очередей в колонке 1 и очереди Псевдонима с атрибутом КЛАСТЕРНОЙ в колонке 2.

+0

@T, как вы объяснили, закрытие клиента, не закрывая соединение, должно быть связано с тем, что я убиваю приложение и поэтому не предоставляю приложению возможность запускать 'mqQueue.close();' и 'mqManager.close (); '. Что касается самой очереди Alias, я могу подтвердить, что она НЕ сгруппирована. –

+0

В этом случае обновите вопрос с помощью значений, используемых для заполнения QMgr и имени очереди для 'OPEN'. –

+0

@JoshMc, целью очереди псевдонимов является локальная очередь, которая также не кластеризована. Внутри этих менеджеров очереди нет кластеризованных очередей. –

Смежные вопросы