课堂目标

  1. 理解定时任务
  2. 什么时候使用定时任务
  3. Springboot可以做定时任务吗?
  4. 什么XXJOB
  5. XXJOB集成使用

一、什么是定时任务(轮询)

不需要人工参与,指定一个时间,或者规律;让程序自动运行

二、为什么需要定时任务

image-20251218093035963

三、如何使用执行定时任务

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

image-20260702162109077

XXL-JOB将“调度”与“任务”解耦,主要由两部分组成:

  • 调度中心 (xxl-job-admin):一个独立的Web应用,负责任务的调度与管理。你可以在它的可视化界面上创建、修改、删除任务,以及监控任务执行状态和查看日志。它支持集群部署以实现高可用。
  • 执行器 (xxl-job-executor):嵌入在你的业务应用中的组件,负责任务的具体执行。它会自动向调度中心注册,当调度中心发出调度请求时,执行器就会执行对应的任务逻辑。执行器同样支持集群部署,

四、xxljob官网

https://www.xuxueli.com/xxl-job/

XXL-JOB是一个轻量级的分布式任务调度平台。它解决了在分布式环境下,使用Spring的

@Scheduled注解可能导致任务重复执行的问题。

1、下载

image-20250924182447401

image-20250924182512218

2、目录

  • xxl-job-admin 后台调度管理(必须)
  • xxl-job-core 核心依赖(必须)

image-20250924182615491

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

image-20250924185442604

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

image-20250924185607565

4、数据库初始化

D:\xxl-job-3.2.0\doc\db\tables_xxl_job.sql

image-20250924193507614

5、启动控制台

image-20250924192412691

6、登录

image-20250924192524867

6、测试demo

启动前看下配置

image-20250924190838958

image-20250924190257503

五、集成到自己的项目里

1、控制台创建执行器和任务

  • 新建执行器

image-20250924192645786

  • 创建任务

注意JobHandler对应的名字,就是你的任务注解里的名字必须一致

 @XxlJob("dwJobHandler")

image-20250924192802320

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;
        }
    }