【SpringBoot 2学习笔记】《十》SpringBoot2 定时任务之@Scheduled注解

定时任务作为系统调度工具,在某些系统中的特定场合有着广泛应用,例如:在某个时间点统计数据、在一定的时间间隔取得最新数据等。Java开发中,以前我们实现定时任务时,最初使用Timer、TimerTask,Timer是定时器类,用来按计划开启后台线程执行指定任务,TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。还可以用第三方Quartz,Quartz是一个优秀的定时任务框架,发展至今已经非常成熟,以致后来其他的定时任务框架的核心思想或底层大多源于Quartz。Springboot2框架本身通过@Scheduled注解集成了定时任务,对于项目中简单的调度方案是足够支撑,可以直接使用,不用考虑其他模块。

8.1 创建定时任务的项目

使用 @Scheduled 非常容易,直接创建一个 Spring Boot 项目,并且添加 web 依赖 spring-boot-starter-web,项目创建成功后,添加 @EnableScheduling 注解,开启定时任务。

package com.gavinbj.task;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 *  @SpringBootApplication 标注这是SpringBoot项目的主程序类
 */
@SpringBootApplication
@EnableScheduling
public class TaskApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(TaskApplication.class, args);
	}

}

8.2 创建定时任务类

package com.gavinbj.task.csdn;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class WeatherReadTask {
	
	private final static Logger logger = LoggerFactory.getLogger(WeatherReadTask.class); 
	
	// 每天8:00到23:00 每一分钟执行一次
	@Scheduled(cron = "0 0/1 8-23 * * *")
	public void startReadWeather() {
		
		logger.info("读取天气数据开始");
		
		logger.info("读取天气数据结束");
		
	}
	

  	// 第一次执行 延后10秒钟;后续每隔50秒执行一次
    @Scheduled(fixedRate = 50000, initialDelay = 10000)
    public void startReadWechats() {
    	
    	logger.info("读取公众号数据开始");
		
		logger.info("读取公众号数据结束");  
    }
	
}

执行后输出结果:


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.1.RELEASE)

2020-01-30 16:07:16.279  INFO 17264 --- [           main] com.gavinbj.task.TaskApplication         : Starting TaskApplication on 20190823-032019 with PID 17264 (C:\StsEclipse4.3.2\workspace\gavinbj-mp\gavinbj-task\target\classes started by Administrator in C:\StsEclipse4.3.2\workspace\gavinbj-mp\gavinbj-task)
2020-01-30 16:07:16.283  INFO 17264 --- [           main] com.gavinbj.task.TaskApplication         : No active profile set, falling back to default profiles: default
2020-01-30 16:07:17.329  INFO 17264 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Initializing ProtocolHandler ["http-nio-9006"]
2020-01-30 16:07:17.330  INFO 17264 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-01-30 16:07:17.330  INFO 17264 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.27]
2020-01-30 16:07:17.403  INFO 17264 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/gavin]  : Initializing Spring embedded WebApplicationContext
2020-01-30 16:07:17.736  INFO 17264 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Starting ProtocolHandler ["http-nio-9006"]
2020-01-30 16:07:17.758  INFO 17264 --- [           main] com.gavinbj.task.TaskApplication         : Started TaskApplication in 2.618 seconds (JVM running for 2.948)
2020-01-30 16:07:27.740  INFO 17264 --- [   scheduling-1] com.gavinbj.task.csdn.WeatherReadTask    : 读取公众号数据开始
2020-01-30 16:07:27.741  INFO 17264 --- [   scheduling-1] com.gavinbj.task.csdn.WeatherReadTask    : 读取公众号数据结束
2020-01-30 16:08:00.094  INFO 17264 --- [         task-1] com.gavinbj.task.csdn.WeatherReadTask    : 读取天气数据开始
2020-01-30 16:08:00.094  INFO 17264 --- [         task-1] com.gavinbj.task.csdn.WeatherReadTask    : 读取天气数据结束

8.3 @Scheduled设置说明

关于@Scheduled注解使用的三种方式:

8.3.1 fixedRate格式

fixedRate是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。有时搭配initialDelay使用,表示第一次延迟多长时间后执行,之后按fixedRate的规则每隔一定时间执行一次。

8.3.2 fixedDelay格式

fixedDelay控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。

8.3.1 cron格式

  1. cron表达式格式
{秒} {分} {时} {日} {月} {周} {年(可选)}
  1. cron 表达式字段取值范围及说明
字段 取值范围 允许的特殊字符
0 ~ 59 , - * /
0 ~ 59 , - * /
0 ~ 23 , - * /
可以用数字 1 ~ 31 中的任意一个值,但要注意特殊月份 , - * ? / L W C
可以用 0 ~ 11 , - * /
可以用数字 1 ~ 7 表示(1=星期日) , - * ? / L C #
取值范围(1970-2099),允许为空值 , - * /
  1. cron表达式中特殊字符的说明
特殊字符 说明
* 表示可以匹配该域的所有值
主要用于日和星期,可以匹配域的任意值,但实际不会。当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为?
/ 表示为每隔一段时间。如 0 0/10 * * * ? 其中的 0/10表示从0分钟开始,每隔10分钟执行一次
- 表示范围。如 0 0-5 14 * * ? 表示在每天14:00到14:05期间每1分钟执行一次
, 表示枚举多个值,这些值之间是"或"的关系。如 0 10,30 14 * 3 ? 表示每个星期二14点10分或者14点30分执行一次
L 表示每月或者每周的最后一天。如 0 0 0 L * ? * 表示每月的最后一天执行
W 表示最近工作日。如 0 0 0 15W * ?* 表示每月15号最近的那个工作日执行
# 用来指定具体的周数,"#“前面代表星期,”#"后面代表本月的第几周。如"2#1"表示本月第二周的星期日
发布了37 篇原创文章 · 获赞 24 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/gavinbj/article/details/104130467