版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 感恩父母心孝道传万家:小学主题班会课件之德性篇
- 加强工业互联网产业基础
- 产品研发计划调整回复函3篇范文
- 河北省廊坊市2025-2026学年高二上学期1月期末考试地理试题
- 诚实守信待人勤奋踏实做事小学主题班会课件
- 农产品市场销售策略方案
- 2026年工匠精神制造测试题及答案
- 2026年小程序7号测试题及答案
- 2026年统计指数课堂测试题及答案
- 2026年生物人教版中考测试题及答案
- 2026山东临沂沂河人力资源有限公司招聘劳务派遣人员9人考试参考题库及答案详解
- 2026年医院收费员考试试题专项及参考答案
- 2026年高考历史真题山东卷含答案
- 2026年全国新高考1卷语文试卷(含答案及解析)
- 有限空间作业监理实施细则
- GB/T 21001.2-2015制冷陈列柜第2部分:分类、要求和试验条件
- 光盘技术课件
- DB37-T 3962-2020 养老机构安全事故隐患排查治理体系实施指南-(高清版)
- 医院综合楼装饰工程工程监理规划
- 广东省紧密型县域医共体双向转诊管理中心运行指南
- 养生指导中医养生指导
评论
0/150
提交评论