18.5.25,狂撸quartz29次

Enterprise   企业事业单位archive 存档/档案Reference 引用/参考Grab 抓住

Tie it to绑住schedule时刻表,进度表; 清单排定,安排 Merged混合 persist坚持/固执

Misfire 不发火/不启动 modified改良的改进的修正的

whether or not to update existing triggers that referenced the already existing calendar so that they are 'correct' based on the new trigger

是否更新引用现有日历的现有触发器,使其基于新触发器“正确”

should be applied to 应该适用于 18. 5.22日

1. 创建作业,创建和设置触发器,用调度器调度作业和触发器,启动调度器。

start()方法启动调度器:从调度器工厂类取得一个调度器的实例。

2. Quartz框架有一个插件,这个插件负责读取xml配置文件。

3. 有状态和无状态作业

Job运行信息保存在jobDataMap实例中。

无状态和有状态关键在于有状态job在执行时只有一个实例。

有状态job实现org.quartz.StatefulJob接口。

4. Quartz的监听器和插件:监听是我创建的java类,当事件发生时,会回调事 件。

5. Quartz简单使用:

Job接口里有execute方法。如果需要在上一个job完成之后,根据其结果进

行下一个job的执行,需要使用有状态接口:实现statefulljob

Trigger抽象类,调度器scheduler在机会成熟时调用此类,再有此类调用job Trigger分为两类:SimpleTriggerCronTrigger(复杂)。

JobDetailQuartz在每次执行Job时,都重新创建一个Job实例,所以它不 直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过 newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实 现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail 承担了这一角色。

JobDatamap:用于描述一个作业的参数,

JobListenernTriggerListener接口:用于监听触发器状态和作业扫行状态, 在特定状态执行相应操作。

6. quzrtz依赖一些第三方的库(以jar包的形式),这些库位于quartz安装包的 lib目录下。要使用quartz的所有功能,必须将所有的第三方jar包都放到 classpath下。如果你开发的是一个独立的quartz应用,建议将所有的jar 都放到classpath下;如果是在应用服务器环境下使用quartz,其中有些包 可能已经存在于classpath中了,因此你需要自己选择。

7. 我们将使用Quartz使用quartz.properties的配置文件。

它的配置有如下特点:

直接使用:

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

new一个stdSchedulerFactory再获得scheduler效果一样,它底层就是 先 new一个再获得该实例。

Schedulerstart()shutdown()方法,在关闭方法之前,scheduler不会终止。

8. 对于job类:

Job类必须有默认的无参构造方法,当然不覆盖的话类本身就是无参的构造方法。

Jobscope必须是Public类型的,因为quartz根据反射机制实例化类,如果不是public的,无法对其暴露。

Job类不能是内部类,原因同上,所以最好单独建类

9. Quartz的核心api

JobJobDetailTriggerTriggerBuilderJobBuilderScheduler

对于scheduler的生命周期:startshutdown之间。

只有在start之后才会触发Trigger.

10. 对于TriggerBuilderwithSchedule(scheduleBuilder )

SchedulerBuilder接口的各种实现类,可以定义不同类型的调度计划

11. 当job的一个trigger 被触发后,execute()方法会被scheduler的一个线程调 用,JobExecutionContext对象中包含着以下信息:执行Jobscheduler 引用,trigger的引用,JobDetail对象引用。

12. JobDetail对像是将Job加入Scheduler时自己手写创建的,它绑定了Job,它 包含了job的各种属性,以及存储job状态信息的JobDataMap

13. 同一个job有多个Trigger

14. KeyJobTrigger注册到Scheduler时,可以为他们设置Keyname group组成。可以进行分组然后基于分组操作

15. Scheduler在执行jobexecute()方法前会通过反射实例化该job,使用完毕 后,该job实例会被丢弃由垃圾回收。所以:

1.该job必须有一个无参的构造函数(反射)

2.该job不应该定义有状态的数据属性(这些属性的值不会保留)

16. JobDataMapjob实例执行的时候,可以使用其中的数据;它是java map 接口的实现。job加入到scheduler之前,在构建JobDetail时,可以将数据放入JobDataMap

存:

JobDetail jd = JobBuilder.newJob(HelloJob.class).usingJobData("1", "我让").build();

取:

JobKey key = arg0.getJobDetail().getKey();

String string = arg0.getJobDetail().getJobDataMap().getString("1");

17. Quartz也存在自动注入的功能,当从JobExecutionContext取出 JobDataMap中存着的数据时,可以省略这一步:在job建成员变量,提供 getset方法,在创建job时会自动注入参数,类型和名子要和放入时一致。18. JobFactory 反射:

当一个Trigger被触发时,与之关联的JobDetail会被加载,他所关联的Job 类通过Scheduler上的JobFactory进行初始化,默认的Factory会执行 newInstance()方法(反射),然后尝试调用JobDataMap中的keysetter 方法。

19. 保存后的JobDetail成为job的定义,正在执行的job称为job实例。

20. 异常JobExecutionExecption

Execute方法中只允许抛出一种类型的异常:JobExecutionExecption,须将所 有代码放到一个try{}catch{}里面。

21. Trigger的公共属性:

startTime属性:设置Trigger第一次触发的时间。

endTime属性:表示trigger失效的时间点。

22. Priority

Trigger有默认优先级:5

多个Trigger同是触发,但是可用线程数太少,就会比较优先级。

23. 不同的Trigger有不同的misfire机制。

24. Calendar

QuartzCalendar对象可以在定义和存储trigger的时候与trigger进行关联。

用于从trigger的调度计划中排除时间段。

任何实现了Calendar接口的可序列化对象都可以作为Calendar对象

org.quartz.impl.HolidayCalendar类quartz提供的Calender实现类,可以 排除整天。

Calender必须实例化,可以通过addCalendar()注册到scheduler

使用HolidayCalendar,实例化后,需要调用addExcludedDate(Date date)方法从调度计划中排除时间段

scheduler中注册了该排除计划,一定在初始化Trigger时关联上这个 Calendar,例子:

public class quartz {

public static void main(String[] args) throws SchedulerException {

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// calendar

HolidayCalendar holidayCalendar = new HolidayCalendar();

holidayCalendar.addExcludedDate(new Date());

scheduler.addCalendar("11", holidayCalendar, false, true);

// jobDetail

JobDetail jd = JobBuilder.newJob(HelloJob.class).usingJobData("1", "我让").build();

// Trigger

Trigger build = TriggerBuilder.newTrigger().startNow()

.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInDays(4))

.modifiedByCalendar("11").build();

 
scheduler.scheduleJob(jd, build);

scheduler.start();

 
}

}

25. SimpleTrigger:可以指定在具体的时间执行并可以指定间隔时间。如果重复 的间隔是0,那么Trigger将并发执行。

26. 生成SimpleTrigger各个方法详解:

SimpleTrigger实例通过TriggerBuilder设置主要的属性。通过

SimpleScheduleBuilder设置与SimpleTrigger相关的属性。

以下方法:

 withIdentity(String name)标识Trigger名称,如果没有那么就随机产生一。

 startAtDate triggerStartTime):Trigger的生效时间,默认立即生效

 forJob(..):这是为了标识将要被触发的Job,有多个重载,当Trigger和 job同是注册到Scheduler时可以不写。

withSchedule(ScheduleBuilder  schedBuilder):使用的特定SchedulerBuilder将指定TriggerBuilder 生成的具体触发器类型。

SimpleTrigger MisFire的策略

策略以常量的形式在SimpleTrigger中定义

默认策略是:

Trigger.MISFIRE_INSTRUCTION_SMART_POLICY

在构建Trigger时由schedulerBuilder的不同实现调用。

27. CronTrigger基于日历表示法的调度

    它也有startTime()endTime()方法可选。

    Cron表达式由7个字段组成,字段之间由空格分开。

    顺序:秒 分 时 日 月 周 (年)

    ?用在日和周字段,表示无具体的值。

    3,5 表示第3分钟和第5分钟,也可用于其它时刻如时。

    3/5可表示小时内,从第3分钟每隔5分钟干啥。可用于其它时间如分钟, 这与3,5啥的表示的时刻可能会相同。

    /5==0/5

    L用于日字段,表示最后一天。单独使用在周字段,表示该周最后一天(星 期六)。如果写着例如5L,那么他就是该周的星期四。

字符’W’表示离某一天最近的工作日 :12W

可以写多个CronTrigger来满足复杂的调度,注册到job即可。

CronTrigger实例由TriggerBuilderCronScheduleBuilder实现

.....withScheduleCronScheduleBuilder.cronSchedule(“0 42 10 * * ?”).build();

   此时会发现DateBuilder在相对简单的cron很好用

CronTrigger错过触发的策略,他的默认策略和simpletrigger一样,配置的话  也是在构建时配置。

28. TriggerListener(接口)和JobListener

    TriggerListenertrigger的触发,job的完成(触发后执行完毕),Trigger错 过触发。

    JobListenerjob即将执行的通知以及job执行完毕的通知

    SchedulerListenerjob/trigger的增加、job/trigger的删除、scheduler内部 发生的严重错误以及scheduler关闭的消息 等。

    监听不经常使用。

29. QuartzSpring结合

    需要急为重要的包:spring-context-support.jar

    包含支持缓存Cacheehcache)、JCAJMX、 邮件服务(Java MailCOS Mail)、 任务计划SchedulingTimerQuartz)方面的类。

例子(spring4.2版本,quartz2.2.3版本,maven构建):

applicationContext.xml







run















Job:
public class Job {
private void run() {
System.out.println("开始任务");
}
}
测试:
public class ceshi {
public static void main(String[] args) {
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
}
}

你可能感兴趣的:(狂撸quartz29次)