使用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());
我欢迎对此解决方案或更简单的替代解决方案(如果存在)提出任何意见?
我有 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());
我欢迎对此解决方案或更简单的替代解决方案(如果存在)提出任何意见?