工控智汇

工控智汇

spring-boot-starter-quartz使用SpringBoot自动配置功能

admin 150 2

spring-boot-starter-quartz

针对公司业务要求,针对springboot,对quartz做了简单的封装,将其做成SpringBoot的一个Starter模块。主要功能有:


任务配置动态更新,增加,停止,立即执行

任务立即执行

quartz集群节点是否开启实现可配置化

后续功能继续增加中。。。

以下是在项目中具体使用方法:

1、导入spring-boot-starter-quartz包

maven

/groupIdartifactIdspring-boot-starter-quartz//version/depency

gradle

compile(':spring-boot-starter-quartz:1.0')

2、开启Quartz自动配置

目前提供了@EnableQuartz,@EnableQuartzBean,@EnableQuartzDataBase三个开启自动配置注解。

@EnableQuartz:开启所有的自动配置

@EnableQuartzBean:开启quartz远程调用客户端配置

@EnableQuartzDataBase:开启quartz远程调用客户端及quartz相关基础Bean的配置

3、任务配置表

脚本可在发布包的根目录中获得

Quartz集群的相关表可在Quartz的发布包目录下找到相关SQL。

Quartz官方源码地址:【】

以下以Oracle的脚本为例

--CREATETABLECREATETABLEQRTZ_TIMED_TASK(TASK_NAMEVARCHAR2(200),TASK_DESCVARCHAR2(500),TASK_EXPRESVARCHAR2(100),TASK_METHODVARCHAR2(200),TASK_CLASSVARCHAR2(200),TASK_GROUPVARCHAR2(200)DEFAULT0,STATUSVARCHAR2(100)DEFAULT'U',CREATE_TIMEDATEDEFAULTSYSDATE,CREATERVARCHAR2(200),MODIFY_TIMEDATEDEFAULTSYSDATE,MODIFIERVARCHAR2(200));--ADDCOMMENTSTOTHECOLUMNSCOMMENTONCOLUMNQRTZ_TIMED__NAMEIS'任务名称';COMMENTONCOLUMNQRTZ_TIMED__DESCIS'任务描述';COMMENTONCOLUMNQRTZ_TIMED__EXPRESIS'任务执行表达式';COMMENTONCOLUMNQRTZ_TIMED__METHODIS'任务执行方法';COMMENTONCOLUMNQRTZ_TIMED__CLASSIS'任务接口路径';COMMENTONCOLUMNQRTZ_TIMED__GROUPIS'任务分组';COMMENTONCOLUMNQRTZ_TIMED_'任务状态';COMMENTONCOLUMNQRTZ_TIMED__TIMEIS'创建时间';COMMENTONCOLUMNQRTZ_TIMED_'创建人员';COMMENTONCOLUMNQRTZ_TIMED__TIMEIS'修改时间';COMMENTONCOLUMNQRTZ_TIMED_'修改人员';--CREATE/RECREATEPRIMARY,UNIQUEANDFOREIGNKEYCONSTRAINTSALTERTABLEQRTZ_TIMED_TASKADDPRIMARYKEY(TASK_NAME)USINGINDEXPCTFREE10INITRANS2MAXTRANS255STORAGE(INITIAL64KNEXT1MMINEXTENTS1MAXEXTENTSUNLIMITED);--CREATEINDEXCREATEINDEXIDX_TIMED_STATUSONQRTZ_TIMED_TASK(STATUS)PCTFREE10INITRANS2MAXTRANS255STORAGE(INITIAL64KNEXT1MMINEXTENTS1MAXEXTENTSUNLIMITED);
--CREATETABLECREATETABLEQRTZ_TIMED_TASK_PARAM(PARAM_KEYVARCHAR2(100)NOTNULL,PARAM_VALUEVARCHAR2(1000)NOTNULL,PARAM_TYPEVARCHAR2(100),PARAM_DESCVARCHAR2(1000),TASK_NAMEVARCHAR2(200)NOTNULL,SORT_IDINTEGERDEFAULT0);--ADDCOMMENTSTOTHECOLUMNSCOMMENTONCOLUMNQRTZ_TIMED_TASK__KEYIS'参数代码';COMMENTONCOLUMNQRTZ_TIMED_TASK__VALUEIS'参数值';COMMENTONCOLUMNQRTZ_TIMED_TASK__TYPEIS'参数类型(不填默认为STRING类型)';COMMENTONCOLUMNQRTZ_TIMED_TASK__DESCIS'参数描述';COMMENTONCOLUMNQRTZ_TIMED_TASK__NAMEIS'任务名称';COMMENTONCOLUMNQRTZ_TIMED_TASK__IDIS'参数顺序';--CREATE/RECREATEPRIMARY,UNIQUEANDFOREIGNKEYCONSTRAINTSALTERTABLEQRTZ_TIMED_TASK_PARAMADDPRIMARYKEY(PARAM_KEY,TASK_NAME)USINGINDEXPCTFREE10INITRANS2MAXTRANS255STORAGE(INITIAL64KNEXT1MMINEXTENTS1MAXEXTENTSUNLIMITED);--CREATEINDEXCREATEINDEXIDX_TIMED_TASK_PARAM_NAMEONQRTZ_TIMED_TASK_PARAM(TASK_NAME)PCTFREE10INITRANS2MAXTRANS255STORAGE(INITIAL64KNEXT1MMINEXTENTS1MAXEXTENTSUNLIMITED);

解释:

QRTZ_TIMED__NAME:任务名称,任务在调度工厂中的唯一标识,再配合参数表的配置,可实现一个接口,配置多个任务的功能

QRTZ_TIMED_:表示任务状态,分为四种状态,U表示有效运行,即此任务在工程启动之后即可正常运行;E表示无效任务,即此任务无效,不会自动运行;D表示此任务要删除,调度工厂删除任务后,任务状态改为E;S表示将启动此任务,任务启动成功后,状态改为U

QRTZ_TIMED__CLASS:任务类路径,类必须加入到Spring上下文中,可支持配置接口,实现类,或者普通类。

QRTZ_TIMED_TASK__ID:参数顺序,默认使用LinkedHashMap存储,可通过参数顺序,实现通用接口,不同参数配置而实现一个接口多任务配置

4、开发任务接口

任务的开发需按照以下标准开发:

任务接口需大写I开头,大写SV结尾

接口实现类需去掉接口的I开头,然后在SV后加Impl

接口方法参数必须为Map

如:

publicinterfaceIHelloSV{voidhello();voidhello(Mapparam);}publicclassHelloSVImplimplementsIHelloSV{publicvoidhello(){}publicvoidhello(Mapparam){}}

5、任务配置

在配置任务时,按照以下要求配置:

优先配置接口类

如需配置接口参数,在参数表中指定参数名,参数值,并指定task_name

参数配置时,参数类型可为空,默认使用MapString,String接收,当指定参数类型时,使用MapString,Object接收,在代码中可使用强制类型转换

参数类型只支持基本类型,配置时使用全路径

如:

INSERTINTOQRTZ_TIMED_TASK(TASK_NAME,TASK_DESC,TASK_EXPRES,TASK_METHOD,TASK_CLASS,TASK_GROUP,STATUS)VALUES('hello1','测试1','0/10****?','hello','','hello','U');INSERTINTOQRTZ_TIMED_TASK(TASK_NAME,TASK_DESC,TASK_EXPRES,TASK_METHOD,TASK_CLASS,TASK_GROUP,STATUS)VALUES('hello2','测试2','0/10****?','hello','','hello','U');INSERTINTOQRTZ_TIMED_TASK_PARAM(PARAM_KEY,PARAM_VALUE,PARAM_TYPE,PARAM_DESC,TASK_NAME)VALUES('name','admin','','测试参数','hello2');

6、quartz配置

此项目默认采用quartz单机配置方式。具体配置可在发布包根目录下的中查看。如需使用集群配置,可在自己项目的classpath下新建文件进行配置。

7、任务动态更新

新增任务

在QRTZ_TIMED_TASK表中新增任务配置之后,将STATUS字段改为S即可。

删除任务

将QRTZ_TIMED_TASK表要删除的数据的STATUS字段改为D即可。

修改任务

任务只支持修改以下几项:

QRTZ_TIMED__EXPRES,QRTZ_TIMED_TASK__KEY,QRTZ_TIMED_TASK__VALUE,QRTZ_TIMED_TASK__TYPE,QRTZ_TIMED_TASK__DESC,

注:当只修改了QRTZ_TIMED_TASK时,只有TASK_EXPRES生效;修改了QRTZ_TIMED_TASK_PARAM配置之后,QRTZ_TIMED_TASK的其他配置都是可以修改的。

8、Quartz集群相关表介绍

触发器与任务关联表,存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息。

存储简单的Trigger,包括重复次数,间隔,以及已触发的次数

存储CronTrigger,包括Cron表达式和时区信息

Trigger作为Blob类型存储(用于Quartz用户用JDBC创建他们自己定制的Trigger类型,JobStore并不知道如何存储实例的时候)

存储已配置的Trigger的信息

存储每一个已配置的Job的详细信息

以Blob类型存储Quartz的Calar日历信息,quartz可配置一个日历来指定一个时间范围

存储已暂停的Trigger组的信息

存储程序的非观锁的信息(假如使用了悲观锁)

存储少量的有关Scheduler的状态信息,和别的Scheduler实例(假如是用于一个集群中)

9、quartz时间表达式

时间格式:smhdmw(?)y(?)对应:秒分小时日月周年