Quartz的基础认识
最近生产的自动任务总是时不时挂掉,弄得每天需要早早去公司手动跑批。心力憔悴,劳动节后痛定思痛,决定从根本上解决这个问题。(公司所用quartz版本1.6)
认识quartz
Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application.
quartz是一个贼屌的开源作业调度库,可用于几乎所有的java程序。
基础认识
Quartz有3个基础接口,分别为:
- Scheduler:调度器接口
- Job:作业接口
- Trigger:触发器接口
我知道此时你一头雾水,没关系,慢慢来:首先我们来看一下一个完整的触发过程:
try {
SchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
JobDetail jobDetail = new JobDetail("QuartzTestJob",
"1", QuartzTest.class);
jobDetail.getJobDataMap().put("chat", "hhh");
CronTrigger trigger = new CronTrigger("QuartzTestJob",
"1");
trigger.setCronExpression("0/1 * * ? * * *");
sched.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
e.printStackTrace();
}
Scheduler:调度器接口
调度器是Quartz框架的核心,管理着所有Trigger和Job,使得触发器能够成功触发作业运行。调度器接口本身有两个实现类:StdScheduler和RemoteScheduler。一般而言,都是使用StdScheduler,即标准调度器。StdScheduler调度器的构造函数需要两个参数,分别为QuartzScheduler对象和SchedulingContext 对象。往往我们会使用工厂来创建调度器。而说起工厂模式,scheduler有DirectSchedulerFactory和StdSchedulerFactory两种工厂模式。正常情况下都是使用StdSchedulerFactory工厂。
以上内容可以先不懂,日后再纠结。
Job:作业接口
事实上,当你打开org.quartz包中的Job.class你会发现,它只有一个名为void execute(JobExecutionContext context) throws JobExecutionException
的接口。这个接口的实现就是我们要触发的作业部分。
参照上述代码,有这么一句话JobDetail jobDetail = new JobDetail("QuartzTestJob", "1", QuartzTest.class);
,这句话中的QuartzTest.class其实就是实现Job接口的类,其实现函数如下:
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(context.getJobDetail().getJobDataMap().get("chat"));
}
Trigger:触发器接口
其位于包org.quartz的Trigger.class类,它拥有两个子类分别为SimpleTrigger以及CronTrigger。
这两个类作业和名字一样,一个是简单触发器接口一个是cron表达式触发器。
首先是简单触发器,我们打开SimpleTrigger.class,找到参数最全的构造函数,不难发现,其实这几个参数就是名字、分组、开始时间、结束时间、重复次数以及重复的间隔。
public SimpleTrigger(String name, String group, String jobName,
String jobGroup, Date startTime, Date endTime, int repeatCount,
long repeatInterval) {
super(name, group, jobName, jobGroup);
setStartTime(startTime);
setEndTime(endTime);
setRepeatCount(repeatCount);
setRepeatInterval(repeatInterval);
}
其次Cron触发器其实和上面的类似,其参数最全的构造函数为:
public CronTrigger(String name, String group, String jobName,
String jobGroup, Date startTime, Date endTime,
String cronExpression, TimeZone timeZone) throws ParseException {
super(name, group, jobName, jobGroup);
setCronExpression(cronExpression);
if (startTime == null) {
startTime = new Date();
}
setStartTime(startTime);
if (endTime != null) {
setEndTime(endTime);
}
if (timeZone == null) {
setTimeZone(TimeZone.getDefault());
} else {
setTimeZone(timeZone);
}
}
Cron触发器中,有两个参数值得我们特殊注意,一个是timeZone,另一个是cronExpression。其实无非就是将简单的时间出发改为了cronExpression表达式。而timeZone则是系统默认时间而已。我们一开始的例子其实用的就是CronTrigger。
简单小结
我们可以看到,所谓自动任务,其实就是配置触发器,配置任务,最后将任务与触发器相关联而已。
转载:https://blog.csdn.net/weixin_44159662/article/details/105944834