定时任务
# 定时任务概述
定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现。下面通过几个小案例来了解一下定时任务。
定时任务主要有三种实现方式:
- Timer
- ScheduledExecutorService
- Spring Task
本文主要通过第三种方式来实现,且扩展到task-quartz
,并简单介绍一下分布式定时任务task-xxl-job
。
# Spring Task
# 配置方式
- 在启动类上使用
@EnableScheduling
开启定时任务功能 - 新建定时任务类,使用
@Component
注解,让 SpringBoot 为类注册 Bean - 在定时任务类中定义定时任务方法,在方法中编写定时任务
- 在定时任务方法上使用
@Scheduled()
注解,并填入定时参数
# 定时参数
定时任务可以通过注解的方式来配置该定时任务执行的方式。
# corn表达式
@Scheduled(cron="*/6 * * * * ?")
每 6 秒执行一次
# 参数
@Scheduled(fixedRate = n)
:在上次任务开始后 n 毫秒执行下一次任务@Scheduled(fixedDelay = n)
:在上次任务结束后 n 毫秒执行下一次任务@Scheduled(initialDelay = n1, fixedRate = n2)
:第一次延迟 n1 后执行,此后按照 fixedRate 的规则定时
# 案例
@SpringBootApplication
@EnableScheduling
public class SpringBootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootTaskApplication.class, args);
}
}
@Component
@Slf4j
public class TaskJob {
private int count = 0;
@Scheduled(cron="*/6 * * * * ?")
public void process(){
System.out.println("this is scheduler task runing "+(count++));
}
/**
* 按照标准时间来算,每隔 10s 执行一次
*/
@Scheduled(cron = "*/10 * * * * ?")
public void job1() {
log.info("【job1】开始执行:{}", DateUtil.formatDateTime(new Date()));
}
/**
* 从启动时间开始,间隔 2s 执行
* 固定间隔时间
*/
@Scheduled(fixedRate = 2000)
public void job2() {
log.info("【job2】开始执行:{}", DateUtil.formatDateTime(new Date()));
}
/**
* 从启动时间开始,延迟 5s 后间隔 4s 执行
* 固定等待时间
*/
@Scheduled(fixedDelay = 4000, initialDelay = 5000)
public void job3() {
log.info("【job3】开始执行:{}", DateUtil.formatDateTime(new Date()));
}
}
# Quartz
上面定时任务的方式我们很容易发现一个弊端,那就是这个定时任务开启了,我们不能暂停或者终止它,甚至当我们需要去查询所有在运行的定时任务的时候会非常不方便。无法动态对定时任务进行增删改查是上面一种方式的很大的弊端。
下面演示一下Spring Boot 集成 Quartz 定时任务,并实现对定时任务的管理,包括新增定时任务,删除定时任务,暂停定时任务,恢复定时任务,修改定时任务启动时间,以及定时任务列表查询。
具体实现请参考:
https://github.com/xkcoding/spring-boot-demo/tree/master/demo-task-quartz
# xxl-job
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
具体实现请参考:
https://github.com/xkcoding/spring-boot-demo/tree/master/demo-task-xxl-job
https://github.com/xuxueli/xxl-job
# 扩展
一款可视化的定时任务管理平台:
https://github.com/len
上次更新: 2024/06/29, 15:13:44