为什么不在Job
node.js 中有一个保存到数据库的对象。
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;
});
});