J'ai un code client MQ qui peut parcourir une file d'attente d'alias pour obtenir le nom d'objet de base de la file d'attente d'alias (c'est-à-dire le nom de la file d'attente locale vers laquelle pointe la file d'attente d'alias). Toutefois, le code fonctionne uniquement lorsque le client MQ se connecte à un gestionnaire MQ exécuté sur le même hôte que le code client, mais PAS lorsque le code client se connecte à un gestionnaire MQ sur un hôte distant.

Code 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);

Lorsque le nom de file d'attente résolu de la file d'attente d'alias est nul, les journaux d'erreurs de MQ Manager affichent l'entrée unique suivante:

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. 

Doit-il être possible pour le code client d'obtenir le nom d'objet de base de la file d'attente d'alias d'un MQ Manager distant? Et si oui, comment? Suis-je absent des autorisations à distance quelque part? Ou mon code client openOptions est-il erroné?

REMARQUE: la file d'attente d'alias ou toutes les autres files d'attente dans les gestionnaires de files d'attente ne sont PAS en cluster.

3
Going Bananas 16 janv. 2017 à 20:18

2 réponses

Meilleure réponse

J'ai pu obtenir le nom de la file d'attente d'objet de base de la file d'attente Alias ​​à l'aide du code suivant:

    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());

Je serais heureux de recevoir des commentaires sur cette solution ou une solution alternative plus simple si elle existe?

2
Going Bananas 18 janv. 2017 à 13:11

Ce que vous voyez sur le serveur, c'est que le client s'arrête sans fermer la connexion. TCP le ferme et le QMgr émet l'erreur que vous voyez dans les journaux QMgr. Si le client recevait une erreur, vous la verriez renvoyée au client.

La question ne spécifie pas si l'alias que vous essayez d'ouvrir est en cluster ou non. S'il est en cluster, nous nous attendons à ce que le nom résolu soit vide selon les documents. Dans ce cas, le OPEN se résout en une file d'attente de transmission mais l'application ne sait pas laquelle. Dans le descripteur renvoyé que l'application voit, la file d'attente résolue et le nom QMgr sont laissés vides.

Ceci est traité dans la section Résolution de noms dans le centre de connaissances. Reportez-vous à la ligne du tableau avec Gestionnaire de files d'attente vide dans la colonne 1 et File d'attente d'alias avec attribut CLUSTER dans la colonne 2.

3
T.Rob 16 janv. 2017 à 22:46