章
目
录
最近有个同学咨询关于Quartz框架定时任务的问题,但他不是使用的cron方式实现指定时间间隔执行某个代码逻辑,而是使用的是SimpleTrigger的方式来实现的。之前潘老师也只用过cron注解配置的方式实现过,SimpleTrigger定时执行某个方法还真没试过,但好在最后成功解决了他的bug,因此也趁这个机会整理下关于SimpleTrigger的实现Quartz定时任务的方式。
关于什么是Quartz潘老师就不再此啰嗦了,只说下它不仅可以使用在web项目上,也可以使用在普通java项目上,因此,潘老师就直接在普通java项目上演示SimpleTrigger方式的代码。
一、导入依赖包
首先我们导入Quartz框架的依赖包,具体如下:
<!--quzrtz框架 核心包--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <!--工具包 可选--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.2</version> </dependency>
二、创建job
其次我们要定义好需要定时执行的业务逻辑代码,注意该任务类必须实现Job
接口,然后重写execute
方法,execute
方法中就是定时执行的业务代码,这里潘老师定义一个HelloJob
类。
package com.panziye; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Trigger; import java.text.SimpleDateFormat; import java.util.Date; public class HelloJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 定时业务逻辑 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println("say hello time: " + sdf.format(new Date())); // 其他一些知识,比如获取trigger触发器对象 Trigger trigger = jobExecutionContext.getTrigger(); System.out.println("jobKey的名称:" + trigger.getKey().getName()); System.out.println("jobKey组的名称: " + trigger.getKey().getGroup()); System.out.println("job 开始时间:" + sdf.format(trigger.getStartTime())); System.out.println("job 结束时间: " + sdf.format(trigger.getEndTime())); System.out.println("========================================"); } }
三、创建调度器
最后我们需要创建调度器,实现定时对job代码进行调度执行,这里潘老师直接就在main方法中来实现:
package com.panziye; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.Date; public class App { public static void main(String[] args) { try { // 调用 testSimpleTrigger(); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 调度器测试 * 开始时间:当前时间推迟5秒 * 结束时间:当前时间推迟65秒 * */ public static void testSimpleTrigger() throws SchedulerException { //调度器(Scheduler),从工厂中获取调度实例, Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 当前时间 Date now = new Date(); //开始时间 startTime 当前时间推迟5秒 Date startTime = new Date(now.getTime() + 5000); //结束时间 endTime 当前时间推迟65秒 Date endTime = new Date(now.getTime() + 65000); //任务实例(JobDetail) //构建任务类 完成与HelloJob的绑定 要求 HelloJob必须实现Job接口 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) //参数1 任务的名称 参数2 任务组的名称 .withIdentity("job1", "group1") //传递参数 .usingJobData("msg", "jobDetail测试") // 构建 .build(); // 构建触发器Trigger Trigger trigger = TriggerBuilder.newTrigger() //参数1 触发器的名称 参数2 触发器组的名称 .withIdentity("trigger1", "group1") // 每隔10秒执行一次,一直执行下去,也可以withRepeatCount指定重复次数 .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()) //设置任务的开始时间 .startAt(startTime) //设置任务的结束时间 .endAt(endTime) // 构建 .build(); // 将trigger和jobdetail加入这个调度 scheduler.scheduleJob(jobDetail, trigger); //启动调度器 其实是开了一个新的线程 scheduler.start(); } }
四、启动测试
我们启动项目,我们发现等待5s后开始执行job任务,而且每隔10s执行一次,直到到结束时间停止任务,测试效果如下:
五、总结
其实在实际开发中通过SimpleTrigger实现Quartz定时任务方式应用的比较少,一般还是cron用的比较多,也更灵活,我当时问那位同学为什么不用cron而用SimpleTrigger,他给出的答案是公司的需求正好有指定开始时间、结束时间、执行次数、每次执行间隔这4个参数,而SimpleTrigger完全符合,所以就选择了SimpleTrigger。
其实说白了SimpleTrigger就是方便我们实现在某个时间段内,按某个频率执行某个业务代码,超过这个时间段就结束任务,在此场景下应用会比较适合。