0

有没有办法检查最后一次作业执行的时间,我需要在计划的作业结束时从数据库中删除作业。

提前致谢。

这是创建作业的代码:


    const job = schedule.scheduleJob(
      {
        start: scheduledJob.startTime,
        end: scheduledJob.endTime,
        rule: cronExp,
      },
      () => {
        this.jobService.send(scheduledJob);
        console.log("sent notification");
      }
    );

4

2 回答 2

1

我和你有同样的问题,因为我的调度程序也在数据库中。

根据您的代码检查上次作业执行时间的方法是:

    const job = schedule.scheduleJob(
      {
        start: scheduledJob.startTime,
        end: scheduledJob.endTime,
        rule: cronExp,
      },
      () => {
          this.jobService.send(scheduledJob);
          console.log("sent notification");

        //As there are not more next invocations, it means this invocation is the last one
        if (this.nextInvocation() === null) {
          //here you can code whatever you need to do in the last invocation
        }
      }
    );

文档:https ://www.npmjs.com/package/node-schedule

于 2021-09-10T20:27:25.963 回答
1

_ 我试图在评论中写这个,但是评论太小了,我需要更多的 MD 支持来展示如何做你的要求。事实上,您并没有提供太多内容,但是知道 API 让我比以前知道您使用的是什么 API 有了更多的洞察力。_


      NPM 注册的 Node.js 模块Node-Schedule是一个非常常用的 API,这主要是因为它的代码写得不错,而且它的作者维护得很好,但它流行的最可能的原因是它的文档,就 NPM 模块而言非常棒,这很重要,因为我将能够使用其中一个示例来尝试并演示如何在作业结束时发出一个事件,该事件将排队一个函数可以执行您要求的数据库操作。节点调度文档可以在软件的注册表中找到。当您第一次打开文档时,您会看到它为您提供了几个非常好的示例。您在该页面上看到的前几个示例基本上都在做同样的事情,它们的不同之处仅在于它们使用的语法。换句话说,您可以使用您在这些示例中看到的任何日期格式/语法在给定的特定日期执行函数。归根结底,它们都是相当标准的,但我将通过第二个示例向您展示如何做到这一点,它使用Date()对象,每个人(编写过 JavaScript 的人)现在都会Date()对象是,以及如何使用它。





const schedule = require('node-schedule');
const date = new Date(2021, 5,  1,  13, 45,  0);
                   // ^Yr   ^Mo ^Dy ^Hr ^min ^sec

const EventEmitter = require('events');
class Ee extends EventEmitter {}

const jobStatus = new Ee();

jobStatus.on('finished', () => {
    console.log('JOB FINISHED');

    // Preform your DB Operations here (in your case: delete job from database)

});

const job = schedule.scheduleJob(date, function(){
    // Execute Your Jobs code Here
    
    jobStatus.emit('finished'); // Emit your job done emitter when you are done.
});


澄清:

  • 基本上new Date()上面的对象是这样的:
    • 您希望您的函数在 2021 年 6 月 1 日下午 1:30 执行。
    • 请记住,在 JS Date 对象0 = January中,23:59 = 11:59pm

  • 现在来解释 EventEmitter 部分:
    • const EventEmitter = require('events');是允许开发人员访问的节点库V8 Event Loop(这是一整罐蠕虫,这里不会解释),我假设您知道事件循环是什么,如果不知道,您可以查找它。简而言之,这将让使用event emitters,我将在接下来讨论。

    • class MyEmitter extends EventEmitter {}是您可以编写“实现事件发射器的新实例”的少数几种不同方式之一,这是官方节点文档的显示方式,所以这就是我将如何显示它,但实际上我不这样做这样。我使用的是node docs的方式,所以你可以参考这个页面,这对你的情况很有帮助

    • Node.js 事件发射器文档页面

    • jobStatus常量是一个新创建的Ee类实例,可用于在作业执行期间随时发出作业状态。(记住这段代码都是异步的。)

    • 如果写东西的顺序看起来乱七八糟,那是因为这段代码是异步的。事件异步工作。


试试这个例子,如果你有问题可以告诉我。不过,您需要发布您正在使用的 JS 脚本,记住这是您的问题而不是我的问题,看看我在这个问题上写了多少,以及您写了多少。您可以包括更多内容来帮助我(或其他开发人员)帮助您。

于 2021-05-22T18:18:45.793 回答