为什么不在 node.js 中保存一个 Job 对象并保存到数据库中。
var Job = {
id: long,
task: String,
configuration: JSON,
dueDate: Date,
finished: bit
};
我建议您只将 id 存储在 RAM 中,并将所有其他 Job 数据保留在数据库中。当您的超时函数最终运行时,它只需要知道.id 即可获取其他数据。
var job = createJob(...); // create from async data somewhere.
job.save(); // save the job.
var id = job.id // only store the id in RAM
// ask the job to be run in the future.
setTimeout(Date.now - job.dueDate, function() {
// load the job when you want to run it
db.load(id, function(job) {
// run it.
run(job);
// mark as finished
job.finished = true;
// save your finished = true state
job.save();
});
});
// remove job from RAM now.
job = null;
如果服务器崩溃,您只需查询所有具有[finished=false] 的作业,将它们加载到 RAM 中并再次启动 setTimeouts。
如果出现任何问题,您应该能够像这样干净地重新启动:
db.find("job", { finished: false }, function(jobs) {
each(jobs, function(job) {
var id = job.id;
setTimeout(Date.now - job.dueDate, function() {
// load the job when you want to run it
db.load(id, function(job) {
// run it.
run(job);
// mark as finished
job.finished = true;
// save your finished = true state
job.save();
});
});
job = null;
});
});