通用思路:
1、task加上优雅关机代码(休眠30s):设置closeflag=1
2、一张表 -> task分布式支持表(id,taskName(任务名),taskStatus(执行状态,0待执行,1执行中),taskConditionVal(任务条件值,与taskStatus配合,判断任务是否要执行),taskProgressVal(任务进度值),ip,createdAt,updatedAt)
假设定时任务每半小时执行一次,进入业务逻辑的前提是closeflag != 1
执行任务时,多台机器同时set taskStatus=1, ip=XXX where taskStatus=0 and taskConditionVal ??? ;只有一台服务器能抢占到资源,逻辑往下执行
执行过程中,select ... where taskProgressVal > XXX; 执行过程中服务重启,优雅关机-》set taskStatus=0,taskProgressVal= XXX 就可以保证下一次任务会继续执行
服务器执行完,set taskStatus=0, taskConditionVal=XXX ,taskProgressVal=初始值
case by case 思路:
task加上优雅关机代码(休眠30s):设置closeflag=1
任务:每30分钟执行一次,进入业务逻辑的前提是closeflag != 1
1、时间是13点-15点,将 task_flag!=0 的全部设置为0(待执行)
2、下午15点30,乐观锁式抢占处理数据 set task_flag = 1(执行中) where task_flag=0 ;
处理成功set task_flag = 2(执行成功)
处理失败set task_flag = 0 ,下一次task启动时重试
机器重启,有优雅关机,一定会保证当前数据处理完成