定时任务
cron表达式
在线cron表达式生成器:https://cron.qqe2.com/
SpringBoot使用定时任务
配置文件
1 2 3 4 5 6 7 8 9
| spring: task: execution: pool: core-size: 5 max-size: 50
|
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.xiaofei.config;
import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync @EnableScheduling @Configuration public class ScheduledConfig {
}
|
使用
1 2 3 4 5 6 7 8 9
| @Component public class TestScheduled {
@Scheduled(cron = "0/5 * * * * ? ") public void test(){ System.out.println("哈哈哈哈"); } }
|
分布式任务调度
一个SpringBoot应用部署多个节点,会导致应用中的定时任务重复执行,这个时候需要引入分布式任务调度系统,对系统中的定时任务进行统一管理
xxl-job
如果该文档不能满足需求,可以查看官方文档查看详细使用
下载xxl-job
xxl-job仓库地址:https://gitee.com/xuxueli0323/xxl-job
官方文档:https://www.xuxueli.com/xxl-job/
该文档使用的是xxl-job-2.3.1
版本进行编写,按照官方文档将xxl-job-admin进行启动,然后再参照xxl-job-executor-sample-springboot
模块,将xxl-job-admin集成到系统中
创建一个spring boot项目
下载代码生成器,快速创建一个spring boot项目进行测试:https://gitee.com/xiao-i-fei/xiaofei-generator
引入依赖
1 2 3 4 5 6
| <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.1</version> </dependency>
|
配置文件
配置文件中的address+port
最终会注册到xxl-admin中的执行器中,所以address+port
必须是唯一的,如果没有配置address,则会使用本机默认ip,这时,同一台机器如果启动多个项目,port
就必须唯一了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| xxl: job: accessToken: default_token admin: addresses: http://127.0.0.1:8080/xxl-job-admin executor: address: appname: task ip: logpath: C:/Users/19030/Desktop/tmp/xxl-job logretentiondays: 30 port: 8091
|
配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| 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() { logger.info(">>>>>>>>>>> xxl-job config init."); 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; } }
|
创建测试任务
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Component public class ScheduledTest {
@XxlJob(value = "demoJobHandler") public void demoJobHandler() { DateTimeFormatter dfDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH mm ss"); System.out.println(dfDateTime.format(LocalDateTime.now())); } }
|
SpringBoot启动多个任务
执行器管理
任务管理
调度日志查看
系统日志查看
SpringBoot使用实现定时任务和xxl-job实现分布式任务调度