WAIT EXTERNAL
同步事件。
语法
条件: INVREQ
此命令是线程安全的。
NOHANDLE、RESP 和 RESP2是常用选项,可添加到所有 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可用。 结果是:
函数 PURGEABLENOTPURGEABLEDTIMOUT到期异常终止 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 位于只读存储器中。
缺省操作: 异常终止任务。
示例

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
