Node.js 议程作业不';服务器重新启动后无法运行

Node.js 议程作业不';服务器重新启动后无法运行,node.js,express,agenda,Node.js,Express,Agenda,我有一个议程作业,当我第一次定义它时,它运行得非常好。我可以在MongoDB中看到相应的文档,一切都很好。但当服务器重新启动或我按下“Ctrl+C”并终止进程时,在重新运行我的应用程序后,作业不会在之后运行 关于这个问题也有很多讨论 我试过: 1-优雅地处理SIGTERM 2-运行MongoDB更新查询,并在启动应用程序时将lockedAt、lastModifiedBy、lastRunAt设置为null 这两个都不适合我。我可以在MongoDB中看到作业未处于锁定状态,因此我很困惑,如果应用程序

我有一个议程作业,当我第一次定义它时,它运行得非常好。我可以在MongoDB中看到相应的文档,一切都很好。但当服务器重新启动或我按下“Ctrl+C”并终止进程时,在重新运行我的应用程序后,作业不会在之后运行

关于这个问题也有很多讨论

我试过:

1-优雅地处理SIGTERM

2-运行MongoDB更新查询,并在启动应用程序时将lockedAt、lastModifiedBy、lastRunAt设置为null


这两个都不适合我。我可以在MongoDB中看到作业未处于锁定状态,因此我很困惑,如果应用程序重新启动,为什么它不运行

如果您已经尝试了所有方法,那么您也可以更新所有无法从以下内容开始的作业:

  agendaJobs.update({
    lockedAt: {
      $exists: true
    },
    lastFinishedAt: {
      $exists: false
    }
  }, {
    $unset: {
      lockedAt: undefined,
      lastModifiedBy: undefined,
      lastRunAt: undefined
    },
    $set: {
      nextRunAt: new Date()
    }
  }, {
    multi: true
  })
这是一种暴力解决问题的方法,基本上可以将所有锁定的作业重新安排

顺便说一句,这是git上建议的方法之一


如果您想了解整个上下文,它来自于。

谢谢@Akrion。在我的研究中,我也看到了这一点,但这对我不起作用,因为lockedAt已经是空的,因为工作还没有开始。对于我的情况,作为一种解决方法,我获取nextRunAt>currentdatetime的所有作业并重新安排它们。这会创建重复的作业,所以我会在以后删除重复的作业。但是,请稍候,上面的代码会为您执行此操作。它看起来是否有一个字段
lockedAt
,并不关心它的值。它也不会删除记录,只会重置字段。我认为这是一个更好的方法。