前言
在Spring Boot中,定时任务的实现通常使用@Scheduled注解。@Scheduled可以用于在指定的时间间隔或特定的时间点执行任务。Spring提供了多种方式来配置定时任务,如使用固定速率,固定延迟或Cron表达式等。如果是分布式系统或者想要时间可以灵活变化,可以选择一些定时任务框架xxl-job,elastic-job等
定时任务注解@Scheduled
设计一个定时任务
1.启用定时任务
首先,需要在 Spring Boot 应用中启用定时任务功能。可以在应用的主类或配置类中添加
@EnableScheduling
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
2.创建定时任务
接下来,可以创建一个带有
@Scheduled
注解的方法来定义定时任务。以下是几种常见的定时任务配置方式:
2.1. 固定速率执行任务
@Scheduled(fixedRate = 5000)
表示每隔 5 秒执行一次任务。任务的开始时间之间间隔是固定的。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledTask {
@Scheduled(fixedRate = 5000)
public void executeTask() {
System.out.println("Fixed rate task executed at " + System.currentTimeMillis());
}
}
2.2. 固定延迟执行任务
@Scheduled(fixedDelay = 5000)
表示任务在上一个任务完成后的 5 秒后执行。任务完成时间和下一个任务开始时间之间的间隔是固定的。
@Component
public class MyScheduledTask {
@Scheduled(fixedDelay = 5000)
public void executeTask() {
System.out.println("Fixed delay task executed at " + System.currentTimeMillis());
}
}
2.3. 使用 Cron 表达式
@Scheduled(cron = "0 0/1 * * * ?")
表示每分钟的开始执行任务。Cron 表达式提供了更灵活和精确的时间控制。
@Component
public class MyScheduledTask {
@Scheduled(cron = "0 0/1 * * * ?")
public void executeTask() {
System.out.println("Cron expression task executed at " + System.currentTimeMillis());
}
}
Cron 表达式详解
Cron 表达式的格式如下:
秒 分 时 日 月 星期 [年]
- 秒:0-59
- 分:0-59
- 时:0-23
- 日:1-31
- 月:1-12
- 星期:0-7(0 和 7 都表示周日)
常见的 Cron 表达式例子:
"0 0 12 * * ?"
:每天中午 12 点执行"0 15 10 ? * *"
:每天上午 10:15 执行"0 0/5 * * * ?"
:每 5 分钟执行一次"0 0 0 1 1 ?"
:每年 1 月 1 日午夜执行
多线程定时任务
默认情况下,所有的定时任务都在单线程中执行。如果你希望并发执行多个定时任务,可以自定义
TaskScheduler
:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class SchedulingConfig {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10); // 设置线程池大小
scheduler.setThreadNamePrefix("scheduled-task-");
return scheduler;
}
}
总结
在 Spring Boot 中,通过使用
@Scheduled
注解和配置定时任务,你可以轻松实现各种类型的定时任务,如固定速率执行、固定延迟执行、基于 Cron 表达式的定时任务等。根据需求,还可以配置多线程调度器或使用配置文件来动态管理定时任务的执行行为。
定时任务框架xxl-job
XXL-JOB 是一个分布式任务调度平台,旨在解决分布式系统中的任务调度问题。相比于 Spring Boot 自带的
@Scheduled
注解,XXL-JOB 提供了更加灵活和强大的任务调度能力,支持集群模式下的任务调度、任务的可视化管理、任务的失败重试等功能。
SpringBoot继承定时任务框架
1.搭建调度中心xxl-job-admin
1.1下载项目
https://github.com/xuxueli/xxl-job
1.2修改配置文件端口和数据库代码
1.3连接到本地数据库,运行 db.sql
1.4启动项目,进行访问
用户名:admin,密码:123456,这个是默认初始化的用户名和密码
2.在SpringBoot中运用
2.1引入依赖
首先,在你的 Spring Boot 项目中引入 XXL-JOB 的依赖。可以在
pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
2.2编写配置文件
接下来,需要配置 XXL-JOB。在
application.properties
中添加以下配置:
xxl.job.admin.addresses=http://127.0.0.1:8181/xxl-job-admin
xxl.job.accessToken=default_token册
xxl.job.executor.appname=xxl-job-executor-test
xxl.job.executor.address=
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.executor.logpath=D:/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30
2.3编写xxlJob配置类
package com.example.excel;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
2.4创建定时任务
要创建一个定时任务,需要在服务中定义一个方法,并使用
@XxlJob
注解标识该方法为任务。
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class MyXxlJob {
@XxlJob("mySimpleJobHandler")
public void execute() throws Exception {
System.out.println("XXL-JOB Task executed at " + System.currentTimeMillis());
}
}
2.5在 XXL-JOB 管理平台中配置任务
登录后台后, 点击执行器管理,新增执行器
然后在任务配置页面,填写任务的基本信息,如任务名称,执行器,任务描述,CRON表达式等
在“JobHandler”字段中填写
mySimpleJobHandler
(即你在代码中定义的
@XxlJob
注解的名称)
任务的运行与管理
配置完成后,你可以在 XXL-JOB 管理后台中手动触发任务执行,也可以根据配置的 CRON 表达式自动调度任务。管理后台还提供了任务执行日志查看、失败重试、任务禁用启用等功能。
高级功能
XXL-JOB 还支持一些高级功能,如:
- 任务分片:在集群模式下,将任务分配给多个执行器。
- 失败重试:任务失败时自动重试。
- 任务依赖:配置任务之间的依赖关系。
- 动态参数:支持在任务执行时动态传递参数。
总结
使用 XXL-JOB,可以轻松实现分布式环境下的定时任务调度,并且通过管理平台实现任务的可视化管理和监控。相比 Spring 的
@Scheduled
注解,XXL-JOB 更适合于复杂的分布式任务调度场景。
版权归原作者 努力干饭的小鱼 所有, 如有侵权,请联系我们删除。