黑马程序员技术交流社区

标题: 【广州校区】+【原创】+ 集群下的定时任务如何处理 [打印本页]

作者: 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