按照之前波总的指导,修改了下调度任务,下面贴出主要代码,是否有错误?
修改Cron4jPulgin
public boolean start() { for (TaskInfo taskInfo : taskInfoList) { //将任务写入数据库task表 Date now = new Date(); TyleeTask task = new TyleeTask(); task.setTaskName(taskInfo.task.toString()); task.setCron(taskInfo.cron); task.setCreateDate(now); task.setUpdateDate(now); task.setStatus(Constants.TASK_INIT); task.setLock("0"); task.setIP(Utils.getLocalIP()); task.save(); taskInfo.schedule(); } try { Thread.sleep(new Random().nextInt(2000)); } catch (InterruptedException e) { e.printStackTrace(); } for (TaskInfo taskInfo : taskInfoList) { taskInfo.start(); } return true; }
建立task数据表
CREATE TABLE `xhwy`.`task` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '', `task_name` VARCHAR(200) NULL COMMENT '调度任务名称', `cron` VARCHAR(100) NULL COMMENT '', `create_date` DATETIME NULL COMMENT '', `update_date` DATETIME NULL COMMENT '', `status` VARCHAR(5) NULL COMMENT '处理状态,0初始、1正处理、2成功、3失败', `lock` VARCHAR(5) NULL COMMENT '锁,lock 为 1 时不处理', PRIMARY KEY (`id`) COMMENT '') COMMENT = '调度任务记录表'; ALTER TABLE `xhwy`.`task` ADD COLUMN `ip` VARCHAR(45) NULL COMMENT '' AFTER `lock`;
修改定时任务 run方法
public void run() { //修改订单状态 TyleeTask task = null; TyleeTask otherTask = null; try { //判断此调度任务是否在其他服务器正在执行 String tomcat1IP = PropKit.get("tomcat1IP_" + PropKit.get("flag")); String tomcat2IP = PropKit.get("tomcat2IP_" + PropKit.get("flag")); String localIP = Utils.getLocalIP(); String className = this.getClass().getName(); if (StringUtils.equals(tomcat1IP, localIP)) { otherTask = TyleeTask.dao.getInfoByIP(tomcat2IP, className); if (StringUtils.equals(otherTask.getLock(), "1")) { return; } task = TyleeTask.dao.getInfoByIP(localIP, className); } else if (StringUtils.equals(tomcat2IP, localIP)) { otherTask = TyleeTask.dao.getInfoByIP(tomcat1IP, className); if (StringUtils.equals(otherTask.getLock(), "1")) { return; } task = TyleeTask.dao.getInfoByIP(localIP, className); } //执行此调度任务时,先上锁 task.setStatus(Constants.TASK_IMPLEMENTATION); task.setLock("1"); task.setUpdateDate(new Date()); task.update(); checkUpdateOrder(); //执行完调度任务,解锁 task.setStatus(Constants.TASK_COMPLETE); task.setLock("0"); task.setUpdateDate(new Date()); task.update(); } catch (Exception e) { task.setStatus(Constants.TASK_FAILURE); task.setLock("0"); task.setUpdateDate(new Date()); task.update(); logger.error("checkUpdateOrder is error: " + e.getMessage(), e); } }
现在有点疑问,应该还是哪里错了,这个定时任务,似乎还是重复执行了,14号重新发布的,几天17号去看调度数据发现:
(文本编辑不能上传图片的吗?)
# id, task_name, cron, create_date, update_date, status, lock, ip '25', 'com.lcbp.tools.timer.SysDoCartItemOrderJob@24a5ea8d', '30 * * * *', '2016-09-14 17:59:04', '2016-09-17 10:30:00', '2', '0', '10.xx.xxx.170' '28', 'com.lcbp.tools.timer.SysDoCartItemOrderJob@6a716e31', '30 * * * *', '2016-09-14 18:00:18', '2016-09-17 10:30:00', '2', '0', '10.xx.xxx.89'
执行时间又重合了,是不是我上面的定时任务中的run里面的方法写错了吗?
final Ret ret = Ret.create();
boolean isOk = Db.tx(new IAtom() {
public boolean run() {
Task taskList = Db.find("select * from task where lock=0");
String idList = IdKit.join(taskList); // 将 taskList 的所有 id 变成这样:(1,2,3)
int n = Db.update("update task set lock=1 where lock=0 and id in" + idList);
ret.put("taskList", taskList);
return taskList.size() == n && n > 0; // 只有取出来的数量与更新数量相同时才可以提交事务
}
}
if (isOk) {
处理 ret.get("taskList")
} else {
未获取到可处理的 task
}