在很多业务场景需要我们某一特定的时刻去做某件任务,这些任务是时间驱动的,因此定时任务解决的就是这种业务场景。
快速实现的定时任务
复杂业务场景(分布式)
因此,SpringTask适用于简单、快速实现的定时任务场景,Elastic-job和Xxl-job适用于复杂、分布式的定时任务场景。当然Spring Task也可以实现分布式:
- 可以选择代码分离进行单台部署,
- 可以选择redis分布式锁,让一台服务拿到相应的key之后去执行,
- 使用zookeeper分布式锁获取单个锁.
Spring定时任务是Spring Boot内置组件
pom.xml
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
在 application 启动类中使用 @EnableScheduling 注解开启定时任务,会自动扫描,相当于一个开关,把这个开关开完之后,那么只要在相应的任务类中做相应的任务,那么就会被 spring boot 容器扫描到,扫描到后,根据任务定义的时间会自动运行。
SpringbootScheduletaskApplication.java
@SpringBootApplication
@EnableScheduling
public class SpringbootScheduletaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootScheduletaskApplication.class, args);
}
}
ScheduleTaskConfig.java
/**
* @Auther deepinsea
* @Date 2022/3/14
* 定时任务配置类
*/
@Component
public class ScheduleTaskConfig {
// 每隔5s执行一次
@Scheduled(cron = "0/5 * * * * ?")
public void printSay() {
System.out.println("每隔5s执行一次:" + new Date());
}
}
点"▶"运行项目
2022-04-10 23:32:43.643 INFO 57872 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 868 ms
2022-04-10 23:32:43.935 INFO 57872 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-04-10 23:32:43.944 INFO 57872 --- [ main] c.d.s.SpringbootScheduletaskApplication : Started SpringbootScheduletaskApplication in 1.594 seconds (JVM running for 3.296)
每隔5s执行一次:Sun Apr 10 23:32:45 CST 2022
每隔5s执行一次:Sun Apr 10 23:32:50 CST 2022
每隔5s执行一次:Sun Apr 10 23:32:55 CST 2022
每隔5s执行一次:Sun Apr 10 23:33:00 CST 2022
Process finished with exit code 130
测试成功!