SpringBoot集成石英如何实现定时任务

  介绍

这篇文章主要为大家展示了SpringBoot集成石英如何实现定时任务,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计。我的设计是按天统计每种状态的比例。为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态。另外,考虑到学生的请假需求,请假的申请往往是提前做的好,等系统时间走到实际请假时间的时候,系统要将学生的状态修改为请假。

显然,这两个子需求都可以通过定时任务实现。在网上略做搜索以后,我选择了比较流行的定时任务框架石英。

石英是一个定时任务框架,其他介绍网上也很详尽。这里要介绍一下石英里的几个非常核心的接口。

2.1调度器接口

调度器翻译成调度器、石英通过调度器来注册,暂停,删除触发和JobDetail.Scheduler还拥有一个SchedulerContext,顾名思义就是上下文,通过SchedulerContext我们可以获取到触发器和任务的一些信息。

2.2触发接口

触发可以翻译成触发器,通过cron表达式或是SimpleScheduleBuilder等类,指定任务执行的周期。系统时间走到触发器指定的时间的时候,触发器就会触发任务的执行。

2.3 JobDetail接口

工作接口是真正需要执行的任务.JobDetail接口相当于将工作接口包装了一下,触发和调度器实际用到的都是JobDetail。

<强>

SpringBoot官方写了<代码> spring-boot-starter-quartz>

现在我们来看一看SpingBoot2.2.6官方文档,其中第4.20小节<代码> Quartz调度器>

春季引导提供了一些便利使用Quartz调度器,包括
spring-boot-starter-quartz“起动”。如果石英可用,一个调度程序是自动配置(通过SchedulerFactoryBean抽象)。
以下类型的bean自动捡起并与调度器:
, # 8226;JobDetail:定义一个特定的工作。JobDetail实例可以构建JobBuilder API。
, # 8226;日历。
, # 8226;触发触发:定义当一个特定的工作。

翻译一下:

SpringBoot提供了一些便捷的方法来和石英协同工作,这些方法里面包括“spring-boot-starter-quartz”这个启动器。如果石英可用,调度器会通过SchedulerFactoryBean这个工厂bean自动配置到SpringBoot里。
JobDetail,日历,触发这些类型的bean会被自动采集并关联到调度器上。

工作可以定义setter注入数据地图属性。普通的bean,也可以以类似的方式注入。

翻译一下:

工作可以定义setter(也就是集方法)来注入配置信息。也可以用同样的方法注入普通的bean。

下面是文档里给的示例代码,我直接完全照着写,拿到的却是null。不知道是不是我的使用方式有误。后来仔细一想,文档的意思应该是在创建工作对象之后,调组用方法将依赖注入进去。但后面我们是通过框架反射生成的工作对象,这样做反而会搞得更加复杂。最后还是决定采用给工作类加@ component注解的方法。

文档的其他篇幅就介绍了一些配置,但是介绍得也不全面,看了帮助也并不是很大。详细的配置可以参考w3school的石英配置。

4.1建表

我选择将定时任务的信息保存在数据库中,优点是显而易见的,定时任务不会因为系统的崩溃而丢失。

建表的sql语句在石英的github中可以找到,里面有针对每一种常用数据库的sql语句,具体地址是:石英数据库建表的sql。

 SpringBoot集成石英如何实现定时任务

建表以后,可以看到数据库里多了11张表。我们完全不需要关心每张表的具体作用,在添加删除任务,触发器等的时候,石英框架会操作这些表。

4.2引入依赖

在<代码>砰的一声。xml 里添加依赖。

& lt; !——石英定时任务——比;   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-quartz   & lt; version> 2.2.6.RELEASE   & lt;/dependency>

4.3配置石英

在<代码>应用程序。yml> SpringBoot集成石英如何实现定时任务