【问题标题】:IMB PCF agent returns error while inquiring channel statusIMB PCF 代理在查询通道状态时返回错误
【发布时间】:2020-06-09 04:45:08
【问题描述】:

在查询通道以获取有关连接到给定队列管理器的主机的信息时,我遇到了 PCF 消息代理的问题。 PCFAgent的代码是

 MQGetMessageOptions getMessageOptions = new MQGetMessageOptions();
 getMessageOptions.options = MQC.MQGMO_BROWSE_NEXT + MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING;
 messageAgent = new PCFMessageAgent(MQEnvironment.hostname, MQEnvironment.port, MQEnvironment.channel);

选项代码是

 inquireOptions = new PCFMessage(CMQCFC.MQCMD_INQUIRE_CHANNEL_STATUS);
            inquireOptions.addParameter(CMQCFC.MQCACH_CHANNEL_NAME, "*");
            inquireOptions.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_TYPE, CMQC.MQOT_CURRENT_CHANNEL);
            inquireOptions.addParameter(CMQCFC.MQIACH_CHANNEL_INSTANCE_ATTRS, new int[]{
                    CMQCFC.MQCACH_CHANNEL_NAME, CMQCFC.MQCACH_CONNECTION_NAME, CMQCFC.MQIACH_MSGS,
                    CMQCFC.MQCACH_LAST_MSG_DATE, CMQCFC.MQCACH_LAST_MSG_TIME, CMQCFC.MQIACH_CHANNEL_STATUS
            });
            responses = messageAgent.send(inquireOptions); 

并非总是如此,但有时应用程序会返回“完成代码 2,原因 2100”的异常,并且我的主机(运行应用程序的主机)在服务器上留下一个挂起的连接,该连接在 MQManager 之前永远不会关闭已重新启动。

我了解到此异常是由于创建动态队列时发生冲突,但在我的代码中我没有创建任何队列。 有人可以帮助我吗?抱歉,我以前没有使用过队列管理器的经验。

谢谢

【问题讨论】:

    标签: java ibm-mq ibm-integration-bus


    【解决方案1】:

    2100 (MQRC_OBJECT_ALREADY EXISTS)确实是创建动态队列的问题。

    说明

    已发出 MQOPEN 调用以创建动态队列,但与动态队列同名的队列已存在。

    完成代码

    MQCC_FAILED

    程序员回应

    如果提供完整的动态队列名称,请确保它遵守动态队列的命名约定;如果是,请提供不同的名称,或者如果不再需要现有队列,则删除它。或者,允许队列管理器生成名称。

    如果队列管理器正在生成名称(部分或全部),请重新发出 MQOPEN 调用。

    在幕后,PCFMessageAgent 将使用您在PCFMessage 中提供的详细信息创建一个 PCF 格式消息,并将打开一个模型队列以创建一个临时队列,以便接收来自命令服务器的回复。这些临时队列由队列管理器通过使用时间戳生成唯一部分来命名,从而产生类似于AMQ.5E47207E2227AA02 的名称。如果您有很多并发应用程序这样做,那么您最终可能会出现名称冲突,同时第二个请求可能会出现名称冲突。

    如果您有办法让临时队列名称更加唯一,以防这种并发在您的系统中出现问题,您可以使用setReplyQueuePrefix 方法设置用于临时队列名称的前缀。例如,您可以使用每个应用程序运行时使用的用户 ID(如果该用户 ID 是唯一的)。

    public void setReplyQueuePrefix(java.lang.String prefixP)

    设置用作代理回复队列名称第一部分的字符串。 PCFAgent 使用的回复队列是一个临时的动态队列。默认情况下,PCFAgent 使用的回复队列前缀是空字符串 ("")。使用此选项时,回复队列的名称完全由队列管理器生成。如果使用指定的前缀调用该方法,则 PCFAgent 将在需要创建临时队列时将该前缀传递给队列管理器。然后队列管理器将生成其余的临时队列名称。这意味着队列管理器生成一个唯一的名称,但 PCFAgent 仍然有一些控制权。指定的前缀应少于 33 个字符。如果前缀包含 33 个或更多字符,则此方法会将前缀截断为 32 个字符的长度。如果前缀末尾不包含星号 (*) 字符,则会在末尾添加一个星号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 2012-11-14
      • 2019-09-28
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多