【问题标题】:Use mq client to get Alias Queue's base object queue name使用 mq 客户端获取 Alias Queue 的基础对象队列名称
【发布时间】:2017-05-31 14:30:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: java ibm-mq mq


    【解决方案1】:

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

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

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

    【讨论】:

    • @T,正如您所解释的,客户端在没有关闭连接的情况下关闭一定是因为我正在杀死应用程序,因此没有给应用程序运行mqQueue.close();mqManager.close(); 的机会。关于别名队列本身,我可以确认它没有以任何方式聚集。
    • 在这种情况下,请使用用于填充 QMgr 和 OPEN 的队列名称的值更新问题。
    • @JoshMc,别名队列的目标是本地队列,也没有集群。这些队列管理器中根本没有集群队列。
    • @T.Rob,“值”是指打开选项在创建时传递给客户端的MQQueueManager,在尝试访问它时传递给客户端的MQQueue?如果是这样,那么对于队列管理器,当前传递的选项是 null,传递给别名队列的选项是 CMQC.MQOO_BROWSE - 请参阅问题中的内联代码。
    • 从帖子中不清楚“远程 MQ 管理器的别名队列的基本对象名称”是什么意思。如果 QMgr 是客户端连接的那个,根据定义它不是远程的。在这种情况下,绑定模式与客户端模式连接的名称解析工作方式应该没有区别。这表明队列在该词的 MQ 意义上是远程的,意思是“不在应用程序连接的 QMgr 上”,因此我询问集群的原因。很高兴你让它工作,但所述条件似乎相互排斥,因此不清楚实际问题是什么。
    【解决方案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());
    

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

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2020-09-10
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多