作业(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',
    },
  },
})