使用mq客户端获取Alias Queue的基础对象队列名称

时间:2017-01-16 17:18:36

标签: java ibm-mq mq

我有MQ客户端代码,可以浏览Alias Queue以获取Alias Queue的基础对象名称(即Alias Queue指向的Local Queue的名称)。但是,只有当MQ客户端连接到与客户端代码在同一主机上运行的MQ Manager时,代码才有效,但在客户端代码连接到远程主机上的MQ Manager时则不行。

客户代码:

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

当Alias Queue的已解析队列名称为null时,MQ Manager的错误日志显示以下单个条目:

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的Alias Queue的基础对象名称?如果是这样,怎么样?我在某处丢失了远程权限吗?或者我的客户代码openOptions错了吗?

注意:队列管理器中的别名队列或任何其他队列未进行群集。

2 个答案:

答案 0 :(得分:3)

您在服务器上看到的是客户端在不关闭连接的情况下关闭。 TCP将其关闭,QMgr会发出您在QMgr日志中看到的错误。如果客户端收到错误,您会看到它返回给客户端。

该问题未指定您尝试打开的别名是否已群集。如果它是群集的,那么我们希望解析的名称根据文档为空。在这种情况下,OPEN解析为传输队列,但不告知应用程序是哪一个。在应用程序看到的返回句柄中,已解析的队列和QMgr名称保留为空。

知识中心的Name Resolution部分对此进行了介绍。请参阅第1列中带有空白队列管理器的表行和第2列中带有CLUSTER属性的别名队列

答案 1 :(得分: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());

我欢迎任何有关此解决方案的评论或其他更简单的解决方案(如果存在)?