我有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
错了吗?
注意:队列管理器中的别名队列或任何其他队列未进行群集。
答案 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());
我欢迎任何有关此解决方案的评论或其他更简单的解决方案(如果存在)?