三种触发:数据一变、到点、有人点
怎么写触发条件、冷却和上限,什么事才配用定时。

本课目标
读完这一课,你将能够
- 说出三种触发,并为一件事选对一种
- 写出一个数据变化触发:类型、条件、冷却
- 说出定时的四档频率,以及它们在部署时各自怎么处理
触发只写一处
在 AIDC 里,一件事什么时候开始,写在工作流清单的 trigger 里,只有三种:数据一变(change)、到点(schedule)、有人点(manual)。三种可以并存。
"trigger": {
"manual": { "roles": ["developer", "member"], "preview": "members" },
"change": { "type": "factory.stock", "when": "=object.qty < object.safety_qty", "cooldown": "12h", "input": { "sku": "=object.sku" } },
"schedule": { "every": "1d", "at": "01:30" }
}
触发放在工作流里是有道理的:数据从哪来,是连接的事;存成什么,是语义层的事;「变成什么样时,做什么」才是流程。条件用工作流的表达式写,做的事就是它的步骤,运行记录、去重和链式上限也都在这里。触发和条件,全平台只有一份。
数据一变
语义层里某类对象新建或修改,且 when 条件为真时,触发一次。条件为假,不开跑,也不计分钟。上面的例子读作:库存低于安全值时触发,同一个物料 12 小时内只跑一次。
- 冷却:
cooldown是同一个对象两次运行之间至少隔多久。告警类的工作流一定要写,否则同一个物料会反复提醒。 - 同一批只开一次:
input留空表示「自己去查全部数据」。一次快照改了 100 个对象,只开一次运行,不跑 100 遍同样的检查。 - 不回头:工作流自己写出的变化,不会回头触发自己;写出的数据可以再触发别的工作流,最多 3 层。
到点
只有「时间本身就是条件」的事,才按时间跑:日报,月底对账,以及「数据该来却没来」的看门狗。数据不来,就没有变化可以触发,只能靠时钟去问一句。看门狗常用表达式函数 hoursSince 判断数据多久没更新了。
| 等级 | 部署时的处理 | |
|---|---|---|
| 比每 5 分钟还密 | 拒收 | 部署失败:要实时,用数据变化触发 |
| 5 分钟到 1 小时 | 高频 | 一定告警,写明每月次数和预计的计算分钟 |
| 1 小时到 1 天 | 中频 | 提示每月次数 |
| 每天及以上 | 正常 | 每天一次是常态 |
所有定时都由平台已有的调度心跳执行,不会为每个工作流另装一个 cron;平台停过一阵,也不会把错过的时刻补跑一遍。
有人点,以及上限
第三种是有人点。manual 写明哪些角色能正式运行、谁只能预演。预演会真的读、真的算,只是不写;正式运行才把结果写进语义层。打开页面读一次也属于这一类:实时连接只在有人看时挂着,页面隐藏 1 分钟就自动断开。
三种触发受同一组上限约束:每个应用每月 2,000 计算分钟,用完后数据变化和定时都不再开跑,下月恢复;通知另有去重和冷却,每天最多 20 封。这些上限不是限制你,而是让一个写错的条件,停在账单出问题之前。
要点
- 触发只有三种:数据一变、到点、有人点,全写在工作流的
trigger里。 - 数据变化触发用条件加冷却;输入留空时,同一批变化只开一次运行。
- 定时只给「时间本身就是条件」的事,最典型的是「数据该来却没来」的看门狗。
- 比每 5 分钟还密的定时拒收,5 分钟到 1 小时的一定告警,每天一次是常态。
- 三种触发共用计算分钟等上限,用完即停,下月恢复。
练一练
把一个定时任务改成触发
拿第 1 课盘点里最频繁的那个任务。
用一句话写出它是为了什么:什么情况发生时,应该有什么结果。
写出 when 表达式和冷却时间;如果只能靠时间,写清楚为什么。
如果这份数据每天应该到,决定看门狗几点检查、检查什么、通知谁。
小测
选一个答案,马上看解析。
Q1「每天早上汇总昨天的回款,发给财务」,最合适哪种触发?
汇总是「每天到点」的事,时间本身就是条件;每笔回款一变就汇总一次,反而会重复发很多遍。
Q2一次数据快照同时改了 200 个对象,input 留空的数据变化触发会怎样?
input 留空表示工作流自己去查全部数据,所以同一批变化只需要一次运行。
Q3想让一个工作流每 2 分钟跑一次,部署时会怎样?
比每 5 分钟还密的定时不被接受;5 分钟到 1 小时的才是「高频、一定告警」。