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

Use mq client to get Alias Queue's base object queue name

我有 MQ 客户端代码,可以浏览别名队列以获取别名队列的基本对象名称(即别名队列指向的本地队列的名称)。但是,该代码仅在 MQ 客户端连接到与客户端代码位于同一主机上的 MQ 管理器 运行 时有效,但在客户端代码连接到远程主机上的 MQ 管理器时无效。

客户代码:

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

当别名队列的解析队列名称为空时,MQ 管理器的错误日志显示以下单个条目:

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 管理器的别名队列的基本对象名称?如果是这样,怎么办?我在某处缺少远程权限吗?还是我的客户端代码 openOptions 错了?

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

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

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

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

我能够使用以下代码获取别名队列的基本对象队列名称:

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

我欢迎对此解决方案或更简单的替代解决方案(如果存在)提出任何意见?