作业(Jobs)
在介绍了 Tasks 和 Workflows 之后,我们可以用一个称为 Job 的概念将它们结合起来。
虽然你定义了控制业务逻辑的 Workflows 和 Tasks,但 Job 是 Task 或包含多个任务的 Workflow 的单个运行实例。
举例来说,假设我们有一个 Workflow 或 Task,描述了将信息从 Payload 同步到第三方系统的逻辑。这定义了如何同步信息,但它本身不会执行任何操作。要运行该 task 或 workflow,你需要创建一个引用相应 Task 或 Workflow 的 Job。
Jobs 存储在 Payload 数据库的 payload-jobs
集合中,你可以选择保留所有 jobs 的运行列表,或者配置 Payload 在 job 成功执行后删除它。
排队新 job
要排队一个 job,你可以使用 payload.jobs.queue
函数。
以下是排队一个新 Job 的示例,它将运行 createPostAndUpdate
workflow:
const createdJob = await payload.jobs.queue({
// 传入 workflow 名称
workflow: 'createPostAndUpdate',
// input 类型会根据你为该 workflow 定义的输入自动类型化
input: {
title: 'my title',
},
})
除了基于 Workflows 排队新 Jobs 外,你也可以为单个 Task 排队 job:
const createdJob = await payload.jobs.queue({
task: 'createPost',
input: {
title: 'my title',
},
})
取消 Jobs
Payload 允许你取消排队中或正在运行的 jobs。当取消一个正在运行的 job 时,当前 task 会完成执行,但后续 tasks 不会运行。这是因为 job 会在 tasks 之间检查其取消状态。
取消单个任务
要取消特定任务,使用 payload.jobs.cancelByID
方法并传入任务 ID:
await payload.jobs.cancelByID({
id: createdJob.id,
})
取消多个任务
要一次性取消多个任务,使用 payload.jobs.cancel
方法并配合 Where
查询:
await payload.jobs.cancel({
where: {
workflowSlug: {
equals: 'createPost',
},
},
})