定时器相信大家都不陌生,平时使用定时器就像使用闹钟一样,我们可以在固定的时间做某件事,也可以在固定的时间段重复做某件事。在JAVA开发领域,目前可以通过以下几种方式进行定时任务
1、单机部署模式
Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。
ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。
Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用简单但功能强大。
Quartz:一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度,就是配置稍显复杂。
2、分布式集群模式(不多介绍,简单提一下)
问题:
I、如何解决定时任务的多次执行?
II、如何解决任务的单点问题,实现任务的故障转移?
问题I的简单思考:
1、固定执行定时任务的机器(可以有效避免多次执行的情况 ,缺点就是单点故障问题)。
2、借助Redis的过期机制和分布式锁。
3、借助mysql的锁机制等。