Quartz 学习指南

1.任务在给定的触发器(Trigger)触发时执行。

 

2.任务由创建者给定名字,并且可以加入到给定名称的任务组中。为了简化触发器在日程中的管理,触发器也可以被给定名字和分组。任务只能加入到日程中一次,但是可以为其注册多个触发器。

Jobs 和 Triggers 也可以被放入“组”中。“组”对于后续维护过程中,分类管理Jobs和 Triggers 非常有用。

 

3.任务是任何实现简单Job接口的Java类,这样开发者能够执行任何完成他们工作的任务。

 

4.实现JobStore接口的Job类可以以多种机制实现Job的存储,通过使用JDBCJobStore,所有的Jobs和Tirggers被配置为“non-volatile”不轻快的方式,即通过JDBC存储在关系数据库中。

 

5.通过使用RAMJobStore,所有的Jobs和Tirggers被存储在RAM,这种方式的优点是不需要外部数据库。

 

6.Quartz是一个任务日程管理系统,在预定确定的时间到达时,负责执行其他软件组件的系统。

 

7.如果你希望在日程安排的时间到达时通知组件,那么这些组件应实现TriggerListener或者JobListener接口

 

8.能够使Quartz运行变慢的原因就是使用大量的监听器,能同时执行多少个任务受限于线程池的大小,

因为JVM,操作系统和CPU处理大量线程时很耗时,线程管理也会导致性能下降。

 

9.设置属性JobDetail.setDurability(true),这将指示Quartz在任务变为“孤儿”(当任务不在被任何触发器所引用时)时不要删除任务。

 

10.如何避免一个Job被并发激活? 使Job类实现StatefulJob接口,而不是Job接口

 

11.SimpleTrigger 总是每隔若干秒触发,而同夏令时(时差)没有关系。
• CronTrigger 总是在给定的时间出发然后计算它下次触发的时间。如果在给定的日期内没有该时间,则触发器将会被忽略,如果在给定的日期内该时间发生了两次,它只触发一次。因为是在第一次触发发生后计算当天下次触发的时间。

 

12.

Trigger trigger = TriggerUtils.makeHourlyTrigger(); //每个小时激活一次

trigger.setStartTime(TriggerUtils.getEvenHourDate(new Date()));//在下一个小时启动。

 

13.Quartz源码  Job接口

package org.quartz;

        public interface Job {

                 public void execute(JobExecutionContext context)throws JobExecutionException;

       }

 

当Job触发器触发时(在某个时刻),execute(..)就被scheduler所调用。JobExecutionContext对象被传递给这个方法,它为Job实例提供了它的“运行时”环境-一个指向执行这个Job实例的Scheduler句柄,一个指向触发该次执行的触发器的句柄,Job的JobDetail对象以及一些其他的条目。

 

14.JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象(就是Job的属性,字段),这个对象被用来存储给定 Job 类实例的
状态信息。

Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job 传递参数。

 

15.JobDetail jobDetail = new JobDetail("myJob",               // job 名
                                      sched.DEFAULT_GROUP,              // job 组(你可以指定为'null'以使用缺省的组)
                                      DumbJob.class);                          // 要被执行的Java类。

 

16.从 Job 执行时的JobExecutionContext中取得 JobDataMap是惯用手段,它融合了从 JobDetail 和从 Trigger中获的 JobDataMap

 

17.“无状态的”任务只拥有它们被加入到scheduler时所存储的JobDataMap。这意味着,在执行任务过程中任何对Job Data Map所作的更改都将丢失而且任务下次执行时也无法看到。有状态的任务恰好相反,它在任务的每次执行之后重新存储JobDataMap。有状态任务的一个副作用就是它不能并发执行。换句话说,如果任务有状态,那么当触发器在这个任务已经在执行的时候试图触发它,这个触发器就会被阻塞(等待),直到前面的执行完成。

 


想使任务有状态,它就要实现StatefulJob接口而不是实现Job接口

 

18.可以创建一个单独的 Job 类,并且通过创建多个JobDetails实例来将它的多个实例存储在scheduler中,这样每个 JobDetails对象都有它自己的一套属性和 JobDataMap,而且将它们都加入到scheduler中。

当触发器被触发的时候,通过 Scheduler中配置的 JobFactory来实例化与之关联的Job 类。

 

19.不要在代码中直接使用JobStore实例,处于某些原因,很多人试图这么做。JobStore是由Quartz自身在幕后使用。你必须告诉(通过配置)Quartz使用哪个JobStore,而你只是在你的代码中使用Scheduler接口完成工作

 

20.对于一个数据库中使用多个scheduler实例,那么配置不同的前缀可以创建多套库表,十分有用

 

21.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值