欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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