UNPKG

nyx_schedule

Version:

nyx任务调度

143 lines (130 loc) 4.76 kB
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}); }) } }) }