`
suichangkele
  • 浏览: 193088 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

quartz学习03-trigger(1)

阅读更多

Trigger(触发器)有多种,最常使用的就是SimpleTriggerhe CronTrigger,前者用于完成简单的触发,后者类似于linux中的crontab的使用。

trigger的共有的属性有:

   ·jobKey:用于获得要执行的jobDetail

   ·startTime:第一次触发的时间

   ·endTime:触发的最后时间,最后一次触发不能超过这个时间。

下面说一下比较不常见的属性:

1、priority(优先级)

当我们有多个trigger,并且其中有多个trigger的触发时间是一样的,至少是某一次触发的时间是一样的,如果可以执行的工作线程多于trigger的话好说,同时执行就好了,如果工作线程少于要执行的trigger呢,具体哪个trigger触发,就要涉及到priority了,优先级越高的越得到执行。

我测试了,但时结果并不像文档说的,我没有深究,因为这种情况发生的可能性不大,而且工作中也不关心优先级的问题。

 

2、MisFire Instructions

  当某个调度器由于某个原因没有得到执行而错过执行时间的情况改如何处理。这种情况在一下情况下会发生,比如:只有一个工作线程,而又有多个任务,且每个任务的时间很长而间隔很短,就会出现这种问题,我没有深入研究。在工作中没有遇到这样的问题。

 

3、Calendar

Calendar用于给某个Trigger排除某个时间的出发,我的测试代码如下:

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.impl.StdScheduler;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.HolidayCalendar;

import job.HelloJob;
public class CalendarDemo {
	public static void main(String[] args) throws SchedulerException{
		HolidayCalendar cal = new HolidayCalendar();
		cal.addExcludedDate(new Date());
		StdSchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
		StdScheduler sched = (StdScheduler) schedFact.getScheduler();
		sched.addCalendar("calendar", cal, true, true);//第一个true的意思是
		//开始调度器
		sched.start();
		//创建job任务
		JobDetail job = newJob(HelloJob.class).withIdentity("myJob1", Scheduler.DEFAULT_GROUP).storeDurably(true).build();
 		SimpleScheduleBuilder.simpleSchedule();
		Trigger trigger = newTrigger().withIdentity("myTrigger1",Scheduler.DEFAULT_GROUP).startNow().withPriority(10)
			.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever())
			.modifiedByCalendar("calendar").build();//添加calendar
		sched.scheduleJob(job, trigger);
	}
}

 其中Scheduler.addCalendar的参数:第一个表示加入的Calendar的名字,第三个boolean,表示是否覆盖已经存在的同名的calendar,如果是false,当添加同名的calendar时报异常。最后一个参数是是否更新已经添加这个名字的calendar的Trigger,即如果已经有个trigger通过调用modifiedByCalendar("calendar")添加了这个calendar,现在又添加一个叫做”calendar“的Calendar,是不是更新原先的Trigger的Calendar。

HelloJob类中的execute方法中只有一个行打印。运行上面的代码,不会有任何的输出,因为排除掉了今天,原因:Calendar只会采用他的年月日,其他的时间将不被考虑,也就是如果排除的话至少是排除一天的时间,所以上面的代码执行不会有任何输出。

HolidayCalendar中源码如下:

 /**
  * <p>
  * Add the given Date to the list of excluded days. Only the month, day and
  * year of the returned dates are significant.   翻译:仅仅年月日是有意义的。
  * </p>
  */
public void addExcludedDate(Date excludedDate) {
    Date date = getStartOfDayJavaCalendar(excludedDate.getTime()).getTime();
    /*
     * System.err.println( "HolidayCalendar.add(): date=" +
     * excludedDate.toLocaleString());
     */
    this.dates.add(date);
}
protected java.util.Calendar getStartOfDayJavaCalendar(long timeInMillis) {
     java.util.Calendar startOfDay = createJavaCalendar(timeInMillis);
     startOfDay.set(java.util.Calendar.HOUR_OF_DAY, 0);
     startOfDay.set(java.util.Calendar.MINUTE, 0);
     startOfDay.set(java.util.Calendar.SECOND, 0);
     startOfDay.set(java.util.Calendar.MILLISECOND, 0);
     return startOfDay;
} 

可以发现,所有的时间除了年月日都被设置为了0。

 

SimpleTrigger:

这个适用于处理一些在指定开始,每隔多少时间执行一次,一共执行多少次的调度,涉及到的属性有:start-time,end-time,repeat count,repeat interval。

其中end time 将覆盖repeat count,即如果在指定的结束时间仍然没有执行完,将不再执行。

SimpleTrigger中有多中类型的调度机制,具体的方法都在TriggerBuilder和SimpleSchedulerBuilder中。

注意:如果我们在创建trigger时不指定具体的值,TriggerBuilder将会选择一些适当的值。比如我们不设置withIdentity,将会随机产生一个name,如果不设置startAt将会以当前的时间作为开始时间。

misfire-instruction:关于过期但是没有执行的操作,可以通过创建Trigger时的ScheudlerBuilder的.withMisFireHandlingInstruction...设置,调用的配置都在SimpleTrigger中,这个类中的常亮,以MISFIRE_INSTRUCTION_RESCHEDULE开头的常量都是对于这个的描述,我没有仔细看,因为在工作中没有使用SimpleTrigger,都是使用的CronTrigger。

官网的关于配置misfire_instruction的实例代码如下:

trigger = newTrigger()
    .withIdentity("trigger7", "group1")
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(5)
        .repeatForever()
        .withMisfireHandlingInstructionNextWithExistingCount())
    .build();

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics