springboot整合Quartz实现动态配置定时任务_第1页
springboot整合Quartz实现动态配置定时任务_第2页
springboot整合Quartz实现动态配置定时任务_第3页
springboot整合Quartz实现动态配置定时任务_第4页
springboot整合Quartz实现动态配置定时任务_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

springboot整合Quartz实现动态配置定时任务在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能。一、新建一个springboot工程,并添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency><!--

为了方便测试,此处使用了内存数据库

--> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency><!--

该依赖必加,里面有sping对schedule的支持

-->

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

</dependency>二、配置文件perties#

服务器端口号

server.port=7902#

是否生成ddl语句

spring.jpa.generate-ddl=false

#

是否打印sql语句

spring.jpa.show-sql=true

#

自动生成ddl,由于指定了具体的ddl,此处设置为none

spring.jpa.hibernate.ddl-auto=none

#

使用H2数据库

spring.datasource.platform=h2

#

指定生成数据库的schema文件位置

spring.datasource.schema=classpath:schema.sql

#

指定插入数据库语句的脚本位置

spring.datasource.data=classpath:data.sql

#

配置日志打印信息

logging.level.root=INFO

.hibernate=INFO

.hibernate.type.descriptor.sql.BasicBinder=TRACE

.hibernate.type.descriptor.sql.BasicExtractor=TRACE

.itmuch=DEBUG三、Entity类package

com.chhliu.springboot.quartz.entity;import

javax.persistence.Column;import

javax.persistence.Entity;import

javax.persistence.GeneratedValue;import

javax.persistence.GenerationType;import

javax.persistence.Id;@Entitypublic

class

Config

{ @Id

@GeneratedValue(strategy

=

GenerationType.AUTO)

private

Long

id;

@Column

private

String

cron; /**

*

@return

the

id

*/ public

Long

getId()

{ return

id; }

……此处省略getter和setter方法……}四、任务类package

com.chhliu.springboot.quartz.entity;import

org.slf4j.Logger;import

org.slf4j.LoggerFactory;import

org.springframework.context.annotation.Configuration;import

org.springframework.scheduling.annotation.EnableScheduling;import

org.springframework.stereotype.Component;@Configuration@Component

//

此注解必加@EnableScheduling

//

此注解必加public

class

ScheduleTask

{ private

static

final

Logger

LOGGER

=

LoggerFactory.getLogger(ScheduleTask.class); public

void

sayHello(){ LOGGER.info("Hello

world,

i'm

the

king

of

the

world!!!"); }}五、Quartz配置类由于springboot追求零xml配置,所以下面会以配置Bean的方式来实现package

com.chhliu.springboot.quartz.entity;import

org.quartz.Trigger;import

org.springframework.context.annotation.Bean;import

org.springframework.context.annotation.Configuration;import

org.springframework.scheduling.quartz.CronTriggerFactoryBean;import

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;import

org.springframework.scheduling.quartz.SchedulerFactoryBean;@Configurationpublic

class

QuartzConfigration

{

/**

*

attention:

*

Details:配置定时任务

*/

@Bean(name

=

"jobDetail")

public

MethodInvokingJobDetailFactoryBean

detailFactoryBean(ScheduleTask

task)

{//

ScheduleTask为需要执行的任务

MethodInvokingJobDetailFactoryBean

jobDetail

=

new

MethodInvokingJobDetailFactoryBean();

/*

*

是否并发执行

*

例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,

*

如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行

*/

jobDetail.setConcurrent(false);

jobDetail.setName("srd-chhliu");//

设置任务的名字

jobDetail.setGroup("srd");//

设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用

/*

*

为需要执行的实体类对应的对象

*/

jobDetail.setTargetObject(task);

/*

*

sayHello为需要执行的方法

*

通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的sayHello方法

*/

jobDetail.setTargetMethod("sayHello");

return

jobDetail;

}

/**

*

attention:

*

Details:配置定时任务的触发器,也就是什么时候触发执行定时任务

*/

@Bean(name

=

"jobTrigger")

public

CronTriggerFactoryBean

cronJobTrigger(MethodInvokingJobDetailFactoryBean

jobDetail)

{

CronTriggerFactoryBean

tigger

=

new

CronTriggerFactoryBean();

tigger.setJobDetail(jobDetail.getObject());

tigger.setCronExpression("0

30

20

*

*

?");//

初始时的cron表达式

tigger.setName("srd-chhliu");//

trigger的name

return

tigger;

}

/**

*

attention:

*

Details:定义quartz调度工厂

*/

@Bean(name

=

"scheduler")

public

SchedulerFactoryBean

schedulerFactory(Trigger

cronJobTrigger)

{

SchedulerFactoryBean

bean

=

new

SchedulerFactoryBean();

//

用于quartz集群,QuartzScheduler

启动时更新己存在的Job

bean.setOverwriteExistingJobs(true);

//

延时启动,应用启动1秒后

bean.setStartupDelay(1);

//

注册触发器

bean.setTriggers(cronJobTrigger);

return

bean;

}}六、定时查库,并更新任务package

com.chhliu.springboot.quartz.entity;import

javax.annotation.Resource;import

org.quartz.CronScheduleBuilder;import

org.quartz.CronTrigger;import

org.quartz.JobDetail;import

org.quartz.Scheduler;import

org.quartz.SchedulerException;import

org.springframework.beans.factory.annotation.Autowired;import

org.springframework.context.annotation.Configuration;import

org.springframework.scheduling.annotation.EnableScheduling;import

org.springframework.scheduling.annotation.Scheduled;import

org.springframework.stereotype.Component;import

com.chhliu.springboot.quartz.repository.ConfigRepository;@Configuration@EnableScheduling@Componentpublic

class

ScheduleRefreshDatabase

{ @Autowired private

ConfigRepository

repository; @Resource(name

=

"jobDetail") private

JobDetail

jobDetail; @Resource(name

=

"jobTrigger") private

CronTrigger

cronTrigger; @Resource(name

=

"scheduler") private

Scheduler

scheduler; @Scheduled(fixedRate

=

5000)

//

每隔5s查库,并根据查询结果决定是否重新设置定时任务 public

void

scheduleUpdateCronTrigger()

throws

SchedulerException

{ CronTrigger

trigger

=

(CronTrigger)

scheduler.getTrigger(cronTrigger.getKey()); String

currentCron

=

trigger.getCronExpression();//

当前Trigger使用的 String

searchCron

=

repository.findOne(1L).getCron();//

从数据库查询出来的 System.out.println(currentCron); System.out.println(searchCron); if

(currentCron.equals(searchCron))

{ //

如果当前使用的cron表达式和从数据库中查询出来的cron表达式一致,则不刷新任务 }

else

{ //

表达式调度构建器 CronScheduleBuilder

scheduleBuilder

=

CronScheduleBuilder.cronSchedule(searchCron); //

按新的cronExpression表达式重新构建trigger trigger

=

(CronTrigger)

scheduler.getTrigger(cronTrigger.getKey()); trigger

=

trigger.getTriggerBuilder().withIdentity(cronTrigger.getKey()) .withSchedule(scheduleBuilder).build(); //

按新的trigger重新设置job执行 scheduler.rescheduleJob(cronTrigger.getKey(),

trigger); currentCron

=

searchCron; } }}六、相关脚本1、data.sqlinsert

into

config(id,cron)

values(1,'0

0/2

*

*

*

?');

#

每2分钟执行一次定时任务http://www.f-1.cc2、schema.sqldrop

table

config

if

exists;create

table

config( id

bigint

generated

by

default

as

identity, cron

varchar(40), primary

key(id));六、运行测试测试结果如下:(Quartz默认的线程池大

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论