自动事务启动 (ATI)
对于分区内队列, CICS® 提供了自动事务启动 (ATI) 选项。 当将数据发送到分区内队列,并且队列中的条目数 (来自一个或多个程序的 WRITEQ) 达到预定义级别 (触发器级别) 时,自动事务启动 (ATI) 工具允许用户指定的事务自动启动以处理该队列中的数据。 将立即启动事务,或者,如果需要终端,那么当该终端没有与其关联的任务时启动事务。 终端处理状态必须使消息能够自动发送到该终端。
通过触发级别和自动事务启动设施,应用程序可以将消息切换到终端。 启动任务后,将在应用程序中执行命令以检索排队的数据。 对于应用程序,将按顺序检索队列中的所有数据。
工作原理
系统程序员通过为特定的分区内目标指定非零触发器级别来建立 ATI 基础。
当队列中的条目数 (由一个或多个程序发出的 WRITEQ TD 命令创建) 达到指定的触发级别时,将自动启动队列定义中指定的事务。 触发器事务只能对其关联队列按顺序执行。 当已连接触发器事务时,将不会连接另一个事务,直到第一个事务完成为止。
当触发器事务运行时,控制权将传递给处理队列中数据的程序; 该程序必须发出重复的 READQ TD 命令以耗尽队列。
当队列已清空时,将开始新的 ATI 循环。 即,在再次达到指定的触发器级别 (无论先前任务的执行是否已结束) 时,将调度新任务以启动。 新 ATI 循环开始的确切点取决于队列是否定义为逻辑可恢复。 如果使用 "否" 或 "物理" 的可恢复性属性 (RECOVSTATUS) 定义队列,那么新的 ATI 循环将在队列读取到 QZERO 时开始。 但是,如果使用 "逻辑" 的可恢复性属性定义队列,那么新的 ATI 循环仅在将队列读至 QZERO 后任务终止后开始。
如果自动启动的任务未清空该队列,那么不会禁止对该队列的访问。 在清空队列之前 (即,在响应 READQ TD 命令时发生 QZERO 条件之前) ,可以正常或异常结束该任务。 如果要将队列的内容发送到终端,并且先前的任务已正常完成,那么未达到 QZERO 这一事实意味着尚未重置触发器处理,并且将重新启动同一任务。 如果未重置触发器处理,那么后续 WRITEQ TD 命令不会触发新任务。
如果要将队列的内容发送到文件,那么任务的终止与 QZERO 具有相同的效果 (即,触发处理已重置)。 下一个 WRITEQ TD 命令将启动触发器事务 (如果已达到触发器级别)。
如果队列的触发器级别为零,那么不会自动启动任何任务。
如果队列在逻辑上可恢复,那么触发器事务的启动将延迟到下一个同步点。
如果由于上次触发的事务在清除队列之前异常结束,或者由于达到 MXT 限制而从未启动该事务,因此已超出触发器级别,那么不会调度另一个任务。 这是因为尚未启动 QZERO 以重置触发器处理。 如果队列的内容以文件为目标,那么任务的终止将重置触发处理,并意味着下一个 WRITEQ TD 命令将触发新任务。
为了确保在队列为空时自动启动的任务完成,应用程序应优先测试 QZERO 条件,而不是某些其他与应用程序相关的因子 (例如,预期记录数)。 只有 QZERO 条件指示已清空的队列。
如果要将队列的内容发送到另一个系统,那么会话名称将保留在 EIBTRMID 中。 如果事务 (以系统目标启动) 异常终止,那么将以与终端相同的方式启动新事务。
如果将 ATI 与瞬时数据触发机制配合使用,那么可能会创建会对您执行动态事务路由的能力产生负面影响的事务间亲缘关系。 有关事务亲缘关系的更多信息,请参阅 亲缘关系 。
如果触发器事务迂到不确定故障 (该事务必须与逻辑上可恢复的队列相关联) ,那么在解决不确定故障之前,将会对触发器事务进行分段,并且无法连接另一个触发器事务。 只有在搁置的 UOW 落实或回退其在再同步后所作的更改之后,才能连接另一个触发器事务。
由于瞬时数据触发级别事务而启动的事务不会创建先前的中继段数据,并且会被视为在源点执行。 有关先前中继段数据的更多信息,请参阅 先前中继段数据特征。