初识Quartz之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表达式。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你要将 Quartz 中的 Trigger 转换成 CronTrigger,可以按照以下步骤进行: 1. 首先,创建一个 CronScheduleBuilder 对象,它可以从 Trigger 中提取出任务的执行时间信息,并将其转换成 Cron 表达式。 2. 然后,使用 CronTriggerBuilder 创建一个 CronTrigger 对象,并设置 Cron 表达式、时区和可能需要的其它属性。 3. 最后,将 CronTrigger 对象绑定到你的 JobDetail 上,这样 Quartz 就可以根据 Cron 表达式来触发你的定时任务了。 下面是一个示例代码,演示了如何将 SimpleTrigger 转换成 CronTrigger: ``` // 获取 SimpleTrigger 中的执行时间信息 SimpleTrigger simpleTrigger = (SimpleTrigger) trigger; long startTime = simpleTrigger.getStartTime().getTime(); long endTime = simpleTrigger.getEndTime() != null ? simpleTrigger.getEndTime().getTime() : 0; int repeatCount = simpleTrigger.getRepeatCount(); long repeatInterval = simpleTrigger.getRepeatInterval(); // 创建 CronScheduleBuilder 对象,将时间信息转换成 Cron 表达式 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(new CronExpression( String.format("0/%d * * ? * * *", TimeUnit.MILLISECONDS.toSeconds(repeatInterval)))); // 创建 CronTriggerBuilder 对象,并设置 Cron 表达式、时区和其它属性 CronTrigger cronTrigger = CronTriggerBuilder.newTrigger() .withIdentity(trigger.getKey().getName(), trigger.getKey().getGroup()) .withSchedule(cronScheduleBuilder.inTimeZone(TimeZone.getDefault())) .startAt(new Date(startTime)) .endAt(endTime > 0 ? new Date(endTime) : null) .withPriority(trigger.getPriority()) .build(); // 将 CronTrigger 对象绑定到 JobDetail 上 scheduler.rescheduleJob(trigger.getKey(), cronTrigger); ``` 以上代码中使用了一个固定的 Cron 表达式,它可以将 SimpleTrigger 的重复间隔时间转换成 Cron 表达式。实际使用时,你需要根据自己的业务需求来设置合适的 Cron 表达式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值