确保仅配置一次节点 Cron 作业

Ensure That Node Cron Job is Only Configured Once

我正在编写一个 Discord 机器人并让它在使用 node-cron 启动时安排一个 cron 作业。我将其定义如下(到目前为止非常基本):

    cron.schedule('15 1,3,5,7,9,11,13,15,17,19,21,23 * * *', () => {
        GameUpdater.sendGameUpdatesToLeagueChannels(this.guilds);
    });

问题是,Discord 机器人通常会重新连接,这将重新运行 代码中必须存在的部分。我正在考虑检查一个外部值,也许在我的数据库中,它管理它最近是 运行 还是已经 运行ning 或类似的东西,但我想知道是否有使用 node-cron 使 cron 作业独一无二的正确方法?

首先,您需要在某处保存计划任务的名称,该名称默认为 UUID V4,但可以使用上面调用的 schedule 方法的第三个参数作为选项提供。

通过从数据库或您编写的脚本中 hard-coded 常量引用此名称,您可以使用 cron.getTasks 列出所有计划任务以确保当前任务在安排之前不存在。

如果您引用的是 hard-coded 名称,那么调用 schedule 方法将替换现有计划任务,而不是创建新任务。

更新

要设置计划任务的名称,只需将选项对象作为第三个参数传递给您正在调用的 schedule 方法,并为您的任务命名。

示例:

cron.schedule('15 1,3,5,7,9,11,13,15,17,19,21,23 * * *', () => {
    GameUpdater.sendGameUpdatesToLeagueChannels(this.guilds);
}, { name: "example-task-1234" });

如果 cron 计划在启动时从 Client.on('ready') 启动,让您的 cronjob 在单独的事件 Client.once('ready') 中安排,这样当机器人重新连接时它不会再次触发例程。仅当整个 shard/cluster 进程终止并重新启动时。

您可以使用记录器来跟踪服务器的重启或启动时间。 您可以使用 winston 点击​​ HERE

这将有助于生成您的服务器日志,以便您可以在启动服务器之前阅读它,以便您可以采取行动。比如说调整时间等等