浅谈Triiger
Quartz中的触发器用来告诉调度程序作业什么时候触发。即Trigger对象是用来触发执行Job的。Trigger是Quartz框架中的核心接口,其最重要的两个实现类是CronTriggerImpl与SimpleTriggerImpl。
触发器的通用属性
- JobKey:表示与该Trigger绑定的Job实例的标识,触发器被触发时,该指定的Job实例会被执行
- StartTime:表示触发器的时间表首次被触发的时间,它的值得类型是Java.util.Date
- EndTime:指定触发器的不再被触发的时间,它的值得类型是Java.util.Date
关于这三个属性在代码中的具体实现。在Scheduler类中代码:
//创建一个JobDetail实例,将该实例与HelloJob Class绑定
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "group1")
.build();
//获取距离当前时间3秒后的时间
date.setTime(date.getTime()+3000);
//获取距离当前时间6秒后的时间
Date endDate=new Date();
endDate.setTime(endDate.getTime()+6000);
//创建一个Trigger实例,定义该Job3秒后执行,并且每隔两秒钟重复执行一次,6秒后停止
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//定义name/group
.startAt(date) //设置开始时间
.endAt(endDate) //设置结束时间
.withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
.withIntervalInSeconds(2) //每隔两秒执行一次
.repeatForever() //一直执行,直到程序死去
).build();
在Job实例中的代码:
//打印当前的执行时间,格式为2017-01-01 00:00:00
Date date=new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间为:"+sf.format(date));
//编写具体的业务逻辑
Trigger currentTrigger=context.getTrigger();
System.out.println("开始时间:"+sf.format(currentTrigger.getStartTime()));
System.out.println("结束时间:"+sf.format(currentTrigger.getEndTime()));
JobKey jobKey=currentTrigger.getJobKey();
System.out.println("与当前Trigger绑定的Job的name:"+jobKey.getName());
System.out.println("与当前Trigger绑定的Job的group:"+jobKey.getGroup());
SimpleTrigger介绍
SimpleTrigger的作用
在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务
具体例子
距离当前时间4秒钟之后首次执行任务,6秒后停止,每隔2秒执行,执行3次
//获取距离当前时间4秒后的时间
date.setTime(date.getTime()+4000);
//获取距离当前时间6秒后的时间
Date endDate=new Date();
endDate.setTime(endDate.getTime()+6000);
//创建一个SimpleTrigger实例,定义该Job4秒后执行,并且每隔两秒钟重复执行一次,6秒后停止
SimpleTrigger trigger=(SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//定义name/group
.startAt(date) //设置开始时间
.endAt(endDate) //设置结束时间
.withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
.withIntervalInSeconds(2) //每隔两秒执行一次
.withRepeatCount(3) //重复执行三次
).build();
最终结果只重复执行了一次,6秒后停止。注:如果同时设置了结束时间与重复次数,先结束的会覆盖后结束的,以先结束的为准。
另外,需要注意的点:
- 重复次数可以为0,正整数或者SimpleTrigger.REPEAT_INDEFINITELY(永远)常量值
- 重复执行的时间间隔必须为0或长整数
CronTrigger介绍
CronTrigger的作用
基于日历的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间,SimpleTrigger能够实现的,CronTrigger都能够实现,所以普遍都用CronTrigger。
具体例子
//创建一个CronTrigger实例
CronTrigger trigger=(CronTrigger)TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")//定义name/group
.withSchedule(
CronScheduleBuilder.cronSchedule("0 5 21 * * ? *")) //填写cron表达式
.build();
其实CronTrigger的核心,就是会写cron表达式。cron表达式是有7个子表达式组成的字符串,描述了时间表的详细信息。格式:[秒] [分] [小时] [日] [月] [周] [年],关于cron表达式的详细介绍,请参考这篇文章。