2017-01-16 233 views
3

我有MQ客户端的代码,可以浏览别名队列,以获得别名队列的基本对象名称(即本地队列该别名队列指向名称)。但是,仅当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 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管理器的Alias队列的基础对象名称?如果是这样,怎么样?我在某处丢失了远程权限吗?或者我的客户代码openOptions错误?

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

回答

2

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

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

如果存在此解决方案或其他更简单的解决方案,欢迎您提出任何意见吗?

3

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

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

这是覆盖在知识中心上Name Resolution部分。请参阅表行与空白队列管理器在第1列和别名队列CLUSTER属性在列2

+0

@T,为你解释,客户端关闭而不关闭连接一定是因为我杀的应用程序,因此不会给应用程序运行的机会'mqQueue.close();'和'mqManager.close( );'。关于别名队列本身,我可以确认它不以任何方式聚集。 –

+0

在这种情况下,请使用用于填充“OPEN”的QMgr和队列名称的值更新问题。 –

+0

@JoshMc,别名队列的目标是一个本地队列,它也没有被聚集。这些队列管理器中完全没有群集队列。 –