一:单体定时任务
jdk 原生有 Timer 与 ScheduledExecutorService 实现定时任务, Timer 是单线程跑定时任务,ScheduledExecutorService 是多线程跑.
SpringTask 默认集合在SpringBoot中,支持注解与cron 表达式的方法运行定时任务
//在配置类中添加一个@EnableScheduling注解即可开启SpringTask的定时任务能力
@Configuration
@EnableScheduling
public class SpringTaskConfig {
}
//@Schedule 注解与表达式来决定什么时间执行一次
@Component
public class DemoTask {
private Logger LOGGER = LoggerFactory.getLogger(DemoTask.class);
/**
* cron表达式:Seconds Minutes Hours DayofMonth Month DayofWeek [Year]
* 每10分钟执行一次
*/
@Scheduled(cron = "0 0/10 * ? * ?")
private void action() {
LOGGER.info("定时任务执行");
}
}
二:分布式定时框架的结构
系统服务一般都是集群的, 单体的话需要部署在每个需要的服务上,我们有时候需要将所有定时任务部署到一台机器上
分布式定时任务框架将定时任务抽象成三个角色 : 调度器 执行器 任务,市面上类似的定时框架都有类似的角色定位
根据调度器与 执行器 的关系,又分成 中心化 去中心化
- 所谓的「中心化」指的是:调度器和执行器分离,调度器统一进行调度,通知执行器去执行定时任务
- 所谓的「去中心化」指的是:调度器和执行器耦合,自己调度自己执行