【问题标题】:Getting resolved queue name for an alias queue in mq api exit在 mq api 出口中获取别名队列的已解析队列名称
【发布时间】:2012-12-15 03:16:26
【问题描述】:

我试图通过查看对象描述符 (MQOD) 的 ResolvedQName 字段在 open_after 和 put1_before API 退出中获取已解析的队列名称(即别名队列的基本队列名称)。但它似乎不包含这些出口中的基本队列名称(即,要么是空白,要么是一些意想不到的值,例如......'1.59.15')。但是,我可以看到 ObjectName 已使用别名队列名称正确设置。为清楚起见,我的别名队列和基本队列都具有相同的本地 QM。

所以我想知道在使用别名队列进行 (open + put) 或 put1 调用时是否可以在 MQ API 出口中获取已解析的队列名称。任何帮助将不胜感激。

【问题讨论】:

    标签: api queue alias ibm-mq exit


    【解决方案1】:

    我猜你正在使用MQPMO_SYNCPOINT 选项?您是否也在使用MQPMO_SYNC_RESPONSE 选项?请参阅MQPUT1 主题的最后一条说明:

    当使用 MQPMO_SYNCPOINT 发出 MQPUT1 调用时,默认 行为发生变化,这样put操作就完成了 异步。这可能会导致某些人的行为发生变化 依赖于 MQOD 和 MQMD 中某些字段的应用程序 返回的结构,但现在包含未定义的值。一个 应用程序可以指定 MQPMO_SYNC_RESPONSE 以确保 put 操作是同步执行的,并且所有适当的 字段值已完成。

    换句话说,PUT1 被移交给 WMQ,并且在名称解析发生之前将控制权返回给程序。

    在任何情况下,PUT1_BEFORE 退出点都不会解析名称。假设指定了MQPMO_SYNC_RESPONSE,您应该能够在PUT1_AFTER 退出点找到它。

    如果您从 SupportPac MA0W 安装 API 出口,它会将所有控制块和标志解析为英文并格式化列表。如果您查看该出口的输出,您应该能够准确地看到哪些出口点和字段包含已解析的名称以及何时。

    因此,请务必指定 MQPMO_SYNC_RESPONSE 并考虑使用 MA0W API 出口作为参考和学习帮助。

    【讨论】:

    • 谢谢罗伯! MA0W 的痕迹让事情变得更加清晰。我没有指定您提到的任何 Put1 调用选项,但我的队列的默认响应类型设置为同步,所以我相信必须考虑到这一点。你是对的,PUT1_BEFORE exit 永远不会给出已解析的队列名称(有或没有 MQPMO_SYNCPOINT 选项)。但是在 OPEN_AFTER 退出中,我可以看到已解析的队列名称(如果 mqod 版本 = 3)。因此,知道在使用 put1 调用时找不到目标队列名称是有一些限制的。但是,PUT1_AFTER exit 会按照您的提示给出已解决的队列名称。
    【解决方案2】:

    您需要读取 cmqc.h 文件中的 MQOD 结构。仅当应用程序使用 MQOD 结构的版本 3(或更高版本)时,ResolvedQName 字段才可用。如果您检查 MQOD 的版本号,我敢打赌您会看到它是版本 1 或 2。

    注意:MQOD 的默认版本号是 1。因此,ResolvedQName 字段不可用。

    最后,MQGMO 和 MQPMO 结构都具有从结构版本 1 开始的 ResolvedQName 字段。

    【讨论】:

    • 谢谢罗杰! Yuo 对 MQOD 版本 3 是正确的,已解析的队列名称由队列管理器正确设置(在 OPEN_AFTER 退出中)。 MQGMO 和 MQPMO 也具有已解析的队列名称,但它们仅在 PUT_AFTER 出口中设置,而不在 PUT1_BEFORE 出口中设置。另外目前.net MQ API 使用的是版本1的MQOD结构,好像没办法改版本!!
    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多