跳转到主要内容
在本页上

定时 cron 任务

Deno.cron 接口使您可以使用 cron 语法配置按可配置计划执行的 JavaScript 或 TypeScript 代码。在下面的示例中,我们配置了一个 JavaScript 代码块,该代码块将每分钟执行一次。

Deno.cron("Log a message", "* * * * *", () => {
  console.log("This will print once a minute.");
});

也可以使用 JavaScript 对象来定义 cron 计划。在下面的示例中,我们配置了一个 JavaScript 代码块,该代码块将每小时执行一次。

Deno.cron("Log a message", { hour: { every: 1 } }, () => {
  console.log("This will print once an hour.");
});

Deno.cron 接受三个参数

  • cron 任务的可读名称
  • 定义 cron 作业运行计划的 cron 计划字符串或 JavaScript 对象
  • 按给定计划执行的函数

如果您不熟悉 cron 语法,可以使用许多第三方模块(例如这个)来帮助您生成 cron 计划字符串。

重试失败的运行 跳转到标题

失败的 cron 调用将使用默认重试策略自动重试。如果您想指定自定义重试策略,可以使用 backoffSchedule 属性指定在再次重试函数调用之前要等待的等待时间数组(以毫秒为单位)。在下面的示例中,我们将尝试重试失败的回调三次 - 分别在一秒、五秒和十秒后。

Deno.cron("Retry example", "* * * * *", () => {
  throw new Error("Deno.cron will retry this three times, to no avail!");
}, {
  backoffSchedule: [1000, 5000, 10000],
});

设计和限制 跳转到标题

以下是使用 Deno.cron 时需要注意的一些设计细节和限制。

任务必须在顶层模块作用域中定义 跳转到标题

Deno.cron 接口旨在支持基于预定义计划的 cron 任务的静态定义。所有 Deno.cron 任务必须在模块的顶层定义。任何嵌套的 Deno.cron 定义(例如,在 Deno.serve 处理程序内部)将导致错误或将被忽略。

如果您需要在 Deno 程序执行期间动态调度任务,您可以使用 Deno 队列 API。

时区 跳转到标题

Deno.cron 计划使用 UTC 时区指定。这有助于避免使用实行夏令时的时区出现问题。

重叠执行 跳转到标题

您的 cron 任务的下一次计划调用可能会与前一次调用重叠。如果发生这种情况,Deno.cron 将跳过下一次计划调用,以避免重叠执行。

星期几的数字表示 跳转到标题

Deno.cron 不使用从 0 开始的星期几数字表示。相反,它使用 1-7(或 SUN-SAT)来表示星期日至星期六。这可能与使用 0-6 表示的其他 cron 引擎不同。

在 Deno Deploy 上的使用 跳转到标题

使用 Deno Deploy,您可以在云端的 V8 isolate 上运行您的后台任务。这样做时,需要记住一些注意事项。

与 Deno CLI 的区别 跳转到标题

与其他 Deno 运行时内置程序(如队列和 Deno KV)一样,Deno.cron 的实现在 Deno Deploy 上的工作方式略有不同。

cron 默认如何工作 跳转到标题

Deno 运行时中 Deno.cron 的实现在内存中保留执行状态。如果您运行多个使用 Deno.cron 的 Deno 程序,则每个程序都将拥有自己独立的 cron 任务集。

cron 在 Deno Deploy 上如何工作 跳转到标题

Deno Deploy 提供了 Deno.cron 的无服务器实现,旨在实现高可用性和可扩展性。Deno Deploy 在部署时自动提取您的 Deno.cron 定义,并使用按需 isolate 安排它们执行。您的最新生产部署定义了计划执行的一组活动 cron 任务。要添加、删除或修改 cron 任务,只需修改您的代码并创建新的生产部署。

Deno Deploy 保证您的 cron 任务在每个计划的时间间隔内至少执行一次。这通常意味着您的 cron 处理程序将针对每个计划时间调用一次。在某些故障情况下,可能会针对相同的计划时间多次调用处理程序。

Cron 仪表板 跳转到标题

当您进行包含 cron 任务的生产部署时,您可以在项目的“部署仪表板”(Deploy dashboard)的“Cron”选项卡下查看所有 cron 任务的列表。

a listing of cron tasks in the Deno dashboard

定价 跳转到标题

Deno.cron 调用的计费方式与部署的入站 HTTP 请求相同。了解更多定价信息,请点击此处

部署特定限制 跳转到标题

  • Deno.cron 仅适用于生产部署(不适用于预览部署)。
  • 您的 Deno.cron 处理程序的实际调用时间可能与预定时间相差最多一分钟。

Cron 配置示例 跳转到标题

为了方便起见,这里提供了一些常见的 cron 配置。

每分钟运行一次
Deno.cron("Run once a minute", "* * * * *", () => {
  console.log("Hello, cron!");
});
每十五分钟运行一次
Deno.cron("Run every fifteen minutes", "*/15 * * * *", () => {
  console.log("Hello, cron!");
});
每小时运行一次,准点运行
Deno.cron("Run once an hour, on the hour", "0 * * * *", () => {
  console.log("Hello, cron!");
});
每三小时运行一次
Deno.cron("Run every three hours", "0 */3 * * *", () => {
  console.log("Hello, cron!");
});
每天凌晨 1 点运行
Deno.cron("Run every day at 1am", "0 1 * * *", () => {
  console.log("Hello, cron!");
});
每周三午夜运行
Deno.cron("Run every Wednesday at midnight", "0 0 * * WED", () => {
  console.log("Hello, cron!");
});
每月 1 号午夜运行
Deno.cron("Run on the first of the month at midnight", "0 0 1 * *", () => {
  console.log("Hello, cron!");
});