首页 > 程序开发 > 软件开发 > 其他 >

初识Quartz之CronTrigger

2018-04-11

初识Quartz之CronTrigger。之前已经介绍过Trigger组件,但主要是SimpleTrigger,而SimpleTrigger触发器功能相当于一个Timer的功能。而真正体现出Quartz优于Timer的一点就是CronTrigger的使用。

之前已经介绍过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表达式。

相关文章
最新文章
热点推荐