SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法
前言
最近在项目中使用到定时任务,之前一直都是使用quartz 来实现,最近看spring 基础发现其实spring 提供 spring schedule 可以帮助我们实现简单的定时任务功能。
下面说一下两种方式在spring boot 项目中的使用。
spring schedule 实现定时任务
spring schedule 实现定时任务有两种方式 1. 使用xml配置定时任务, 2. 使用 @scheduled 注解。 因为是spring boot 项目 可能尽量避免使用xml配置的形式,主要说注解的形式.
spring schedule 提供三种形式的定时任务:
固定等待时间 @scheduled(fixeddelay = 时间间隔 )
@component public class schedulejobs { public final static long second = 1 * 1000; fastdateformat fdf = fastdateformat.getinstance("yyyy-mm-dd hh:mm:ss"); @scheduled(fixeddelay = second * 2) public void fixeddelayjob() throws interruptedexception { timeunit.seconds.sleep(2); system.out.println("[fixeddelayjob execute]"+fdf.format(new date())); } }
固定间隔时间 @scheduled(fixedrate = 时间间隔 )
@component public class schedulejobs { public final static long second = 1 * 1000; fastdateformat fdf = fastdateformat.getinstance("yyyy-mm-dd hh:mm:ss"); @scheduled(fixedrate = second * 4) public void fixedratejob() { system.out.println("[fixedratejob execute]"+fdf.format(new date())); } }
corn表达式 @scheduled(cron = corn表达式)
@component public class schedulejobs { public final static long second = 1 * 1000; fastdateformat fdf = fastdateformat.getinstance("yyyy-mm-dd hh:mm:ss"); @scheduled(cron = "0/4 * * * * ?") public void cronjob() { system.out.println("[cronjob execute]"+fdf.format(new date())); } }
spring boot 整合 quartz 实现定时任务
添加maven依赖
<dependency> <groupid>org.quartz-scheduler</groupid> <artifactid>quartz</artifactid> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-support</artifactid> </dependency>
spring boot 整合 quartz
spring 项目整合 quartz 主要依靠添加 schedulerfactorybean 这个 factorybean ,所以在maven 依赖中添加 spring-context-support 。
首先添加 quartzconfig 类 来声明相关bean
@configuration public class quartzconfig { @autowired private springjobfactory springjobfactory; @bean public schedulerfactorybean schedulerfactorybean() { schedulerfactorybean schedulerfactorybean = new schedulerfactorybean(); schedulerfactorybean.setjobfactory(springjobfactory); return schedulerfactorybean; } @bean public scheduler scheduler() { return schedulerfactorybean().getscheduler(); } }
这里我们需要注意 我注入了一个 自定义的jobfactory ,然后 把其设置为schedulerfactorybean 的 jobfactory。其目的是因为我在具体的job 中 需要spring 注入一些service。
所以我们要自定义一个jobfactory, 让其在具体job 类实例化时 使用spring 的api 来进行依赖注入。
springjobfactory 具体实现:
@component public class springjobfactory extends adaptablejobfactory { @autowired private autowirecapablebeanfactory capablebeanfactory; @override protected object createjobinstance(triggerfiredbundle bundle) throws exception { object jobinstance = super.createjobinstance(bundle); capablebeanfactory.autowirebean(jobinstance); return jobinstance; } }
具体使用 (摘取自项目代码):
@service public class quartzeventserviceimpl implements quartzeventservice { private static final string job_group = "event_job_group"; private static final string trigger_group = "event_trigger_group"; @autowired private scheduler scheduler; @override public void addquartz(event event) throws schedulerexception { jsonobject eventdata = jsonobject.parseobject(event.geteventdata()); date triggerdate = eventdata.getdate("date"); jobdetail job = jobbuilder.newjob(eventjob.class).withidentity(event.getid().tostring(), job_group).usingjobdata(buildjobdatemap(event)).build(); trigger trigger = triggerbuilder.newtrigger().withidentity(event.getid().tostring(), trigger_group).startat(triggerdate).build(); scheduler.schedulejob(job, trigger); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: JAVA基础知识之File类