任务调度系统(定时任务)

时间:2024-03-29 08:05:03

1.运行流程

任务调度系统(定时任务)
Cron表达式:设置触发规则;
调度器:调度器本身就是一个线程,并且一定是单例的,如果不是单例,会出现多指挥官,任务乱套问题;
存储任务位置:默认保存在内存中,RAMJobStore,出现重启后找不到任务问问题,所以可以在配置文件中配置,持久化到数据库(磁盘),JDBCJobStore;
任务信息和触发器绑定关系为1:N。

2.实现动态调度

将任务存进数据库,以任务管理形式(界面)进行定时任务管理,需要修改时,可以修改数据库,完成后使用调度器进行任务调度。
任务调度工具类:添加,修改,启动/暂停,删除任务等等。
非配置文件,任务怎么随Spring启动就运行?
答:使用Application或@PostConstruct,运行时就启动。

集群部署

  • 负载均衡:保证任务平均分配,避免任务过载增加吞吐量、减少运行时间;
  • 高可用:减少系统不能提供服务的时间。
    如何保证不重复执行,任务不漏掉等问题?
    答:实现集群间通信、数据共享、协调任务;可以采用数据库实现集群中的消息共享,前面存到磁盘就已经做了一些连接数据库等操作,此处不在处理,在配置文件中配置启用集群,就可以使用集群了;有一个节点启动,关闭,另一个节点接管时,会根据Trigger类型,有对应Misfire策略(立即执行、忽略等等默认立即执行),进行触发。
    数据库中如何解决资源竞争问题?
    答:使用行级别的锁,qrtz_locks表,
    调度器使用的是start方法开启调度,调用obtainlock锁,在调用数据库操作,然后执行一个select *from …for update 手工加行锁,实现了资源的竞争。
    任务调度系统(定时任务)
    任务分片:将任务根据服务器个数进行分片。