MQBACK-回退更改

MQBACK 调用向队列管理器指示将回退自最后一个同步点以来发生的所有消息获取和放置。

将删除作为工作单元的一部分放入的消息; 将在队列中恢复作为工作单元的一部分检索的消息。
  • z/OS®上,此调用仅由批处理程序 (包括 IMS 批处理 DL/I 程序) 使用。

语法

MQBACK (HconnCompcodeReason)

参数

Hconn
类型 :MQHCONN-输入

此句柄表示与队列管理器的连接。 先前的 MQCONN 或 MQCONNX 调用返回了 Hconn 的值。

CompCode
类型:MQLONG - 输出
完成代码;此完成代码为以下其中一项:
MQCC_OK
成功完成。
MQCC_WARNING
警告(部分完成)。
MQCC_FAILED
调用失败。

原因
类型:MQLONG - 输出
如果 CompCode 为 MQCC_OK:
MQRC_NONE
(0, X'000') 没有要报告的原因。
如果 CompCode 为 MQCC_WARNING:
MQRC_OUTCOME_PENDING
(2124,X'84C')后退操作结果待定。
如果 CompCode 是 MQCC_FAILED:
MQRC_ADAPTER_SERV_LOAD_ERROR
(2130, X'852') 无法装入适配器服务模块。
MQRC_API_EXIT_ERROR
(2374, X'946') API 出口失败。
MQRC_ASID_MISMATCH
(2157, X'86D') 主 ASID (Primary ASID) 与主 ASID (home ASID) 不同。
MQRC_CALL_IN_PROGRESS
(2219, X'8AB') 在先前调用完成前输入了 MQI 调用。
MQRC_CF_STRUC_IN_USE
(2346,X'92A')使用中的耦合设施结构。
MQRC_CONNECTION_BROKEN
(2009, X'7D9') 与队列管理器的连接丢失。
MQRC_ENVIRONMENT_ERROR
(2012, X'7DC') 调用在环境中无效。
MQRC_HCONN_ERROR
(2018, X'7E2') 连接句柄无效。
MQRC_OBJECT_DAMAGED
(2101 , X'835 ') 对象已损坏。
MQRC_OUTCOME_MIXED
(2123,X'84B') 提交或退出操作的结果是混合的。
MQRC_Q_MGR_STOPPING
(2162, X'872') 队列管理器正在关闭。
MQRC_RESOURCE_PROBLEM
(2102, X'836') 没有足够系统资源可用。
MQRC_STORAGE_MEDIUM_FULL
(2192 , X'890 ') 外部存储介质已满。
MQRC_STORAGE_NOT_AVAILABLE
(2071, X'817') 没有足够的存储空间可用。
MQRC_UNEXPECTED_ERROR
(2195, X'893') 发生了意外错误。

有关这些代码的详细信息,请参阅 消息和原因码

使用说明

  1. 仅当队列管理器自身协调工作单元时,才能使用此调用。 这可以是:
    • 本地工作单元,其中更改仅影响 MQ 资源。
    • 全局工作单元,其中的更改可能会影响属于其他资源管理器的资源以及影响 MQ 资源。
    有关本地和全局工作单元的更多详细信息,请参阅 MQBEGIN-Begin 工作单元
  2. 在队列管理器未协调工作单元的环境中,请使用相应的回退调用而不是 MQBACK。 环境还可能支持由应用程序异常终止导致的隐式回退。
    • z/OS上,使用以下调用:
      • 如果工作单元仅影响 MQ 资源,那么批处理程序 (包括 IMS 批处理 DL/I 程序) 可以使用 MQBACK 调用。 但是,如果工作单元同时影响 MQ 资源和属于其他资源管理器的资源 (例如 Db2® ) ,请使用 z/OS 可恢复资源服务 (RRS) 提供的 SRRBACK 调用。 SRRBACK 调用会回退对属于已启用 RRS 协调的资源管理器的资源的更改。
      • CICS® 应用程序必须使用 EXEC CICS SYNCPOINT ROLLBACK 命令来回退工作单元。 请勿将 MQBACK 调用用于 CICS 应用程序。
      • IMS 应用程序 (批处理 DL/I 程序除外) 必须使用 IMS 调用 (例如 ROLB ) 来回退工作单元。 请勿将 MQBACK 调用用于 IMS 应用程序 (批处理 DL/I 程序除外)。
    • IBM® i上,将此调用用于队列管理器协调的本地工作单元。 这意味着在作业级别不得存在落实定义,即,不得对作业发出带有 CMTSCOPE(*JOB) 参数的 STRCMTCTL 命令。
  3. 如果应用程序在工作单元中以未落实的更改结束,那么这些更改的处置取决于应用程序是正常结束还是异常结束。 请参阅 MQDISC-断开连接队列管理器 中的用法说明以获取更多详细信息。
  4. 当应用程序在逻辑消息的组或段中放置或获取消息时,队列管理器会保留与消息组和上次成功 MQPUT 和 MQGET 调用的逻辑消息相关的信息。 此信息与队列句柄相关联,并包括如下内容:
    • MQMD 中 GroupIdMsgSeqNumberOffsetMsgFlags 字段的值。
    • 消息是否是工作单元的一部分。
    • 对于 MQPUT 调用: 消息是持久消息还是非持久消息。
    队列管理器保留 三组 组和段信息,其中一组针对以下各项:
    • 最后一次成功的 MQPUT 调用 (这可以是工作单元的一部分)。
    • 从队列中除去消息的最后一次成功 MQGET 调用 (这可以是工作单元的一部分)。
    • 上次成功的 MQGET 调用,该调用浏览了队列上的消息 (这不能是工作单元的一部分)。

  5. 与 MQGET 调用相关联的信息将复原为当前工作单元中该队列句柄的第一次成功 MQGET 调用之前的值。

    在工作单元启动后由应用程序更新但在工作单元作用域之外的队列,如果工作单元回退,那么不会恢复其组和段信息。

    当回退工作单元时,将组和段信息恢复到其先前的值允许应用程序在多个工作单元之间传播由多个段组成的大型消息组或大型逻辑消息,并在其中一个工作单元发生故障时在消息组或逻辑消息中的正确位置重新启动。

    如果本地队列管理器只有有限的队列存储器,那么使用多个工作单元可能是有利的。 但是,应用程序必须保留足够的信息,以便在发生系统故障时能够在正确的位置重新启动放入或获取消息。

    有关如何在系统故障后的正确位置重新启动的详细信息,请参阅 MQPMO-Put 消息选项中描述的 MQPMO_LOGICAL_ORDER 选项,以及 MQGMO-Get-message 选项中描述的 MQGMO_LOGICAL_ORDER 选项。

    仅当队列管理器协调工作单元时,其余使用说明才适用。

  6. 工作单元具有与连接句柄相同的作用域。 必须使用同一连接句柄来执行影响特定工作单元的所有 MQ 调用。 使用另一个连接句柄发出的调用 (例如,另一个应用程序发出的调用) 会影响另一个工作单元。 请参阅 MQCONN-Connect 队列管理器 中描述的 Hconn 参数,以获取有关连接句柄作用域的信息。
  7. 只有作为当前工作单元的一部分放入或检索的消息才会受此调用影响。
  8. 在工作单元中发出 MQGET , MQPUT 或 MQPUT1 调用但从未发出落实或回退调用的长时间运行的应用程序可以使用不可用于其他应用程序的消息填充队列。 为了防止这种可能性,管理员必须将 MaxUncommittedMsgs 队列管理器属性设置为足以防止失控应用程序填充队列的值,但设置为足以允许期望的消息传递应用程序正常工作的值。

C 调用

MQBACK (Hconn, &CompCode, &Reason);
按如下所示声明参数:
MQHCONN  Hconn;     /* Connection handle */
MQLONG   CompCode;  /* Completion code */
MQLONG   Reason;    /* Reason code qualifying CompCode */

COBOL 调用

CALL 'MQBACK' USING HCONN, COMPCODE, REASON.
按如下所示声明参数:
**   Connection handle
 01  HCONN     PIC S9(9) BINARY.
**   Completion code
 01  COMPCODE  PIC S9(9) BINARY.
**   Reason code qualifying COMPCODE
 01  REASON    PIC S9(9) BINARY.

PL/I 调用

call MQBACK (Hconn, CompCode, Reason);
按如下所示声明参数:
dcl Hconn     fixed bin(31);  /* Connection handle */
dcl CompCode  fixed bin(31);  /* Completion code */
dcl Reason    fixed bin(31);  /* Reason code qualifying CompCode */

高级汇编程序调用

CALL MQBACK,(HCONN,COMPCODE,REASON)
按如下所示声明参数:
HCONN     DS  F  Connection handle
COMPCODE  DS  F  Completion code
REASON    DS  F  Reason code qualifying COMPCODE

Visual Basic 调用

MQBACK Hconn, CompCode, Reason
按如下所示声明参数:
Dim Hconn    As Long 'Connection handle'
Dim CompCode As Long 'Completion code'
Dim Reason   As Long 'Reason code qualifying CompCode'