之前已经介绍过Trigger组件,但主要是SimpleTrigger,而SimpleTrigger触发器功能相当于一个Timer的功能。而真正体现出Quartz优于Timer的一点就是CronTrigger的使用。CronTrigger是基于日历的作业调度器,而不像SimpleTrigger那样精确地指定时间间隔。这使得调度更加灵活。
1.Cron表达式
说起CronTrigger,其最重要的就是它的Cron表达式,CronTrigger通过传入Cron表达式命令,从而实现调度。首先Cron表达式的格式:[秒] [分] [时] [日] [月] [周] [年]。可以看出该表达式主要由七个子表达式组成,并且需要注意的是每两个子表达式之间用空格隔开。以下来说一下每个单位对应的范围:
秒:0-59 分:0-59 时:0-23 日:1-31 月:1-12 周:1-7(其中1表示周日,7表示周六) 年:1970-2099或者可以为空
以上七个子表达式除了年可以为空,其余都不可以为空。另外,在使用Cron表达式的时候,还可以使用相应的通配符,可以使表达式的使用更加灵活,以下是常见的通配符:
‘*’:表示所有值,适用于每个子表达式,用在日字段表示每天。
‘?’:表示不指定值,不关心该值。比如用在周字段,表示对周几并不关心。
‘-‘:表示区间,每个子表达式可以根据所在字段的取值范围,而确定合适的区间。
‘/’:用于递增触发,比如用在秒字段0/5即表示从0秒开始,每五秒触发一次。
‘,’:表示可以指定多个值,比如指定年字段2018,2019表示2018年和2019年。
‘L’:表示最后,比如用在日字段表示表示当月最后一天,用在周字段6L,表示最后一周周五。只适用于周字段和日字段。
‘W’:表示离指定日期最近的工作日,比如15W,假如15号是周六,则会在14号触发;如果15号是周日,则会在16号触发。需要注 意的是假如是1W,并且1号是周六,那么只能在3号触发;同理,假如某个月总共30天,并且30号是周日,那么30W只能在 28号触发。
‘#’:表示序号,用于周字段,表示每个月的第几个周几,比如6#3表示每个月的第三个周五。该符号只适用于周字段。
以下用几个例子说明:
0 0/10 14 * * ?:表示每天下午的2点到两点59分,整点开始,每十分钟触发一次。
0 15 10 ? 6#3:表示每个月的第三个周五早上十点十五分触发一次。
0 15 10 ? * 6L 2017-2018:表示2017年到2018年每个月最后一个周五早上十点十五分触发。
0/5 * 14,18 15W 6-10 ? 2018:表示2018年6到10月每个月离15号最近的工作日的14点到14点59分59秒以及18点到18点59分59秒,整点开始,每5秒钟触发一次。
2.CronTrigger使用示例
首先如果使用CronTrigger,需要类型强制转换,同时在withSchedule方法中需要调用的是CronScheduleBuilder的cronSchedule(CronExpression cronExpression)方法。该方法传入的就是上文讲述的Cron表达式。以下是完整的代码。首先是Job实现类的代码:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
public class MyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
//打印当前的执行时间,格式为yyyy-MM-dd HH:mm:ss
// 编写具体的业务逻辑。
Date date=new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//规范格式
System.out.println("当前时间为:"+sf.format(date));
System.out.println("Hello World!");
}
}
接着是Scheduler类:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class MyCronTrigger {
public static void main(String[] args) throws SchedulerException
{
Date date=new Date();
SimpleDateFormat sfd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//规范格式
System.out.println("当前时间为:"+sfd.format(date));
//创建一个JobDetail实例,将该实例与MyJob Class绑定。
JobDetail jobDetail=JobBuilder.newJob(MyJob.class).withIdentity("myJob", "group1").build();
//创建一个Trigger实例,定义该Job立即执行,并且每隔两秒钟重复一次,
//Date endDate=new Date();
//endDate.setTime(date.getTime()+15000);
CronTrigger trigger=(CronTrigger)TriggerBuilder
.newTrigger()
.withIdentity("myTrigger","group1")
.startAt(date)
.withSchedule(CronScheduleBuilder
.cronSchedule("0/5 * 14,18 * * * *"))
.build();
//2017年内每天10点15分出发一次:0 15 10 * * * 2017
//每天的14点整至14点59分55秒以及18点整至18点59分55秒,每5秒钟触发一次。0/5 * 14,18 * * * *;
SchedulerFactory sf=new StdSchedulerFactory();
Scheduler scheduler=sf.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
其实仔细观察,使用CronTrigger与SimpleTrigger的工作原理并无不同,都是通过Scheduler对象的scheduleJob()方法将Job实现类对象与Trigger对象绑定在一起的。只不过是在调度设置方式上不同,而CronTrigger更具有灵活性。比如以上示例表示每天的14点整至14点59分55秒以及18点整至18点59分55秒,每5秒钟触发执行一次Job。
总的来说,SimpleTrigger与CronTrigger都可以实现调度属性的设置,而CronTrigger更具有灵活性,如果要用好CronTrigger,则需要学好编写Cron表达式。
今天的文章初识Quartz之CronTrigger分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/32737.html