章
目
录
最近有个同学咨询关于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就是方便我们实现在某个时间段内,按某个频率执行某个业务代码,超过这个时间段就结束任务,在此场景下应用会比较适合。





