根活动
DFH0SAL1 程序通过启动在事务标识 SALE 下运行的 DFH0SAL2 程序来启动销售业务事务的新实例。 DFH0SAL2 实现一个根活动,用于管理组成 "销售" 业务交易的子活动的相互关系,排序和执行。
因此,即使根活动不是从终端启动的,您也可以将其样式视为 伪会话式
。
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
.
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
.
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.
- 根活动通过发出以下命令来确定导致其连接的事件:
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 命令指定,例如,可能是客户引用或帐号。)
- 根活动将创建其第一个子活动,在本例中为 Order 活动:
EXEC CICS DEFINE ACTIVITY('Order') TRANSID('SORD') PROGRAM('ORD001') RESP(data-area) RESP2(data-area) END-EXECDEFINE ACTIVITY 命令请求 CICS 业务事务服务向业务事务 (进程) 添加活动。 在此示例中, DFH0SAL2 将名为 Order 的活动添加到销售业务交易。 它由程序 ORD001实现。 TRANSID 选项指定如果 Order 活动在其自己的工作单元中运行,那么它将在事务标识 SORD 下运行。
- 添加 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 命令上指定的客户引用或帐号。
- DFH0SAL2 请求 BTS 启动 Order 活动:
EXEC CICS LINK ACTIVITY('Order') RESP(data-area) RESP2(data-area) END-EXECLINK ACTIVITY 命令使 ORD001 程序与 DFH0SAL2 同步执行,并作为当前工作单元的一部分包含在内。 DEFINE ACTIVITY 命令的 TRANSID 选项被忽略-LINK ACTIVITY 使 Order 活动在请求者 SALE 的事务标识下运行。
"订单" 活动从终端操作员收集订单详细信息并对其进行验证。 ORD001 程序与终端操作员进行转换,直到接受订单为止。 然后,它将在输出数据容器中返回已验证的详细信息。
- 当 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 命令。
- 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)。 这些是不同的数据容器,尽管它们共享相同的名称,但它们与不同的活动相关联。
- 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 活动,并且仅当当前工作单元成功完成时才会启动。
- DFH0SAL2 发出 EXEC CICS RETURN 命令。 因为其事件池中存在用户事件; "传递" 活动的完成事件; 根活动未完成但变为休眠。 控制权将返回到 DFH0SAL1,然后返回到 MNU001,最后返回到 CICS。 CICS 采用同步点并落实以下内容:
- 创建新的销售业务交易
- Order 活动所完成的工作及其输入和输出数据; 容器
- 运行 Delivery 活动的请求及其输入数据容器
- 要重新激活 DFH0SAL2 根活动的条件。
在 CICS 同步点之后,将在用户终端上再次显示业务事务菜单,以供进一步选择。 其余活动在 CICS 业务事务服务的控制下完成,而不引用终端用户。 DFH0SAL2 程序不再存在于内存中,并且只有 BTS 知道此销售业务交易实例是否存在。
CICS 业务事务服务根据请求启动交付活动 (SDEL)。 (BTS 作为事务的资源管理器参与。) 完成交付活动后, BTS 将重新激活 "销售" 根活动; 即,事务标识 SALE 下的 DFH0SAL2 程序。
- DFH0SAL2 程序再次在顶部输入,因此通过发出 RETRIEVE REATTACH EVENT 命令来确定导致其重新激活的事件。 但是,这次返回的事件为 Delivry-Complete。 在确定哪个子活动已完成之后, DFH0SAL2 确定要启动的下一个活动是 "发票" 活动。
与 "交付" 活动一样, DFH0SAL2 在请求要运行的活动之前设置 "发票" 活动,输入数据和执行选项的参数。 然后,它发出 EXEC CICS RETURN 命令,并处于休眠状态,等待对此销售业务交易实例重新激活。
- 将重复步骤 9 中隐含的模式,直到 "支付" 活动完成为止,此时 "销售" 业务交易已完成。 DFH0SAL2 发出 EXEC CICS RETURN 命令,在该命令上指定了 ENDACTIVITY 选项。 此选项向 CICS 指示根活动的处理已完成,并且不再希望在发生已定义事件或系统事件时重新激活根活动。 业务事务结束。