nyx_schedule
Version:
nyx任务调度
143 lines (130 loc) • 4.76 kB
JavaScript
var mysql = require("mysql")
var _ = require("lodash");
var Promise = require("bluebird");
var Job = require("./Job");
var pool = mysql.createPool({
connectionLimit : 10,
host : '172.30.84.166',
user : 'fe',
password : 'fe_gyg0sd',
database : 'nxy'
});
/**
* 查询有效的job,查询后修改lockAt字段,进行加锁
* @param id job id
*/
module.exports.findAndLock = function(id){
return new Promise(function(resolve , reject){
var querystr ="select * from task_info_t where id = ? and locked_time is null and disabled =1"
pool.query(querystr , [id] , function(err, rows, fields){
if(err){
return reject(err);
}
resolve(rows);
})
}).then(function(results){
if(results.length>0){
var querystr = "update task_info_t set locked_time = ? where id = ?"
pool.query(querystr , [id , Date.now()] , function(err, result){})
return results[0];
}else{
return null;
}
});
}
/**
* 查询所有有效的job
*/
module.exports.findJobs = function(pageInfo){
return new Promise(function(resolve , reject){
var querystr ="select * from task_info_t";
pool.query(querystr , function(err, rows, fields){
if(err){
return reject(err);
}
resolve(rows);
})
});
}
module.exports.findJob = function(jobName){
return new Promise(function(resolve , reject){
var querystr ="select * from task_info_t where name = ?";
pool.query(querystr ,[jobName] , function(err, rows, fields){
if(err){
return reject(err);
}
resolve(rows[0]);
})
});
}
module.exports.findAndLockNextJob = function(jobName , lockLifetime , schedule){
var now = new Date();
var lockDeadline = new Date(now.valueOf() - lockLifetime);
return new Promise(function(resolve , reject){
var querystr ="select * from task_info_t where ((locked_time is null and next_run_time <= ?)"+
"or (locked_time <=? and next_run_time <= ?)) and name = ? and disabled = 1 limit 1 for update";
pool.query(querystr , [schedule._nextScanAt , lockDeadline , schedule._nextScanAt , jobName] , function(err, rows, fields){
if(err){
return reject(err);
}
resolve(rows);
})
}).then(function(results){
if(results.length>0){
var querystr = "update task_info_t set locked_time = ? where name = ?"
pool.query(querystr , [now , jobName] , function(err, result){
if(err){
console.log("findAndLockNextJob update" , err);
}
})
return results[0]
}else{
return null;
}
}).catch(function(err){
console.log("sssssssssssss" , err);
throw err;
});
}
/**
* 解锁job
* @param ids job ids
*/
module.exports.unlock = function(ids){
var querystr = "update task_info_t set locked_time = null where id in [?]";
pool.query(querystr , [ids.join(",")] , function(err, result){})
}
/**
* 保存job,或者更新
*/
module.exports.saveOrUpdate = function(jobData){
var _jobData = _.clone(jobData);
return new Promise(function(resolve , reject){
var id = jobData.id;
var params , querystr;
if(id){ //update
_jobData = _.pickBy(_jobData, function(value , key){ return key == "id" ? false : true});
var keys = _.keys(_jobData);
var str = _.map(keys , function(key){return key+"=?";}).join(",");
params = _.map(keys , function(key){ return jobData[key]});
querystr = "update task_info_t set "+str+" where id="+id;
pool.query(querystr , params , function(err, result){
if(err){
return reject(err);
}else
resolve({type:"update" , sucess:true});
})
}else{
_jobData = _.pickBy(_jobData, function(value , key){ return key == "id" ? false : true});
var _keys = _.keys(_jobData);
querystr = "INSERT INTO task_info_t("+_keys.join(",")+") VALUES("+_.fill(_.clone(_keys),"?").join(",")+")"
params = _.map(_keys , function(key){return _jobData[key]});
pool.query(querystr , params , function(err, result){
if(err){
return reject(err);
}
resolve({type:"insert" , id:result.insertId , success:true});
})
}
})
}