黑马程序员技术交流社区
标题: 【广州校区】+【原创】+ 集群下的定时任务如何处理 [打印本页]
作者: ley 时间: 2018-11-8 16:25
标题: 【广州校区】+【原创】+ 集群下的定时任务如何处理
这个问题比较常见解决办法也有很多,但是我单独说下自己使用的那个方法:
集群环境下使用的数据库是共用的,我们可以通过创建表的唯一约束来做到并发控制调度任务。首先我们需要用到3张表
1.在数据库中建立itheima_job_group表 用来制定定时调度规则的表。分时间段来区别类型
Name Type Comments
group_id number 组id
interval number 时间间隔(设置定时任务间隔的时间,分为单位)
remark varchar2(100) 描述字段
数据如下:
group_id interval remark
1 1440 24小时调度一次
2 60 1小时调度一次
3 120 2小时调度一次
2.在数据库中建立 itheima_job表,用来存储用户需要定时调度任务的信息
Name Type Comments
job_id number 定时任务id
job_name varchar2(200) 定时任务名称
group_id number 定时任务所对应的规则表
remark varchar(100) 备注
数据如下:
job_id job_name group_id remark
1 任务调度Job 1 每天16点执行
3.建立itheima_job_log表 此表就是用来控制任务调度次数的表。建立唯一索引
Name Type Comments
log_id number 主键,自增
heima_job_id number 定时任务id
heima_job_group number 定时任务所属的组
heima_job_start_ time date 执行时间
heima_job_status varchar2(10) 状态 执行情况
然后为itheima_job_log表添加如下的约束:
create unique index heima_log_job on itheima_job_log(heima_job_id,decode(heima_job_group,1,to_char(heima_job_start_time,'yyyymmdd'),2,to_char(heima_job_start_time,'yyyymmddhh24'),3,trunc(to_char(heima_job_start_time,'yyyymmddhh24')/2)),TO_CHAR(JOB_START_TIME,'DD-MON-RR'))
1
当heima_job_group为1时,时间任务跨度为当天,此条记录是以当天时间作为唯一条件,当heima_job_group为2时,时间任务跨度为一小时内,不可存在两个相同的heima_job_id, heima_job_group为3时,在两个小时内不能出现同样的job_id.
时间比较的是heima_job_start_ time的时间间隔。
当程序在执行定时任务的情况下,先向表中插入一条数据,可以添加成功
当再执行如下操作时 ,因为存在唯一约束的原因会报错
我们在在代码中捕获到错误就不执行定时任务中的操作。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |