springboot通过注解、接口创建定时任务详解

 更新时间:2021年07月14日 14:52:35   作者:小草莓子桑  
使用SpringBoot创建定时任务其实是挺简单的,这篇文章主要给大家介绍了关于springboot如何通过注解、接口创建这两种方法实现定时任务的相关资料,需要的朋友可以参考下

项目中经常会用到定时任务,有的人在用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创建定时任务就为大家说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识。

总结

到此这篇关于springboot通过注解、接口创建定时任务的文章就介绍到这了,更多相关springboot创建定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven中optional和scope元素的使用弄明白了吗

    Maven中optional和scope元素的使用弄明白了吗

    这篇文章主要介绍了Maven中optional和scope元素的使用弄明白了吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot集成RocketMQ实现消息发送的三种方式

    SpringBoot集成RocketMQ实现消息发送的三种方式

    RocketMQ 支持3 种消息发送方式: 同步 (sync)、异步(async)、单向(oneway),本文就将给大家介绍一下SpringBoot集成RocketMQ实现消息发送的三种方式文中有详细的代码示例,需要的朋友可以参考下
    2023-09-09
  • springboot+thymeleaf+shiro标签的实例

    springboot+thymeleaf+shiro标签的实例

    这篇文章主要介绍了springboot+thymeleaf+shiro标签的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • JVM Client和Server端有什么区别

    JVM Client和Server端有什么区别

    这篇文章主要介绍了JVM Client和Server端有什么区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java基础教程之类数据与类方法

    Java基础教程之类数据与类方法

    这篇文章主要介绍了Java基础教程之类数据与类方法,本文是对类的深入探讨,类数据指类的一些属性、参数等,类方法就是类包含的功能方法,需要的朋友可以参考下
    2014-08-08
  • Java中线程池自定义实现详解

    Java中线程池自定义实现详解

    这篇文章主要为大家详细介绍了Java如何实现自定义线程池,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴可以了解一下
    2023-03-03
  • 论Java Web应用中调优线程池的重要性

    论Java Web应用中调优线程池的重要性

    这篇文章主要论述Java Web应用中调优线程池的重要性,通过了解应用的需求,组合最大线程数和平均响应时间,得出一个合适的线程池配置
    2016-04-04
  • 浅谈Java平台无关性

    浅谈Java平台无关性

    这篇文章主要介绍了浅谈Java平台无关性,对此感兴趣的同学,可以多了解一下
    2021-04-04
  • 打卡每日10道面试题——JVM篇

    打卡每日10道面试题——JVM篇

    总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新,希望大家能够喜欢
    2021-06-06
  • SpringBoot整合Mybatis简单实现增删改查

    SpringBoot整合Mybatis简单实现增删改查

    这篇文章主要介绍了SpringBoot整合Mybatis简单实现增删改查,文章为围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论