定时任务,顾名思义,不必多释。
crontab命令
Linux系统分为两种任务调度。
1、系统任务调度
2、用户任务调度
* * * * * command
星期
月
日
时
分
“,”表示列表范围。1,2,3,7,8
“ - ”表示值的范围。1-6
“ * ”表示任意可能的值。
“ / ”表示时间的间隔频率。例如“0-23/2”,表示每两个小时执行一次
JDK Timer
时间不准确延迟:单线程。如果存在多个任务,某个任务因为某种原因导致线程任务执行过久,超过了间隔时间,就会导致任务延迟了。
异常终止:会终止所有任务,未执行的timerTask也不会执行了。
依赖系统时间;会因为时间出现问题。
ScheduledExecutor
任务多并发
只是如果执行过程中抛出异常,那么会终止,之后也不会周期性进程
Spring Scheduler
Quartz
分布式定时任务
指的是讲集群中分散的可靠性差的定时任务统一化管理和调度,并实现分布式部署的管理方式。
“抢占式”:谁先获得资源谁能运行
“协同式”:单个任务处理的数据分到多个jvm中处理,提高数据的并行处理能力
一般策略:
1、只在一台服务器上运行
2、通过配置参数分散运行
3、通过全局锁互斥执行
分布式定时任务的特点:
高可用:
可伸缩:
负载均衡:
失效转移:
分布式锁的实现方式:
(1)基于数据库:当想要执行任务,先往数据库插入一条数据,插入成功就可以获得,执行完毕后删除对应的行数据。
(2)基于redis:基于setnx实现,当缓存中的key不存在时,才会设置成功。
(3)基于zooKeeper:创建一个锁目录lock,如果线程A需要获得锁就在lock目录下创建临时顺序节点,在查询锁目录下所有子节点,寻找比自己小的兄弟节点,不存在则说明当前线程顺序号最小,则可以获得锁。线程B如果想获得锁同样查询所有的节点,判断自己是不是最小的,如果不是,则监听比自己值小的。线程A处理完成,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是,则获得锁。