我想让我的用户在他们希望特定操作发生时设置时间表。我在azure上使用节点服务器。我目前正在查看node-schedule并将使用它。我正在考虑的是每小时运行一个主计划,检查数据库是否有用户指定的计划,此计划根据用户的计划设置新的计划。但我不知道这是不是一个好习惯,而且我担心服务器负载。
答案 0 :(得分:2)
您可以使用节点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 / 4h),您可以每小时(或30或15分钟)查询数据库以检索每个满足的日期,而不是计划调度程序,并触发适当的功能。
答案 1 :(得分:1)
搜索Quartz计划。 我的项目使用它来设置发送电子邮件的时间。