爲什麼不在保存到數據庫的node.js中有一個Job
對象。
var Job = {
id: long,
task: String,
configuration: JSON,
dueDate: Date,
finished: bit
};
我建議你只在RAM中存儲該ID並將所有其他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中,然後再次啓動一個定時器。
如果出現任何錯誤,你應該能夠乾淨利落重啓像這樣:
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;
});
});
很好的點。謝謝! – Josh 2011-04-10 03:39:50
我同意KISS說投票是好的。 OTOH,通知者/觀察者沒有任何投票。當有事情需要發生時,所有訂戶都會收到通知。唯一的網絡流量是keepalive或heartbeats,可以在一些守護進程/系統/軟件中儘可能少地發生。 – squarism 2012-03-13 18:58:49