课堂目标
- 理解定时任务
- 什么时候使用定时任务
- Springboot可以做定时任务吗?
- 什么XXJOB
- XXJOB集成使用
一、什么是定时任务(轮询)
不需要人工参与,指定一个时间,或者规律;让程序自动运行
二、为什么需要定时任务

三、如何使用执行定时任务
1、 @Scheduled 注解方式(最常用)
@SpringBootApplication
@EnableScheduling // 开启定时任务支持
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 固定时间执行
/**
* fixedRate: 固定速率执行,单位毫秒
* 从上一次任务开始时间算起,间隔指定时间执行
*/
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
log.info("固定速率任务执行,时间: {}", new Date());
}
- 延迟执行
/**
* initialDelay: 初始延迟时间,单位毫秒
* 应用启动后延迟指定时间开始执行第一次任务
*/
@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void initialDelayTask() {
log.info("初始延迟任务执行,时间: {}", new Date());
}
- cron表达式
/**
* cron表达式:最灵活的方式
* 格式:秒 分 时 日 月 周 年(年可选)
*/
@Scheduled(cron = "0/5 * * * * ?") // 每5秒钟执行一次
public void cronTask() {
log.info("Cron任务执行,时间: {}", new Date());
}
corn表达式含义
秒 分 时 日 月 周 年(年可选)
* * * * * * *
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ 年 (1970-2099) - 可选
│ │ │ │ │ └─── 周 (1-7 或 SUN-SAT)
│ │ │ │ └───── 月 (1-12 或 JAN-DEC)
│ │ │ └─────── 日 (1-31)
│ │ └───────── 时 (0-23)
│ └─────────── 分 (0-59)
└───────────── 秒 (0-59)
常用表达式:
0/1 * * * * ?
"0 0 2 * * ?" 每天凌晨2点执行
"0 0/5 * * * ?" 每5分钟执行一次
"0 0 12 * * ?" 每天中午12点执行
"0 15 10 ? * MON" 每周一上午10:15执行
"0 0/30 * * * ?" 每30分钟执行一次
2、其他方式
- Quartz Job
- 线程实现
- xxljob

XXL-JOB将“调度”与“任务”解耦,主要由两部分组成:
- 调度中心 (
xxl-job-admin):一个独立的Web应用,负责任务的调度与管理。你可以在它的可视化界面上创建、修改、删除任务,以及监控任务执行状态和查看日志。它支持集群部署以实现高可用。 - 执行器 (
xxl-job-executor):嵌入在你的业务应用中的组件,负责任务的具体执行。它会自动向调度中心注册,当调度中心发出调度请求时,执行器就会执行对应的任务逻辑。执行器同样支持集群部署,
四、xxljob官网
https://www.xuxueli.com/xxl-job/
XXL-JOB是一个轻量级的分布式任务调度平台。它解决了在分布式环境下,使用Spring的
@Scheduled注解可能导致任务重复执行的问题。
1、下载


2、目录
- xxl-job-admin 后台调度管理(必须)
- xxl-job-core 核心依赖(必须)

3、改配置
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=daiwei
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
xxl.job.accessToken=daiwei

控制台找个模块用了xxl-sso-core

4、数据库初始化
D:\xxl-job-3.2.0\doc\db\tables_xxl_job.sql

5、启动控制台

6、登录

6、测试demo
启动前看下配置


五、集成到自己的项目里
1、控制台创建执行器和任务
- 新建执行器

- 创建任务
注意JobHandler对应的名字,就是你的任务注解里的名字必须一致
@XxlJob("dwJobHandler")

2、加依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>3.1.0</version>
</dependency>
3、加配置
# XXL-Job 配置
xxl:
job:
admin:
addresses: http://localhost:8080/xxl-job-admin # 调度中心地址
executor:
appname: dwtest # 执行器名称
port: 9098 # 执行器端口
logpath: /data/applogs/xxl-job/jobhandler # 日志路径
logretentiondays: 30 # 日志保留天数
accesstoken: daiwei # 调度中心需要
4、加配置类+注入Bean
package com.dw.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accesstoken}")
private String accesstoken;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accesstoken);
return xxlJobSpringExecutor;
}
}
5、编写任务方法
@XxlJob("dwJobHandler")
public void dwJobHandler() throws Exception {
// 控制台输出
System.out.println("-----------------XXL-JOB, Hello World. " + new Date());
// XXL-Job 专用日志(会在管理界面显示)
XxlJobHelper.log("XXL-JOB开始执行,时间:" + new Date());
// 模拟业务处理
try {
// 你的业务逻辑
XxlJobHelper.log("业务处理完成");
} catch (Exception e) {
XxlJobHelper.log("任务执行失败:" + e.getMessage());
throw e;
}
}
27-3阶内容-2.7.1-xxljob
https://xiaochenblog.icu/archives/27-3jie-nei-rong-2.7.1-xxljob
评论