springboot通过注解、接口创建定时任务详解
作者:小草莓子桑 发布时间:2021-06-05 06:00:29
目录
springboot中定时任务的创建
springboot通过注解创建定时任务
首先引入pom
直接上代码来一个栗子
@Scheduled注解的各个参数
springboot通过注接口创建定时任务
实现接口SchedulingConfigurer
主要方法
总结
项目中经常会用到定时任务,有的人在用quartz,有的人可能自己搭建了一套调度平台,springboot对于定任务的支持,让定时任务的创建变得简单,今天来说说springboot中定时任务的创建。
springboot中定时任务的创建
springboot定时任务的创建,这里就主要说两种方式
通过注解创建
通过springboot中提供的接口实现
springboot通过注解创建定时任务
首先引入pom
在类上主要用到了@EnableScheduling注解,都在org.springframework:spring-context这个包下
就引入org.springframework:spring-context这个包就可以使用了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
直接上代码来一个栗子
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @createdTime: 2020/4/7 16:00.
* @version: 1.0 .
*/
//在类型使用@EnableScheduling来开启定时任务
@Component
@EnableScheduling
public class TestTask {
private static ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//在方法上使用@Scheduled注解来创建具体的定时任务
@Scheduled(cron = "0/10 * * * * ?")
private void task1() {
System.err.println("执行定时任务了,执行时间为:" + dateFormat.get().format(new Date()));
}
}
看下执行结果:
在类上使用了@EnableScheduling来开启定时任务,使用了@Component是为了注入到spring容器中,这里不用@Component会不会注入我倒没有试过,有试过的小伙伴可以说一下。
在具体需要定时执行的方法上,使用 @Scheduled注解,这个注解里面的参数有很多种,我这用了cron表达式,这里介绍下这个注解的参数吧
@Scheduled注解的各个参数
cron
使用方式:@Scheduled(cron = "0/10 * * * * ?")
源码定义:String cron() default "";
说明:cron表达式,就是我们日常用的cron,具体的就不贴出来了
zone
使用方式:@Scheduled(zone = "GMT+08:00")
源码定义:String zone() default "";
说明:时区,cron表达式会基于这个时区解析,默认为空,会取应用所在服务器的时区,一般不填就可以了,和jdk中TimeZone用的是统一体系,就不具体说了
fixedDelay
使用方式:@Scheduled(fixedDelay = 1)
源码定义:long fixedDelay() default -1;
说明:上次执行完了,相隔多长时间以后再执行,单位是毫秒
fixedDelayString
使用方式:
@Scheduled(fixedDelayString = "1")
@Scheduled(fixedDelayString = "${配置文件里面的值}")
源码定义:String fixedDelayString() default "";
说明:和fixedDelay一样,是string类型的可以填数,单位是毫秒,可以使用配置文件里面的值,使用方法和spring注入配置文件的使用方式一样
fixedRate
使用方式:@Scheduled(fixedRate = 1)
源码定义:long fixedRate() default -1;
说明:上次执行开始后,相隔多长时间以后再执行,单位是毫秒
fixedRateString
使用方式:
@Scheduled(fixedRateString = "1")
@Scheduled(fixedRateString = "${配置文件里面的值}")
源码定义:String fixedRateString() default "";
说明:和fixedRate一样,,是string类型的可以填数,单位是毫秒,可以使用配置文件里面的值,使用方法和spring注入配置文件的使用方式一样
initialDelay
使用方式:@Scheduled(initialDelay = 1)
源码定义:long initialDelay() default -1;
说明:上第一次执行后,相隔多长时间以后再执行,单位是毫秒
initialDelayString
使用方式:
@Scheduled(initialDelayString = "1")
@Scheduled(initialDelayString = "${配置文件里面的值}")
源码定义:String initialDelayString() default "";
说明:和initialDelay一样,,是string类型的可以填数,单位是毫秒,可以使用配置文件里面的值,使用方法和spring注入配置文件的使用方式一样
springboot通过注接口创建定时任务
通过接口创建定时,就会比较灵活,定时cron表达式就不用写死在代码的注解上了,可以通过存储到数据库等存储系统中,在接口中来获取这个配置的表达式,这样可以实现一个简易的任务调度平台,通过数据库配置就可以管理定时任务的执行
实现接口SchedulingConfigurer
主要用的是这个接口SchedulingConfigurer,他是org.springframework.scheduling.annotation.SchedulingConfigurer这个包路径,其实也是都在org.springframework:spring-context这个包下
就引入org.springframework:spring-context这个包就可以使用了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
主要方法
复写configureTasks方法,这个方法通过ScheduledTaskRegistrar来添加定时任务,大致看方法,入参基本是一个线程对象,后面那个参数和注解里面一样,主要有cron表达式,delay上次执行完了,相隔多长时间以后再执行,initial什么的就不一一赘述了
直接上代码来一个栗子
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.config.Task;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @createdTime: 2020/4/7 18:33.
* @version: 1.0 .
*/
@Component
@EnableScheduling
public class TestTask2 implements SchedulingConfigurer {
private static ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
/**
* Callback allowing a {@link TaskScheduler
* TaskScheduler} and specific {@link Task Task}
* instances to be registered against the given the {@link ScheduledTaskRegistrar}.
*
* @param taskRegistrar the registrar to be configured.
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
System.err.println("假装从数据库中获取到了配置好的定时任务执行计划");
String cron = "0/10 * * * * ?";
taskRegistrar.addCronTask(() -> {
System.err.println("接口定时任务执行定时任务了,执行时间为:" + dateFormat.get().format(new Date()));
},cron);
}
}
这里通过重写configureTasks方法,使用ScheduledTaskRegistrar对象来创建定时任务,然后表达式可以从数据库等地方读取,演示时候就不写那块代码了,这样可以很简单的实现出来一个简单的任务调度平台
看下执行结果:
springboot创建定时任务就为大家说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识。
来源:https://juejin.cn/post/6983315243715788830


猜你喜欢
- 前言在我们的工作中,经常会遇到需要在普通类中使用放在Spring容器中的类的情况。最常见的情况大概就是有一个类他的属性的是通过spring的
- 1.字节码增强技术字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。参考地址2.常见技术技术分类类型静态增强Asp
- 方法的递归调用1. 基本介绍:简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁
- java实现读取、删除文件夹下的文件package test.com;import java.io.File;import java.io.
- C#调用dll报错:无法加载dll,找不到指定模块最近在做一个swmm模型的项目,在swmm源码上进行改写了两个函数,结果调用的时候就报错了
- 每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联。Handler一般有两种用途:1)执行计划任务,
- 本文实例讲述了C#实现基于加减按钮形式控制系统音量及静音的方法。分享给大家供大家参考。具体如下:using System; using Sy
- 本文实例讲述了C#实现带阴历显示的日期代码,分享给大家供大家参考。具体方法如下:这是一个用于酒店预定功能的带日期控件,类似去哪网酒店预定,由
- 本文实例为大家分享了swing登录注册界面展示的具体代码,供大家参考,具体内容如下开发环境:Eclipse Neon.3 Release (
- 循环结构可以实现一个程序模块的重复执行,它对于我们简化程序,更好地组织算法有着重要的意义。C#为我们提供了若干种循环语句,分别适用于不同的情
- 本文实例为大家分享了Flutter实现顶部导航栏的具体代码,供大家参考,具体内容如下import 'package:flutter/
- 为什么需要将webView放在独立进程webView 加载网页的时候可能占用大量内存,导致应用程序OOM。webView 在访问结束的时候可
- Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z-xing 码),该文章主要用于笔者自己学习中的总结,暂贴出代码部分
- 目录对象的创建创建方式对象的内存布局创建过程对象的内存分配分配方式并发安全代码优化逃逸分析的不成熟性实际的对象空间分配过程对象的访问句柄直接
- 一、JDK中常见的异常情况1、常见异常总结图2、java中异常分类Throwable类有两个直接子类:(1)Exception:出现的问题是
- 一、反射的基本概念1、反射的概念将类的各个组成部分封装成其他对象,这就是反射的机制.通过上图,我们可以通过反射获得Person类的Class
- 过滤器实现过滤器需要实现 javax.servlet.Filter 接口。重写三个方法。其中 init()&n
- Lombok简介和其他语言相比,Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,
- 本文解析了C# KeyUp事件中MessageBox的回车(Enter)键出现回调问题的解决办法。具体问题如下:在一个窗体上有一个名为txt
- 这里不准备讨论REST的细节内容,但是总体上,REST是让客户端与服务器段的交互通过发送和接收展示资源的方式来进行,在这里有必要说明:Fie