WAIT EXTERNAL

同步事件。

语法

WAIT EXTERNAL

读取语法图跳过可视语法图WAIT EXTERNALECBLIST( ptr-值)NUMEVENTS( data-value)PURGEABLEPURGEABILITY( CVDA)NOTPURGEABLENAME( 名称)

条件: INVREQ

此命令是线程安全的。

NOHANDLERESPRESP2是常用选项,可添加到所有 EXEC CICS 命令中以处理错误条件。 命令语法图和选项说明中没有明确包含这些选项。 有关这些常用选项和 EXEC CICS 命令语法的信息,请参阅 EXEC CICS 命令格式和编程注意事项.

动态事务路由的注意事项: 使用此命令可能会创建对动态事务路由的使用产生负面影响的事务间亲缘关系。 有关事务亲缘关系的更多信息,请参阅 亲缘关系

描述

WAIT EXTERNAL 等待发布 MVS 格式ECB的事件。 该命令将导致发出任务暂挂,直到发布其中一个 ECB ,即直到发生其中一个事件为止。 该任务可以在一个或多个 ECB 上等待。 如果它在多个 ECB 上等待,那么只要发布其中一个 ECB ,就可对其进行分派。 您必须确保每个 ECB 的清除时间 (设置为二进制零) 不晚于可发布的最早时间。 CICS® 无法为你做到这一点。 如果您在先前发布且随后未清除的 ECB 上等待,那么您的任务不会暂挂并继续运行,就像未发出 WAIT EXTERNAL 一样。

CICS 使用扩展ECB和 MVS 的POST退出机制处理通过WAIT EXTERNAL传递的ECB;因此除非确定ECB仅通过 MVS 的POST服务或采用比较与交换(CS)指令的标准"优化POST"逻辑进行提交,否则请勿使用WAIT EXTERNAL。 请注意,标准 "优化后" 逻辑仅在 ECB 未等待时适用,即等待位 X'80 ' 未开启时适用。

如果手动发布 WAIT EXTERNAL ECB ,例如通过另一个将值移动到 ECB 的任务,那么会发生不可预测的错误。 如果存在任何手动发布的可能性,请使用 WAITCICS 命令。 尽可能使用 WAIT EXTERNAL ,因为它通常具有较少的开销。

给定的欧洲央行不得同时等待多个任务。 如果未遵循此规则,那么要在 ECB 上等待的第二个任务将获得 INVREQ 条件。

确保异步跨内存发布 (在非用户自己的地址空间中发布事件完成) 的使用频率不会高于需要的频率。 大量交叉内存柱会消耗过多的系统资源。

选项

ECBLIST (ptr-value)
是一个指向事件列表的指针,该列表包含 MVS 格式的ECB地址。 ECBLIST 和 ECBs 都可能位于 16MB 线之上,即它们可以是 31 位地址。 每个 ECB 都必须是全字一致的。 空值( X'00000000'X' FF000000 ' )ECB 地址将被忽略。
名称 (name)
指定当任务发出 WAIT EXTERNAL 并且是 INQ TASK 命令或 CEMT INQ TASK 的主题时,在 SUSPENDVALUE 或 HVALUE 中返回的符号名称 $TAG1-$TAG2 字母数字字符。
NUMEVENTS (data-value)
是此类事件的数量,对应于 ECBLIST 中的地址数量。 字段为全字二进制。 当 NUMEVENTS 指定为 1 时, ECBLIST 仍必须是指向仅包含一个 ECB 地址的列表的地址。
PURGEABILITY (cvda)
确定以下项的结果:
  • 尝试执行死锁超时
  • SET TASK PURGE | FORCEPURGE 命令
  • CEMT SET TASK PURGE | FORCEPURGE

正在等待发布任务。 传递到 CICS 的值为PUR可用 (缺省值) 或NOTPUR可用。 结果是:

函数
PURGEABLE
NOTPURGEABLE
DTIMOUT 到期
异常终止 AEXY
无影响
CEMT SET TASK PURGE
EXEC CICS SET TASK
PURGE
异常终止 AEXY
无影响
CEMT SET TASK
FORCEPURGE

EXEC CICS SET TASK
FORCEPURGE
异常终止 AEXY
异常终止 AEXY

有关 DTIMOUT 和 SET TASK PURGE | FORCEPURGE 的信息,请参阅 事务恢复

条件

16 INVREQ
RESP2 值 :CVDA 值为:
1
ECB 无效,例如 ECB 不是全字对齐的。
2
ECB 地址为空指针 (X'00000000 ') 或 (X'FF000000')。
3
NUMEVENTS 不是正数。
4
指定了 PURGEABILITY ,但 CVDA 不正确。
5
在列表中找不到有效的 ECB ,因为 ECBLIST 地址无效或所有 ECB 地址都无效。

指定的 ECB 位于只读存储器中。

缺省操作: 异常终止任务。

示例

下图显示了如何使用 ECBLIST 参数指向欧洲央行地址列表,这些地址又指向各个 ECB。 请注意, ECBLIST 变量是指向列表的第一个地址的指针。
图 1。 ECBLIST 选项, EXEC CICS WAIT EXTERNAL
此图显示 PTR_ECB_ADDR_LIST 中指向 ECB_ADDR_LIST 的 A (ECB_ADDR_LIST)。 此列表具有 A (ECB1) , A (ECB2) 和 A (ECB3) ,分别指向 ECB1, ECB2 和 ECB3。
DCL
   ECB1        FIXED BIN(31),      /* actual ecb */
   ECB2        FIXED BIN(31),      /* actual ecb */
   ECB3        FIXED BIN(31);      /* actual ecb */
DCL                 /* list of ecb addresses */
   1  ECB_ADDR_LIST,
      2  ECB_ADDR(3)  PTR;
DCL                 /* ptr to each addr list */
   PTR_ECB_ADDR_LIST  PTR;
ECB_ADDR(1) = ADDR(ECB1);
ECB_ADDR(2) = ADDR(ECB2);
ECB_ADDR(3) = ADDR(ECB3);
                           /* set up pointer */
PTR_ECB_ADDR_LIST = ADDR(ECB_ADDR_LIST);
/* PTR_ECB_ADDR_LIST = ADDR(ECB_ADDR(1));
                               (alternative) */
 EXEC CICS WAIT EXTERNAL
                ECBLIST(PTR_ECB_ADDR_LIST)
                NUMEVENTS(3)
                PURGEABLE