根活动

DFH0SAL1 程序通过启动在事务标识 SALE 下运行的 DFH0SAL2 程序来启动销售业务事务的新实例。 DFH0SAL2 实现一个根活动,用于管理组成 "销售" 业务交易的子活动的相互关系,排序和执行。

根活动程序 (例如 DFH0SAL2 ) 旨在由 CICS® 业务事务服务在触发其感兴趣的事件时重新连接。 活动程序会确定导致其连接的可能事件中的哪些事件以及作为结果执行的操作。 典型序列 (简化) 为:
  1. 根活动请求 BTS 运行子活动 (可能有多个子活动) ,并在子活动完成时通知该活动。
  2. 根活动 休眠 ,等待子活动完成。
  3. BTS 重新连接根活动,因为子活动已完成。
  4. 根活动请求运行下一个子活动。
  5. 重复步骤 14 ,直到业务事务完成为止。

因此,即使根活动不是从终端启动的,您也可以将其样式视为 伪会话式

图1 展示了Sale根活动程序 DFH0SAL2 的 COBOL 伪代码。
图 1。 DFH0SAL2的伪代码,销售业务交易的根活动程序 (第 1 部分)
Identification Division.
Program-id. DFH0SAL2.
Environment Division.
Data Division.
Working-Storage Section.
01  RC                           pic s9(8) comp.
01  Process-Name                 pic x(36).
01  Event-Name                   pic x(16).
    88  DFH-Initial              value 'DFHINITIAL'.
    88  Delivery-Complete        value 'Delivry-Complete'.
    88  Invoice-Complete         value 'Invoice-Complete'.
    88  Payment-Complete         value 'Payment-Complete'.
01  Sale-Container               pic x(16) value 'Sale'.
01  Order-Container              pic x(16) value 'Order'.
01  Order-Buffer                 pic x(..).
01  Delivery-Container           pic x(16) value 'Delivery'.
01  Delivery-Buffer              pic x(..).
01  Invoice-Container            pic x(16) value 'Invoice'.
01  Invoice-Buffer               pic x(..).
Linkage Section.
01  DFHEIBLK.
    .
Procedure Division.
Begin-Process.
      .
    EXEC CICS RETRIEVE REATTACH EVENT(Event-Name)
             RESP(RC) END-EXEC
      .
    If RC NOT = DFHRESP(NORMAL)
      .
    End-If.
      .
    Evaluate True
      When DFH-Initial
        Perform Initial-Activity
        Perform Order-Activity
        Perform Delivery-Activity
      When Delivery-Complete
        Perform Invoice-Activity
      When Invoice-Complete
        Perform Payment-Activity
      When Payment-Complete
        Perform End-Process
      When Other
        .
    End Evaluate.
        .
    EXEC CICS RETURN END-EXEC
    .
图 2。 DFH0SAL2的伪代码,销售业务交易的根活动程序 (第 2 部分)
Initial-Activity.
    .
    EXEC CICS ASSIGN PROCESS(Process-Name)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
Order-Activity.
    .
    EXEC CICS DEFINE ACTIVITY('Order')
                 TRANSID('SORD')
                 PROGRAM('ORD001')
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS PUT CONTAINER(Sale-Container)
                 ACTIVITY('Order') FROM(Process-Name)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS LINK ACTIVITY('Order')
             RESP(data-area) RESP2(data-area) END-EXEC
    .
Delivery-Activity.
    .
    EXEC CICS DEFINE ACTIVITY('Delivery')
                 TRANSID('SDEL')
                 EVENT('Delivry-Complete')
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS GET CONTAINER(Order-Container)
                 ACTIVITY('Order') INTO(Order-Buffer)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS PUT CONTAINER(Order-Container)
                 ACTIVITY('Delivery') FROM(Order-Buffer)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS RUN ACTIVITY('Delivery')
                 ASYNCHRONOUS
             RESP(data-area) RESP2(data-area) END-EXEC
    .
图 3。 DFH0SAL2的伪代码,销售业务交易的根活动程序 (第 3 部分)
Invoice-Activity.
    .
    EXEC CICS DEFINE ACTIVITY('Invoice')
                 TRANSID('SINV')
                 EVENT('Invoice-Complete')
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS GET CONTAINER(Delivery-Container)
                  ACTIVITY('Delivery') INTO(Delivery-Buffer)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS PUT CONTAINER(Delivery-Container)
                  ACTIVITY('Invoice') FROM(Delivery-Buffer)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS RUN ACTIVITY('Invoice')
                 ASYNCHRONOUS
             RESP(data-area) RESP2(data-area) END-EXEC
    .
Payment-Activity.
    .
    EXEC CICS DEFINE ACTIVITY('Payment')
                 TRANSID('SPAY')
                 EVENT('Payment-Complete')
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS GET CONTAINER(Invoice-Container)
                  ACTIVITY('Invoice') INTO(Invoice-Buffer)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS PUT CONTAINER(Invoice-Container)
                  ACTIVITY('Payment') FROM(Invoice-Buffer)
             RESP(data-area) RESP2(data-area) END-EXEC
    .
    EXEC CICS RUN ACTIVITY('Payment')
                 ASYNCHRONOUS
             RESP(data-area) RESP2(data-area) END-EXEC
    .
End-Process.
    .
    EXEC CICS RETURN ENDACTIVITY
             RESP(data-area) RESP2(data-area) END-EXEC
End Program.
以下讨论步骤通过 图 1中显示的 DFH0SAL2 伪代码:
  1. 根活动通过发出以下命令来确定导致其连接的事件:
        EXEC CICS RETRIEVE REATTACH EVENT(Event-Name)
                 RESP(data-area) RESP2(data-area) END-EXEC

    在进程期间首次启动活动时,返回的事件是系统事件 DFHINITIAL。 此事件告知活动执行任何初始清理。

    在此示例中, CICS 最初调用 DFH0SAL2 根活动,作为 DFH0SAL1 程序发出的 RUN ACQPROCESS 命令的结果。 作为其初始清理的一部分, DFH0SAL2 使用 EXEC CICS ASSIGN PROCESS 命令来发现业务事务 (进程) 的此实例的名称。 (流程实例的名称由 DEFINE PROCESS 命令指定,例如,可能是客户引用或帐号。)

  2. 根活动将创建其第一个子活动,在本例中为 Order 活动:
         EXEC CICS DEFINE ACTIVITY('Order')
                      TRANSID('SORD')
                      PROGRAM('ORD001')
                  RESP(data-area) RESP2(data-area) END-EXEC

    DEFINE ACTIVITY 命令请求 CICS 业务事务服务向业务事务 (进程) 添加活动。 在此示例中, DFH0SAL2 将名为 Order 的活动添加到销售业务交易。 它由程序 ORD001实现。 TRANSID 选项指定如果 Order 活动在其自己的工作单元中运行,那么它将在事务标识 SORD 下运行。

  3. 添加 Order 活动后, DFH0SAL2 会使用 PUT CONTAINER 命令为其提供一些输入数据。
        EXEC CICS PUT CONTAINER(Sale-Container)
                 ACTIVITY('Order') FROM(Process-Name)
                 RESP(data-area) RESP2(data-area) END-EXEC

    输入数据放置在名为 销售 的数据容器中 (变量 销售-容器的值)。 PUT CONTAINER 的 ACTIVITY 选项将 销售 数据容器与 "订单" 活动相关联。

    注: 活动可以具有许多与其关联的数据容器。 通过在指定活动的命令 (例如 PUT CONTAINER) 上指定数据容器与该活动相关联。

    两个或多个活动可以各有一个名为 Order的数据容器。

    放入 销售 数据容器中的数据是流程名称; 即,标识此销售业务交易实例的唯一引用。 在这种情况下,进程名称是在 DFH0SAL1中的 DEFINE PROCESS 命令上指定的客户引用或帐号。

  4. DFH0SAL2 请求 BTS 启动 Order 活动:
        EXEC CICS LINK ACTIVITY('Order')
                 RESP(data-area) RESP2(data-area) END-EXEC

    LINK ACTIVITY 命令使 ORD001 程序与 DFH0SAL2 同步执行,并作为当前工作单元的一部分包含在内。 DEFINE ACTIVITY 命令的 TRANSID 选项被忽略-LINK ACTIVITY 使 Order 活动在请求者 SALE 的事务标识下运行。

    "订单" 活动从终端操作员收集订单详细信息并对其进行验证。 ORD001 程序与终端操作员进行转换,直到接受订单为止。 然后,它将在输出数据容器中返回已验证的详细信息。

  5. 当 Order 活动完成时, DFH0SAL2 将创建 Delivery 活动:
         EXEC CICS DEFINE ACTIVITY('Delivery')
                      TRANSID('SDEL')
                      EVENT('Delivry-Complete')
                  RESP(data-area) RESP2(data-area) END-EXEC

    传递活动将与根活动异步执行。 当活动完成时,将触发其完成事件。 EVENT 选项 Delivery 活动的完成事件命名为 Delivry-Complete,从而对其进行定义。 定义事件允许对其进行引用和检查。

    CICS 在触发其事件池中的任何事件 (非 subevent) 时重新连接活动。 (活动的事件池包含已定义到该活动的事件以及 DFHINITIAL 系统事件。) 因此,在 Delivery 活动的完成事件 (Delivry-Complete) 触发时,将再次连接 DFH0SAL2 根活动。

    注: 所有子活动都有完成事件,这些事件在活动完成时触发。 如果未使用 DEFINE ACTIVITY 的 EVENT 选项,那么 CICS 将为完成事件提供与活动本身相同的名称。

    对于始终与父代 同步 执行的子活动 (例如 Order 活动) ,不经常使用 EVENT 选项。 通常,触发同步活动的完成事件不会导致重新连接父级,因为在当前激活父级期间将删除该事件 (通过 CHECK ACTIVITY 命令)。 因此,在其他几个可能的重新连接事件中,从不需要按名称对事件进行测试。

    处理 BTS 错误和响应代码中描述了 CHECK ACTIVITY 命令。

  6. DFH0SAL2 使 Order 活动返回的数据可用于 Delivery 活动:
        EXEC CICS GET CONTAINER(Order-Container)
                      ACTIVITY('Order') INTO(Order-Buffer)
                 RESP(data-area) RESP2(data-area) END-EXEC
     
        EXEC CICS PUT CONTAINER(Order-Container)
                      ACTIVITY('Delivery') FROM(Order-Buffer)
                 RESP(data-area) RESP2(data-area) END-EXEC

    此处, GET 和 PUT 命令用于将数据从 Order 活动的输出数据容器传输到 Delivery 活动的输入数据容器 (这两个数据容器都名为 Order)。 这些是不同的数据容器,尽管它们共享相同的名称,但它们与不同的活动相关联。

  7. DFH0SAL2 请求 BTS 启动 Delivery 活动:
        EXEC CICS RUN ACTIVITY('Delivery')
                      ASYNCHRONOUS
                 RESP(data-area) RESP2(data-area) END-EXEC

    由于使用的是 RUN 而不是 LINK ,因此交付活动将作为单独的工作单元执行,并在 DEFINE ACTIVITY 命令的 TRANSID 选项上指定的事务标识下执行。 (RUN 命令始终在新的工作单元中激活指定的进程或活动。) 由于使用了 ASYNC 选项,因此将通过 DFH0SAL2异步执行 Delivery 活动,并且仅当当前工作单元成功完成时才会启动。

  8. DFH0SAL2 发出 EXEC CICS RETURN 命令。 因为其事件池中存在用户事件; "传递" 活动的完成事件; 根活动未完成但变为休眠。 控制权将返回到 DFH0SAL1,然后返回到 MNU001,最后返回到 CICS。 CICS 采用同步点并落实以下内容:
    • 创建新的销售业务交易
    • Order 活动所完成的工作及其输入和输出数据; 容器
    • 运行 Delivery 活动的请求及其输入数据容器
    • 要重新激活 DFH0SAL2 根活动的条件。

    在 CICS 同步点之后,将在用户终端上再次显示业务事务菜单,以供进一步选择。 其余活动在 CICS 业务事务服务的控制下完成,而不引用终端用户。 DFH0SAL2 程序不再存在于内存中,并且只有 BTS 知道此销售业务交易实例是否存在。

    CICS 业务事务服务根据请求启动交付活动 (SDEL)。 (BTS 作为事务的资源管理器参与。) 完成交付活动后, BTS 将重新激活 "销售" 根活动; 即,事务标识 SALE 下的 DFH0SAL2 程序。

  9. DFH0SAL2 程序再次在顶部输入,因此通过发出 RETRIEVE REATTACH EVENT 命令来确定导致其重新激活的事件。 但是,这次返回的事件为 Delivry-Complete。 在确定哪个子活动已完成之后, DFH0SAL2 确定要启动的下一个活动是 "发票" 活动。

    与 "交付" 活动一样, DFH0SAL2 在请求要运行的活动之前设置 "发票" 活动,输入数据和执行选项的参数。 然后,它发出 EXEC CICS RETURN 命令,并处于休眠状态,等待对此销售业务交易实例重新激活。

  10. 将重复步骤 9 中隐含的模式,直到 "支付" 活动完成为止,此时 "销售" 业务交易已完成。 DFH0SAL2 发出 EXEC CICS RETURN 命令,在该命令上指定了 ENDACTIVITY 选项。 此选项向 CICS 指示根活动的处理已完成,并且不再希望在发生已定义事件或系统事件时重新激活根活动。 业务事务结束。