`
suichangkele
  • 浏览: 200036 次
  • 性别: 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();

 

分享到:
评论

相关推荐

    quartz-all-1.6.0.jar包定时任务jar

    Quartz的主要组件包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job是实际执行的任务,可以是任何实现了`org.quartz.Job`接口的类。Trigger定义了何时启动Job,它可以是简单的定时触发,也可以是复杂的...

    quartz和spring-quartz

    学习Quartz和Spring-Quartz,不仅需要理解它们的基本概念,还要掌握如何在实际项目中进行配置和使用。例如,创建一个定时任务,你需要定义Job类,配置Trigger,然后在Spring的配置文件中设置Scheduler。此外,熟悉...

    quartz-2.3.0-distribution.zip

    "quartz-2.3.0-distribution.zip"这个压缩包包含了Quartz库的2.3.0版本及相关资源,对于开发者来说是学习和使用Quartz的重要资料。 1. **Quartz的核心概念** - **Job**:Quartz中的工作单元,代表一个需要执行的...

    quartz-2.2.3-distribution.tar.gz

    Quartz是Java领域的一款强大的开源任务调度框架,用于在应用程序中安排和执行任务。这个"quartz-2.2.3-distribution.tar.gz"压缩包包含的是...通过学习和使用Quartz,你可以构建出更加智能和自动化的Java应用程序。

    quartz-2.2.2-distribution.rar

    综上所述,这个压缩包提供的 Quartz 2.2.2 版本和 Spring Boot 2.x 的集成示例,对于学习和使用 Quartz 进行任务调度具有很高的参考价值。无论是初学者还是经验丰富的开发者,都可以从中受益,快速掌握如何在 Spring...

    quartz-spring-demo

    1. **Quartz 简介**:Quartz 提供了一个完全线程化的模型来执行定时任务,支持复杂的调度策略,如按时间间隔执行、指定日期执行等。它还支持集群环境,确保任务的高可用性。 2. **Spring 集成 Quartz**:Spring ...

    quartz-2.1.6.zip

    quartz-examples-2.1.6.jar 提供了Quartz的示例代码,这些示例可以帮助开发者更好地理解和学习如何使用Quartz的各种特性,例如不同类型的触发器、调度策略和作业存储。 quartz-backward-compat-2.1.6.jar 包含了对...

    Quartz-JOB-Framework 中文版和QUartz开发指南 .zip

    学习Quartz,你需要掌握如何配置Scheduler,创建Job类和Trigger,以及如何使用JobDataMap传递数据。同时,了解CronTrigger和SimpleTrigger的用法,以及如何处理并发执行的策略,比如设置并发限制或者采用优先级调度...

    quartz-2.2.3-官方文档数据及PDM表结构.zip

    1. **作业(Jobs)与触发器(Triggers)**:Quartz的核心概念是作业和触发器。作业是需要执行的任务,而触发器则定义了任务何时执行。你可以创建自定义的Job类来实现特定任务,而Trigger则可以基于时间(如cron...

    springboot-quartz-simple-master.zip

    总之,"springboot-quartz-simple-master.zip" 提供了一个学习和实践Spring Boot与Quartz集成的起点。通过研究该项目,开发者可以了解到如何在Spring Boot应用中配置Quartz,编写定时任务,以及如何管理和调试这些...

    quartz-1.6.6 教程,代码

    1. **Quartz 概念** - **Job**:Job 是一个实现了 `org.quartz.Job` 接口的类,代表要执行的任务。 - **Trigger**:Trigger 定义了 Job 的执行时间,如简单触发器、cron 触发器等。 - **Scheduler**:Scheduler ...

    Quartz.net-定时任务 Demo

    Quartz.NET的核心概念包括Job(工作)、Trigger(触发器)和Scheduler(调度器)。Job是你要执行的实际任务,Trigger定义了何时启动Job,而Scheduler则负责管理和协调这些组件。 1. **Job**: Job是用户自定义的任务...

    quartz-2.4.0.zip

    1. **API文档**:Quartz提供了详尽的Javadoc,帮助开发者了解如何创建、配置和管理Job以及Trigger。 2. **源代码**:对于学习和调试非常有用,可以深入理解其内部机制。 3. **示例**:通常会有一系列的示例项目,...

    quartz-2.2 需要的jar以及src源代码

    1. **Quartz简介** - Quartz是一个轻量级的作业调度框架,完全用Java编写,可以嵌入到任何Java应用中。 - 它基于JDBC存储作业和触发器,支持集群和分布式环境。 2. **版本2.2.3** - Quartz 2.2.3是该框架的一个...

    quartz-2.1.7 官方jar包源码

    1. `org.quartz.core` 包:这是Quartz的核心模块,包含Scheduler、JobStore和ThreadPool的主要实现。SchedulerImpl是调度器的实现,它负责管理和调度Jobs。JobStore是用于存储Jobs和Triggers的地方,常见的实现有...

    quartz-1.8.6.tar

    同时,可以浏览源码和示例,学习如何在实际项目中有效利用Quartz实现任务自动化。 总的来说,Quartz是一个强大且灵活的Java任务调度库,适用于各种需要定时或触发式任务执行的应用场景。无论是在大型企业级系统还是...

    quartz-1.4.5以及源码

    1. **任务(Job)与触发器(Trigger)**:在Quartz中,任务是需要执行的工作单元,定义了具体的业务逻辑;触发器则决定任务何时启动。常见的触发器类型有简单触发器、cron触发器等,可以按照时间间隔或者自定义的...

    quartz-2.1.5.tar.gz

    1. **任务调度**:Quartz允许程序定义Job(任务)和Trigger(触发器),Job是实际要执行的工作,而Trigger则定义了Job何时被执行。你可以设置一次性任务或周期性的任务,例如每小时运行一次。 2. **灵活的调度策略*...

    quartzAPI-2.2.1参看文档

    1. **Quartz基本概念**: - **Job**:是执行的具体任务,可以理解为一个工作单元,包含具体要执行的业务逻辑。 - **Trigger**:触发器,定义了 Job 的执行时间,例如简单的定时器或根据特定日期或间隔触发。 - **...

    grails-quartz-0.4.1

    Grails Quartz插件的优势在于其高度的可配置性和灵活性,开发者可以轻松地定义复杂的调度策略,同时避免了与底层Quartz API的直接交互,降低了学习曲线。 总结,Grails Quartz 0.4.1插件为Grails开发者提供了一种...

Global site tag (gtag.js) - Google Analytics