Scheduler

Scheduler 是注册到某个 Space 中、用于重复执行的定时任务。将一个 Script 与运行时刻绑定后,每到该时刻,服务器就会执行该 Script。例如,在服装网店中,若想每天运行一次查找库存为 0 的商品并调用供应商订货窗口的 Script,就为该 Script 创建一个 Scheduler。

Scheduler 是由 CMA 管理的 Space 子资源,路径以 /spaces/{spaceId}/schedulers 为基准。它没有发布(publish)概念,也没有 sys.version。创建后会立即进入调度,修改时不需要版本请求头。不过有两点与其他资源不同。要执行的 Script 在创建后无法更改,而且创建或修改它时,除了 Space 设置权限外,还需要单独具备该 Script 的执行权限。执行结果会以 SchedulerLog 形式保留,成功的执行在 1 小时后消失,失败的执行在 3 天后消失。

资源结构

以下是创建 Scheduler 时的响应。sys 中包含标识符和引用,主体中包含名称、运行时刻和是否开启。

{
  "sys": {
    "id": "7kQm2ZbTn4Rc9WvXpL3dHsY6fJ",
    "type": "Scheduler",
    "space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
    "script": { "sys": { "id": "3trmXRMKq7bd0Prbef1NcZ", "type": "Refer", "targetType": "Script" } },
    "createdBy": { "sys": { "id": "9dLmQ2pVnRb8sTfWcXd3LhJ7gK", "type": "Refer", "targetType": "User" } },
    "createdAt": "2026-08-26T01:20:07.442Z",
    "updatedBy": { "sys": { "id": "9dLmQ2pVnRb8sTfWcXd3LhJ7gK", "type": "Refer", "targetType": "User" } },
    "updatedAt": "2026-08-26T01:20:07.442Z"
  },
  "name": "库存订货",
  "cronExpression": "0 0 * * *",
  "activated": true
}

主要键:

  • sys.id:Scheduler 的唯一标识符。用于单条查询、修改、删除路径中的 {schedulerId}。
  • sys.script:该 Scheduler 要执行的 Script。只能在创建时指定,之后无法更改。 若要运行其他 Script,请新建一个 Scheduler。
  • name:在控制台中显示的标签。不用于执行。
  • cronExpression:运行时刻。由五个字段(分、时、日、月、星期)组成,并按 UTC 解释。参见下方 编写运行时刻。
  • activated:是否开启。为 false 时,保存的记录仍然保留,只是不会执行。

没有 sys.version。修改请求中不发送 X-Weegloo-Version 请求头。

系统属性 (sys)

space、script、createdBy、updatedBy 以 Refer 形式({ "sys": { "id", "type": "Refer", "targetType" } })表示。

属性类型说明
idstring资源的唯一标识符。
typestring资源类型。Scheduler 始终为 "Scheduler"。
spaceRefer<Space>该 Scheduler 所属的 Space。
scriptRefer<Script>要执行的 Script。创建后不可变。
createdByRefer<User>创建者。执行以该用户的权限进行。
createdAtstring (date-time)创建时间。
updatedByRefer<User>最后修改的用户。
updatedAtstring (date-time)最后修改时间。

主体属性:

属性类型说明
namestring (1~64)在控制台中显示的标签。不用于执行。
cronExpressionstring (1~128)运行时刻。五个字段(分、时、日、月、星期),按 UTC 解释。
activatedboolean是否开启。为 false 时会从调度中移除,不再执行。

编写运行时刻

五个字段从左到右按 分、时、日、月、星期 的顺序书写。没有秒字段。

值含义
0 0 * * *每天 00
30 9 * * *每天 09
0 * * * *每小时整点
*/10 * * * *每 10 分钟
0 0 * * 1每周一 00
0 0 1 * *每月 1 日 00

可以使用 *(全部)、,(列表)、-(范围)、/(间隔),星期可用数字(07,0 和 7 表示星期日)或名称(SUNSAT)表示。

所有值都按 UTC 解释。 需要自行计算与本地时间的时差并填入,对于指定了日期或星期几的时刻,实际运行的日期可能会因该时差而改变。

从不触发的值不会被保存。 像 0 0 30 2 *(2 月 30 日)这样,即使格式正确,但指向永远不会到来的日期时,会被拒绝。

状态与约束

对象约束
name1~64 个字符,必填。
cronExpression1~128 个字符,必填。必须为五个字段,且至少要触发一次。
activated必填。
sys.script创建时必填。创建后不可变(修改请求体中不接收)。

关于行为和权限的规则:

  • 需要同时具备两种权限。 角色(SpaceRole)的 settings 中必须有 SETTING_SCHEDULER,此外还必须单独拥有对目标 Script 的 Execute 权限。不仅创建时,修改和部分修改时也会检查。 因为更改运行时刻就是在决定何时执行该 Script,而将关闭状态改为开启则是在启动执行。只要缺少其中任意一项,请求就会被拒绝。
  • 执行以 sys.createdBy 的权限进行。 Script 中的 :self 过滤器也会解析为该用户。即使修改者不同,执行主体也不会改变。
  • 当创建者失去执行权限时会自动关闭。 在下一个执行时刻,服务器会进行检查,不执行并将 activated 降为 false。即使权限恢复,也不会自动开启。
  • 数量有上限。 一个 Organization 可拥有的 Scheduler 数量按套餐规定(Free 1 个、Basic 5 个、Pro 30 个、Enterprise 无限制)。超过该上限时,创建会被拒绝。
  • 执行次数与 Script 共享。 每运行一次,就会消耗一次套餐的 Script 执行次数。没有 Scheduler 专用的执行上限。若因超过该上限导致 Organization 的 Script 执行被暂停,则此后到达运行时刻的 Scheduler 将不会执行,activated 会变为 false。此时会留下一条 SchedulerLog,sys.error 中载入原因。该 Scheduler 关闭之后不会再重新进入调度。
  • 错过的执行不会补偿。 即使某些执行时刻被错过,之后也不会一次性集中执行,而是从下一个时刻起重新运行。
  • 正在使用的 Script 无法删除。 尝试删除被某个 Scheduler 引用的 Script 时,该删除会被拒绝(参见 Script 的错误)。
  • 没有发布。 创建时无需状态值或发布步骤即可立即进入调度,删除也无需前置步骤即可直接完成。

SchedulerLog

Scheduler 每运行一次,就会留下一条执行记录。它是只读的,没有创建、修改、删除端点。路径为 /spaces/{spaceId}/schedulers/{schedulerId}/logs。

{
  "sys": {
    "id": "5nRt8YcVm2Qb7WxZpK4dGhJ9sL",
    "type": "SchedulerLog",
    "space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
    "requestId": "3trmXRM8dNvQ2LbYpK7fHsJ3gWc4Rt",
    "success": true,
    "createdBy": { "sys": { "id": "7kQm2ZbTn4Rc9WvXpL3dHsY6fJ", "type": "Refer", "targetType": "Scheduler" } },
    "createdAt": "2026-09-03T00:00:02.503Z",
    "updatedBy": { "sys": { "id": "7kQm2ZbTn4Rc9WvXpL3dHsY6fJ", "type": "Refer", "targetType": "Scheduler" } },
    "updatedAt": "2026-09-03T00:00:02.503Z"
  }
}

所有值都在 sys 中,没有主体属性。没有值的键会从响应中省略(上面的示例中没有 error)。

属性类型说明
idstring记录的唯一标识符。用于单条查询路径中的 {schedulerLogId}。
typestring始终为 "SchedulerLog"。
spaceRefer<Space>该记录所属的 Space。
requestIdstring本次执行的标识符。同一个值会写入 ScriptLog 的 sys.requestId。
successboolean是否成功。
errorany只有在执行次数用尽、连启动都没能开始的那一次执行中才会载入。 除此之外,即使是失败的执行也会省略。运行过程中失败的原因,在具有相同 requestId 的 ScriptLog 的 sys.value 中。
createdByRefer<Scheduler>留下该记录的 Scheduler。 不是用户。
createdAtstring (date-time)记录创建时间。
updatedByRefer<Scheduler>与 createdBy 相同的 Scheduler。
updatedAtstring (date-time)与 createdAt 相同。

没有 scheduler 字段。 是哪个 Scheduler 留下的记录,由 sys.createdBy 指向,其 targetType 为 "Scheduler"。sys.updatedBy 也是同一个 Scheduler。

也没有 startedAt、endedAt、result 以及耗时字段。 一次执行耗时多久,以及 Script 返回的值,都在具有相同 requestId 的 ScriptLog 中(sys.durationMs、sys.value、sys.statusCode)。字段构成在 Script 资源与端点 中介绍。

一次执行会留下两条日志。 一条是这个精简的 SchedulerLog,另一条是承载该次执行本身的 ScriptLog(ScriptLog 的 sys.trigger 指向这个 Scheduler)。两者以相同的 requestId 关联在一起。

记录在执行结束后写入一次,之后不再改变。成功的执行在 1 小时后消失,失败的执行在 3 天后消失。 响应中没有承载过期时间的字段,时间一到记录就会消失。需要保留更久的值,请在 Script 中保存为 Content。

错误

以下是处理 Scheduler 时会遇到的错误码。所有资源共通的错误码,请参见通用错误。

错误码条件
WGL400069cronExpression 即使格式正确,也指向一个从不触发的时刻。
WGL403001调用者的角色没有 SETTING_SCHEDULER 设置权限。该权限不仅在创建和修改 Scheduler 时需要,查询、删除以及查看执行记录时同样需要。创建或修改 Scheduler 时还需要目标 Script 的 Execute 权限,两者只要缺少其中之一,请求就会以同一错误码被拒绝。
WGL429001在 Organization 的 Scheduler 数量已达套餐上限的状态下,试图新建 Scheduler。

API

以下所有端点的基准 URL 为 https://cma.weegloo.com/v1,Authorization 请求头中需要用于认证 CMA 的 Bearer 令牌。Scheduler 没有 sys.version,因此修改时不发送 X-Weegloo-Version 请求头。

  • Script:Scheduler 执行的资源。介绍其定义结构和 statement 种类。
  • Webhook:通过事件而非时刻来执行 Script 的资源。
  • SpaceRole:包含 SETTING_SCHEDULER 设置权限和 Script 的 Execute 权限的角色。
  • Scheduler 概念:这是做什么用的功能,以及在控制台中的操作方法。