IBM MQ API 出口参数结构 (MQAXP)

MQAXP 结构 (外部控制块) 用作 API 出口的输入或输出参数。 本主题还提供了有关队列管理器如何处理出口函数的信息。

MQAXP 具有以下 C 声明:
typedef struct tagMQAXP {
  MQCHAR4   StrucId;           /* Structure identifier */
  MQLONG    Version;           /* Structure version number */
  MQLONG    ExitId;            /* Exit Identifier */
  MQLONG    ExitReason;        /* Exit invocation reason */
  MQLONG    ExitResponse;      /* Response code from exit */
  MQLONG    ExitResponse2;     /* Secondary response code from exit */
  MQLONG    Feedback;          /* Feedback code from exit */
  MQLONG    APICallerType;     /* MQSeries API caller type */
  MQBYTE16  ExitUserArea;      /* User area for use by exit */
  MQCHAR32  ExitData;          /* Exit data area */
  MQCHAR48  ExitInfoName;      /* Exit information name */
  MQBYTE48  ExitPDArea;        /* Problem determination area */
  MQCHAR48  QMgrName;          /* Name of local queue manager */
  PMQACH    ExitChainAreaPtr;  /* Inter exit communication area */
  MQHCONFIG Hconfig;           /* Configuration handle */
  MQLONG    Function;          /* Function Identifier */
  /* Ver:1 */
  MQHMSG    ExitMsgHandle      /* Exit message handle
  /* Ver:2 */
};
调用 API 出口中的函数时,将传递以下参数列表:
StrucId (MQCHAR4)-输入
出口参数结构标识,值为:
MQAXP_STRUC_ID.
出口处理程序将入口上的此字段设置为每个出口函数。
版本 (MQLONG)-输入
结构版本号,值为:
MQAXP_VERSION_1
V 1 API 出口参数结构。
MQAXP_VERSION_2
V 2 API 出口参数结构。
MQAXP_CURRENT_VERSION
API 出口参数结构的当前版本号。
出口处理程序将入口上的此字段设置为每个出口函数。
ExitId (MQLONG)-输入
出口标识,在进入出口例程时设置,指示出口类型:
MQXT_API_EXIT
API 出口。
ExitReason (MQLONG)-输入
调用出口的原因 (在进入每个出口函数时设置):
MQXR_CONNECTION
正在调用出口以在 MQCONN 或 MQCONNX 调用之前初始化自身,或者在 MQDISC 调用之后结束自身。
MQXR_BEFORE
正在执行 API 调用之前或在 MQGET 上转换数据之前调用出口。
MQXR_AFTER
正在执行 API 调用后调用出口。
ExitResponse (MQLONG)-输出
来自出口的响应,在进入每个出口函数时初始化为:
MQXCC_OK
正常继续。
此字段必须由出口函数设置,以便将执行出口函数的结果传达给队列管理器。 值必须为以下其中一项:
MQXCC_OK
出口功能已成功完成。 正常继续。

此值可由所有 MQXR_ * 出口函数设置。 ExitResponse2 用于决定是否稍后在链中调用出口函数。

MQXCC_FAILED
由于发生错误,退出函数失败。
此值可由所有 MQXR_ * 出口函数设置。 队列管理器将 CompCode 设置为 MQCC_FAILED ,并将原因设置为:
  • MQRC_API_EXIT_INIT_ERROR (如果函数为 MQ_INIT_EXIT)
  • MQRC_API_EXIT_TERM_ERROR (如果函数为 MQ_TERM_EXIT)
  • 所有其他出口函数的 MQRC_API_EXIT_ERROR
该值集可以由链中稍后的出口函数进行更改。

ExitResponse2 被忽略; 队列管理器继续处理,就像返回了 MQXR2_SUPPRESS_CHAIN 一样。

MQXCC_SUPPRESS_FUNCTION
禁止 IBM® MQ API 函数。

此值只能由 MQXR_BEFORE 出口函数设置。 它会绕过 API 调用。 如果由 MQ_DATA_CONV_ON_GET_EXIT 返回,那么将绕过数据转换。 队列管理器将 CompCode 设置为 MQCC_FAILED ,将 "原因" 设置为 MQRC_SUPPRESSED_BY_EXIT ,但该值集可以由链中稍后的出口函数进行更改。 当出口留下这些参数时,将保留该调用的其他参数。 ExitResponse2 用于决定是否稍后在链中调用出口函数。

如果此值由 MQXR_AFTER 或 MQXR_CONNECTION 出口函数设置,那么队列管理器将继续处理,就像已返回 MQXCC_FAILED 一样。

MQXCC_SKIP_FUNCTION
跳过 IBM MQ API 函数。

此值只能由 MQXR_BEFORE 出口函数设置。 它会绕过 API 调用。 如果由 MQ_DATA_CONV_ON_GET_EXIT 返回,那么将绕过数据转换。 出口函数必须将 CompCode 和 "原因" 设置为要返回到应用程序的值,但该设置的值可以由链中稍后的出口函数进行更改。 当出口留下这些参数时,将保留该调用的其他参数。 ExitResponse2 用于决定是否稍后在链中调用出口函数。

如果此值由 MQXR_AFTER 或 MQXR_CONNECTION 出口函数设置,那么队列管理器将继续处理,就像已返回 MQXCC_FAILED 一样。

MQXCC_SUPPRESS_EXIT
禁止属于出口集的所有出口函数。

此值只能由 MQXR_BEFORE 和 MQXR_AFTER 出口函数设置。 它会绕过属于此逻辑连接的这组出口的出口函数的 所有 后续调用。 当使用 ExitReason MQXR_CONNECTION 调用 MQ_TERM_EXIT 函数时,此绕过将一直持续到发生逻辑断开连接请求。

出口函数必须将 CompCode 和 "原因" 设置为要返回到应用程序的值,但该设置的值可以由链中稍后的出口函数进行更改。 当出口留下这些参数时,将保留该调用的其他参数。 将忽略 ExitResponse2 。

如果此值由 MQXR_CONNECTION 出口函数设置,那么队列管理器将继续处理,就像已返回 MQXCC_FAILED 一样。

有关 ExitResponse 与 ExitResponse2之间的交互及其对出口处理的影响的信息,请参阅 队列管理器如何处理出口函数
ExitResponse2 (MQLONG)-输出
这是辅助出口响应代码,用于限定 MQXR_BEFORE 出口函数的主出口响应代码。 它已初始化为:
MQXR2_DEFAULT_CONTINUATION
在进入 IBM MQ API 调用出口函数时。 然后,可以将其设置为下列其中一个值:
MQXR2_DEFAULT_CONTINUATION
是否继续链中的下一个出口,具体取决于 ExitResponse的值。

如果 ExitResponse 是 MQXCC_SUPPRESS_FUNCTION 或 MQXCC_SKIP_FUNCTION ,请稍后绕过 MQXR_BEFORE 链中的出口函数和 MQXR_AFTER 链中的匹配出口函数。 调用 MQXR_AFTER 链中与 MQXR_BEFORE 链中较早的出口函数匹配的出口函数。

否则,调用链中的下一个出口。

MQXR2_SUPPRESS_CHAIN
抑制链。

对于此 API 调用,绕过 MQXR_BEFORE 链中稍后的出口函数以及 MQXR_AFTER 链中的匹配出口函数。 调用 MQXR_AFTER 链中与 MQXR_BEFORE 链中较早的出口函数匹配的出口函数。

MQXR2_CONTINUE_CHAIN
继续链中的下一个出口。
有关 ExitResponse 与 ExitResponse2之间的交互及其对出口处理的影响的信息,请参阅 队列管理器如何处理出口函数
反馈 (MQLONG)-输入/输出
在退出函数调用之间传递反馈代码。 此操作初始化为:
MQFB_NONE (0)
在调用链中的第一个出口的第一个函数之前。

出口可以将此字段设置为任何值,包括任何有效的 MQFB_ * 或 MQRC_ * 值。 出口还可以将此字段设置为 MQFB_APPL_FIRST 到 MQFB_APPL_LAST 范围内的用户定义的反馈值。

APICallerType (MQLONG)-输入
API 调用者类型,指示 IBM MQ API 调用者是队列管理器的外部还是内部: MQXACT_EXTERNAL 还是 MQXACT_INTERNAL。
ExitUserAreaMQBYTE16) - 输入/输出
用户区域,可供与特定ExitInfoObject 关联的所有出口使用。 在调用 hconn 的第一个退出函数(MQ_INIT_EXIT)之前,它被初始化为 MQXUA_NONE(ExitUserArea 的长度为二进制零)。 从那时起,将在同一出口的函数调用中保留出口函数对此字段所作的任何更改。

此字段与 4 MQLONG 的倍数对齐。

出口还可以锚定他们从此区域分配的任何存储器。

对于每个 hconn,出口链中的每个出口都有不同的ExitUserArea。 ExitUserArea)不能被链中的出口共享,一个出口的ExitUserArea内容不能提供给链中的另一个出口。

对于 C 程序,常量 MQXUA_NONE_ARRAY 也使用与 MQXUA_NONE 相同的值定义,但定义为字符数组而不是字符串。

此字段的长度由 MQ_EXIT_USER_AREA_LENGTH 指定。

ExitData (MQCHAR32)-输入
出口数据,在每个出口函数的输入上设置为出口中提供的特定于出口的数据的 32 个字符。 如果在出口中未定义任何值,那么此字段全部为空白。

此字段的长度由 MQ_EXIT_DATA_LENGTH 指定。

ExitInfoNameMQCHAR48) - 输入
出口信息名称,在输入到每个出口函数时设置为各节出口定义中指定的ApiExit_name。
ExitPDArea (MQBYTE48)-输入/输出
对于出口函数的每次调用,初始化为 MQXPDA_NONE (字段长度为二进制零) 的问题确定区域。

对于 C 程序,常量 MQXPDA_NONE_ARRAY 也定义为具有与 MQXPDA_NONE 相同的值,但定义为字符数组而不是字符串。

出口处理程序始终在出口结束时将此区域写入 IBM MQ 跟踪,即使在该函数成功时也是如此。

此字段的长度由 MQ_EXIT_PD_AREA_LENGTH 提供。

QMgrName (MQCHAR48)-输入
应用程序连接到的队列管理器的名称,该队列管理器由于处理 IBM MQ API 调用而调用了出口。

如果 MQCONN 或 MQCONNX 调用上提供的队列管理器的名称为空,那么无论应用程序是服务器还是客户机,此字段仍设置为应用程序所连接的队列管理器的名称。

出口处理程序将入口上的此字段设置为每个出口函数。

此字段的长度由 MQ_Q_MGR_NAME_LENGTH 提供。

ExitChainAreaPtr(PMQACH) - 输入/输出
这用于在链中不同出口的调用之间传递数据。 在调用出口链中第一个出口的第一个函数 (带有 ExitReason MQXR_CONNECTION 的 MQ_INIT_EXIT) 之前,将其设置为 NULL 指针。 出口在一次调用时返回的值将传递到下一次调用。

有关如何使用出口链区域的更多详细信息,请参阅 出口链区域和出口链区域头 (MQACH)

Hconfig (MQHCONFIG)-输入
配置句柄,表示正在初始化的函数集。 此值由 MQ_INIT_EXIT 函数上的队列管理器生成,稍后将传递到 API 出口函数。 它设置在每个出口函数的入口上。

您可以使用 Hconfig 作为 MQIEP 结构的指针来执行 MQI 和 DCI 调用。 在将 HConfig 参数用作 MQIEP 结构的指针之前,必须检查 HConfig 的前 4 个字节是否与 MQIEP 结构的 StrucId 匹配。

函数 (MQLONG)-输入
函数标识,有效值为 外部常量中描述的 MQXF_ * 常量。

根据导致调用出口的 IBM MQ API 调用,出口处理程序在进入每个出口函数时将此字段设置为正确的值。

ExitMsgHandle(MQHMSG) - 输入/输出
当函数为 MQXF_GET 且 ExitReason 为 MQXR_AFTER 时,将在此字段中返回有效消息句柄,允许 API 出口访问消息描述符字段以及在注册 API 出口时与 MQXEPO 结构中指定的 ExitProperties 字符串相匹配的任何其他属性。

在ExitMsgHandle中返回的任何非消息描述符属性都不能从 MQGMO 结构(如果已指定)中的MsgHandle或消息数据中获取。

当 Function 为 MQXF_GET 且ExitReason为 MQXR_BEFORE 时,如果退出程序将此字段设置为 MQHM_NONE,则会抑制ExitMsgHandle属性的填充。

如果版本低于 MQAXP_VERSION_2,那么不会设置此字段。

队列管理器如何处理出口函数

队列管理器在从出口函数返回时执行的处理取决于 ExitResponse 和 ExitResponse2。

表 1 汇总了 MQXR_BEFORE 出口函数的可能组合及其影响,显示:
  • 设置 API 调用的 CompCode 和 Reason 参数的人员
  • 是否调用 MQXR_BEFORE 链中的其余出口函数以及 MQXR_AFTER 链中的匹配出口函数
  • 是否调用 API 调用
对于 MQXR_AFTER 出口函数:
  • 以与 MQXR_BEFORE 相同的方式设置 CompCode 和 Reason
  • 将忽略 ExitResponse2 (将始终调用 MQXR_AFTER 链中的其余出口函数)
  • MQXCC_SUPPRESS_FUNCTION 和 MQXCC_SKIP_FUNCTION 无效
对于 MQXR_CONNECTION 出口函数:
  • 以与 MQXR_BEFORE 相同的方式设置 CompCode 和 Reason
  • ExitResponse2 被忽略
  • MQXCC_SUPPRESS_FUNCTION , MQXCC_SKIP_FUNCTION 和 MQXCC_SUPPRESS_EXIT 无效
在所有情况下,如果出口或队列管理器设置了 CompCode 和 Reason ,那么可以通过稍后调用的出口或通过 API 调用 (如果稍后调用 API 调用) 来更改值集。
表 1. MQXR_BEFORE 出口处理
ExitResponse 的值 CompCode 和原因集 ExitResponse2 的值 (缺省延续) 链 ExitResponse2 (缺省延续) API 的值
MQXCC_OK 出口 Y Y
MQXCC_SUPPRESS_EXIT 出口 Y Y
MQXCC_SUPPRESS_FUNCTION 队列管理器 N N
MQXCC_SKIP 函数 出口 N N
MQXCC_FAILED 队列管理器 N N

客户机如何处理出口函数

通常,客户机处理出口函数的方式与服务器应用程序处理出口函数的方式相同,此结构中的 QMgrName 属性适用 (无论该函数是在服务器上还是在客户机上)。

不过,客户端没有mqs.ini文件的概念,因此ApiExitCommonAPIExitTemplate这两节并不适用。 只有ApiExitLocal节段适用,该节段在mqclient.ini文件中配置。