【问题标题】:Scheduling Repeating Daily Jobs with Agenda.js and Node使用 Agenda.js 和 Node 安排重复的日常工作
【发布时间】:2020-02-07 22:11:43
【问题描述】:

我正在使用 Agenda.js 和 Node 设置作业调度程序,并以 MongoDB 为支持。到目前为止,它按预期工作。但是,我不清楚如何安排重复的工作——例如,应该在每天早上 9 点运行的工作。

“schedule”用于一次性调度作业,但不重复:

agenda.schedule('today at 09:00am CST', 'first job');

“every”适用于“3 分钟”等间隔,但不适用于“上午 9:00”

agenda.every('3 minutes', 'second job');

由于配置方法被认为是可链接的,我也尝试了这个:

agenda.processEvery('24 hours').schedule('day at 09:45am CST', 'second job');

...这确实在 CST 上午 9:45 第一次到达时成功运行了任务,但它没有将其重置为在第二天的同一时间运行。

每天早上 9:00 我会使用什么语法来运行作业?而且,更好的是,我如何安排它仅在周一至周五运行?

【问题讨论】:

    标签: node.js mongodb agenda


    【解决方案1】:

    Ajenda 接受cron 格式。所以你可以做这样的事情

    这是重复的工作每周一到周五每天的 09:00

    job.repeatEvery('0 9 * * 1-5', {
     skipImmediate: true
    });
    

    SkipImmediate 是可选的。这是CRON checker 上面的cron 字符串。阅读更多关于repeatEvery

    编辑

    Job 在创建Agenda 时返回

    agenda.define('NAME', async job => {
     job.repeatEvery('0 9 * * 1-5', {
     skipImmediate: true
      });
     await job.save()
    }
    

    阅读更多关于Creating Jobs

    【讨论】:

    • 谢谢,但我在尝试此操作时收到 agenda.repeatEvery is not a function 错误。
    • 这是我试过的:agenda.repeatEvery('* 9 * * 1-5', { skipImmediate: true });
    • 是的,因为repeatEveryjob 而不是agenda 上可用。 Jobagenda 返回的内容
    • 对。是否需要链接save() 才能将其持久化到数据库中?那会是什么样子?
    • 是的,你明白了!阅读它here
    【解决方案2】:

    我有一个类似的用例,但我不想使用 cron 字符串。

    const agendaEvery = async (interval, sendTime, name, data, options) => {
      const job = agenda
        .create(name, data)
        .repeatEvery(interval, {
          timezone: 'Asia/Kuala_Lumpur',
          skipImmediate: true,
          startDate: sendTime
        })
        .schedule(sendTime)
      await job.save()
    }
    

    这将允许假设您想要发送每日电子邮件,您可以使用 ISO 格式的日期时间字符串来安排第一个电子邮件,间隔可以是 .e.g 1 day

    【讨论】:

      【解决方案3】:

      skipImmediate: truerepeatEvery 一起使用,我遇到了打字错误。线

      agenda.every('0 9 * * 1-5', cronTypes.PUSH, null, {skipImmediate: true});
      

      工作

      【讨论】:

        【解决方案4】:

        批准的解决方案似乎有点时髦。我觉得在作业处理程序中调用 job.repeatEvery() 有点不合适。

        agenda.every 接受cron 格式,因此您可以将其应用于任何已定义的作业并根据cron 序列运行处理程序

        你有一个明确的工作:

        agenda.define('do-something', async (job, done) => {
          // Doing some heavy async stuff here
          async heavyStuff();
          done();
        })
        

        服务器初始化后,您可以在代码中的任何位置调用它来设置重复作业。只需确保 await agenda.start() 已被调用并且议程已建立 mongo 连接

        await agenda.every("0 9 * * 1-5", "do-something");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 2018-03-18
          • 1970-01-01
          • 2019-09-22
          • 2018-04-07
          相关资源
          最近更新 更多