Spring Boot定时任务[email protected]的使用
程序员文章站
2022-05-01 16:30:37
...
SpringBoot对于定时任务的支持,其实我们在开发过程当中,定时任务的技术使用,还是比较多的,
比如说我系统当中,要求在一个特定的时间,给用户发送一些信息,或者我的系统要求在一个特定的时间,
对于Redis缓存的数据,做一个清除,那么像这样的需求呢,都离不开定时任务的支持,那么本章节会讲解两个定时
任务知识,一个是Spring3.0以后自带的Scheduled定时任务器,还有的就是第三方的定时任务框架,Quartz,其实
Scheduled定时任务器呢,他相比Quartz来讲,要简单一些,如果我们当前的项目当中,定时任务的设计并不是很复杂的
话,那么我们使用Schedule就可以去实现,如果当前我们对于定时任务的设计,是比较复杂的,那么这个时候可能用
Quartz就更容易一些,我们先来看第一个,Scheduled定时任务器的使用,我们在这里先对Schedule做一个说明,Schedule定时
任务器呢,是Spring3.0以后自带的一个定时任务器,所以如果我们在项目当中,想要使用Schedule来做一个定时任务处理,
那我们需要添加一些坐标,来导入jar包,我们导入了一个web启动器,在Springboot的WEB启动器当中,并没有包含Schedule
相关的jar包,所以我们还需要在pom文件当中,添加座标,完成jar包的依赖注入,我们先去添加schedule的坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
那么Schedule的坐标是什么呢,它是Spring自带的一个定时器,所以我们只要导入Spring的jar包就可以了,groupId就是
org.springframework,然后他的artifactId是spring-context-support,我们把这个坐标加进去以后呢,我们看一下项目的
Maven dependencies,这里会多一个
org\springframework\spring-context-support\4.3.16.RELEASE\spring-context-support-4.3.16.RELEASE.jar
把它打开,在这个包下,有一个
org.springframework.scheduling
把这个包打开,这个包下所有的类,就是实现定时任务处理的一个类,所以需要把这个jar包导入进来,他并没有包含在
WEB启动器当中,这是我们使用Schedule的第一步,在pom文件添加坐标,我们来看第二步,第二步我们就可以编写一个
定时任务的类了,也就是我们的定时器了
@Component
public class ScheduledDemo {
/**
* 定时任务方法
* @Scheduled:设置定时任务
* cron属性:cron表达式。定时任务触发是时间的一个字符串表达形式
*/
@Scheduled(cron="0/2 * * * * ?")
public void scheduledMethod(){
System.out.println("定时器被触发"+new Date());
}
}
其实定时任务器,既不属于业务层,也不属于持久层,那么我们应该用什么来标记他呢,其实我们就要用到Component了,
然后我们去加一个定时任务的一个方法,其实它并不是一个定时触发的方法,我们需要怎么做呢,我们需要在方法上添加
一个注解,这个注解就叫@Scheduled注解,这里我们说一下这个注解的一个含义,其实这个注解的作用呢,是来设置定时任务的,
也就是说你在哪个方法上添加了@Scheduled的,就表示当前这个方法,会以一个定时任务的方法出现,一旦时间达到了,方法就会
被触发,我们说过了,既然是定时任务了,肯定离不开一个触发时间的设定,那么我们怎么设置一个时间呢,我们在注解当中,
去使用一个叫cron的属性,那我们先来说一下cron属性的作用,那么cron属性当中所要的,cron的表达式,那么cron表达式又是什么
呢,其实就是一个字符串触发时间的表达形式,也就是我们要给定的触发时间,基于一个字符串,来表示触发的时间,那么就是一个
cron表达式,我们来看一个最简单的,我的触发时间要求是这样的,每2秒钟触发一下我这个方法,然后我这个方法很简单,什么都不做,
就是打印一句话,定时器被触发,然后我加上一个时间,那么我们怎么来设置这个时间呢,这里我们先这么写,我会详细的讲cron表达式,
秒 分钟 小时 月 ?,这个大家不懂,先不要管他,现在我们就编写了Schedule的一个定时任务,编写定时任务类,这是第二步,我们需要在
启动类当中,去修改我们的启动类,开启定时任务的一个使用
@SpringBootApplication
@EnableScheduling
public class ScheduledApp {
public static void main(String[] args) {
SpringApplication.run(ScheduledApp.class, args);
}
}
在启动类中开启定时任务的使用,找到我们的启动类,他默认在SpringBoot当中,默认是对Schedule不开启的,所以我们想让我们的
定时类工作呢,在启动器当中去开启他,那么开启定时任务器的注解叫什么呢,叫@EnableScheduling,这是我们启动类当中要对
Schudule做一个开启操作,在这里重要的是这个注解的使用,这样我们就编写了一个定时任务类,我们看能不能触发定时任务方法
我从启动类开始运行,然后我们观察控制台,已经触发了,定时器触发了,然后看这个时间,看这个秒数,现在就是基于两秒作为一个
时间触发点,所以用Schedule做一个定时任务的处理,还是比较简单的,这样就可以了,我们主要讲一下在我们的SpringBoot当中,
去使用Schedule来做定时任务,所以cron不做一个重点的讲解了
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>spring-boot-scheduled</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- springBoot的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加Scheduled坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
</project>
package com.learn.scheduled;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* Scheduled定时任务
*/
@Component
public class ScheduledDemo {
/**
* 定时任务方法
* @Scheduled:设置定时任务
* cron属性:cron表达式。定时任务触发是时间的一个字符串表达形式
*/
@Scheduled(cron="0/2 * * * * ?")
public void scheduledMethod(){
System.out.println("定时器被触发"+new Date());
}
}
package com.learn.scheduled;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
*Scheduled
*/
@SpringBootApplication
@EnableScheduling
public class ScheduledApp {
public static void main(String[] args) {
SpringApplication.run(ScheduledApp.class, args);
}
}
推荐阅读
-
spring boot使用自定义的线程池执行Async任务
-
Spring Boot+Quartz实现一个实时管理的定时任务
-
Spring Boot实现简单的定时任务
-
Spring Boot与Kotlin定时任务的示例(Scheduling Tasks)
-
Spring Boot中配置定时任务、线程池与多线程池执行的方法
-
Spring Boot入门(三):使用Scheduled注解实现定时任务
-
Spring Boot多个定时任务阻塞问题的解决方法
-
spring boot使用自定义的线程池执行Async任务
-
使用Spring的定时器@Scheduled注解实现定时任务
-
java定时任务_Spring Boot 整合 Quartz 实现 Java 定时任务的动态配置