首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在nodejs中创建循环事件以更新或插入MySQL表

在nodejs中创建循环事件以更新或插入MySQL表
EN

Stack Overflow用户
提问于 2019-02-09 10:12:24
回答 2查看 4.5K关注 0票数 3

我有一个MySQL表tasks。在任务中,我们可以创建一个正常任务或一个循环任务,该任务将自动在MySQL tasks 表中创建一个新任务,并向用户发送已创建任务的电子邮件通知。经过大量的研究,我发现你可以用四种方法

  1. MySQL事件
  2. Kue,bull,agenda(node.js调度库)
  3. 使用cron作业每天监视任务。

重复的任务将在每周每日每月年度上重复。我们必须选择在任何时候删除重复发生的事件。什么是好的、干净的解决方案?

EN

回答 2

Stack Overflow用户

发布于 2019-02-12 11:57:46

正如你所发现的,有很多方法可以解决这个问题,这是我会怎么做的,但是我做了一些假设,比如你可能有多少项任务,以及系统的灵活性如何。

如果你不太可能改变任务的时间选项(每天,每周,每月,每年)。每个任务都有以下字段:last_run_datenext_run_date。每次任务运行时,我都会更新这些字段,并在日志表(如task_run_log )中创建一个条目,该日志表还将存储运行任务的日期/时间。

然后,我将有一个cron作业,它向nodejs服务发送HTTP消息。该web服务将查看任务表,查找当天需要执行的任务,并将每个任务的消息发送到某种队列(AWS SQS、GCP Pub/Sub、Apache等)。队列中的每个消息都表示需要执行的单个任务,工作人员可以订阅该队列并自行处理该任务。一旦工作人员处理了作业,它就会生成日志条目,并更新last_run_datenext_run_date字段。如果任务失败,它将将其添加到将该消息移动到错误队列中,并将失败的任务记录在任务日志中。

此系统将是健壮的,因为任何失败的作业都将以失败作业的形式存在于数据库中,并且会出现在错误队列中(您可以将该队列解压以删除失败的作业,也可以在修复员工时将其重放到正常队列中)。它还会扩展到每天都要发生的许多任务,因为你可以扩大员工的规模。您也不会淹没cron,您的cron作业将每天只向您的HTTP服务发送一个HTTP请求,该服务将启动处理。

还可以根据cron作业是否运行来设置警报,以确保进程被正确启动。

票数 1
EN

Stack Overflow用户

发布于 2019-02-18 03:17:02

我不得不做一些非常类似的事情,您可以使用npm模块节点调度

节点调度器具有许多特性。您可以首先创建规则设置,该设置确定它何时运行,然后安排作业,在那里确定作业执行情况并激活它,下面是我的代码中的一个示例,该代码将作业设置为每天午夜运行。

代码语言:javascript
复制
 var rule = new schedule.RecurrenceRule();
 rule.dayOfWeek = [0, new schedule.Range(1, 6)];
   var j = schedule.scheduleJob(rule, function(){
     sqlUpdate(server);
 });

这可能并不完全适合您的所有需求,但还有其他功能和设置可以完成。

例如,可以使用cancel函数取消任何作业。

代码语言:javascript
复制
j.cancel()

您还可以设置开始时间和结束时间,如npm页面所示

代码语言:javascript
复制
let startTime = new Date(Date.now() + 5000);
let endTime = new Date(startTime.getTime() + 5000);
var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
  console.log('Time for tea!');
});

还有其他安排日期和时间的选项,因为这也遵循cron格式。意味着您可以设置动态时间。

代码语言:javascript
复制
var j = schedule.scheduleJob('42 * * * *', function(){
  console.log();
});

因此,这将允许node.js处理所需的一切。您可能需要设置一个系统来跟踪计划的作业(var j),但它将允许您取消它并根据您的需要对其进行调度。

此外,它还允许您重新安排时间,检索下一个计划好的事件,并且可以有多个日期格式。

如果您需要在进程打开、打开或重置后持久化作业,则需要保存作业的详细信息,MySQL数据库在这里是有意义的,并且在启动时,代码可以根据数据库中的数据快速拉动和重新启动所有创建的任务。当你取消一个任务时,你只需从数据库中删除它。应该注意的是,流程需要打开才能工作,如果进程被关闭,作业将不会运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54605232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档