【发布时间】:2017-01-20 12:34:41
【问题描述】:
我想允许我的用户在他们希望执行特定操作时设置时间表。我在 azure 上使用节点服务器。我目前正在查看节点计划并将使用它。我正在考虑的是每小时运行一个主计划,检查数据库中用户指定的计划,这个计划根据用户的计划设置一个新的计划。但我不知道这是否是一个好习惯,而且我担心服务器负载。
【问题讨论】:
标签: javascript node.js
我想允许我的用户在他们希望执行特定操作时设置时间表。我在 azure 上使用节点服务器。我目前正在查看节点计划并将使用它。我正在考虑的是每小时运行一个主计划,检查数据库中用户指定的计划,这个计划根据用户的计划设置一个新的计划。但我不知道这是否是一个好习惯,而且我担心服务器负载。
【问题讨论】:
标签: javascript node.js
您可以为此使用节点的cron,并以不同的方式进行调整。
下面的伪代码给出了一个大概的思路。
var CronJob = require('cron').CronJob;
new CronJob('0 0 * * * *', function () { // every hour
// check schedules planned for the future, stored as ISODate
DB.getUserSchedule({jobdate:{$gte:Date.now()},
function(userSchedules) {
userSchedules.forEach(sched) {
// convert the date back to a string parsed by cron
var d=extractDayHourMin(sched)
var jobtime = d[4] +' '+d[3]+' '+d[2]+' '+d[1]+' '+d[0]
// setup a new job
var job=new CronJob(jobtime, function() {
performUserJob()
job.stop(); // fires only once
DB.removeUserSchedule(userSchedule);
})});
见https://github.com/ncb000gt/node-cron
但是,这可能不是最好的解决方案:这确实会创建与计划一样多的进程,所以是的,它会消耗比所需更多的资源。除了调度调度程序,根据可能的日历的粒度(小时、1/2 小时、1/4 小时),您还可以每小时(或 30 或 15 百万)查询数据库以检索每个满足的日期,并触发相应的功能。
【讨论】:
搜索 Quartz 时间表。 我的项目使用它来设置发送电子邮件的时间。
【讨论】: