参考链接:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-09.html
任务持久化参考:
http://blog.csdn.net/evankaka/article/details/45540885
http://blog.csdn.net/Uhzgnaw/article/details/46358333
scheduler里的jobs、triggers、calendars,可以使用JobStore
去跟踪其中对应的”work data”。为你的quartz scheduler instance选择合适的JobStore是一步很重要的步骤。在properties文件里定义你的scheduler应该使用哪个JobStore
, SchedulerFactory使用这个配置文件生成scheduler instance。
不要在代码里直接使用JobStore instance, 很多人都倾向于这样做。JobStore都是在幕后运行的,应该在配置文件里指定应该使用哪个JobStore,然后通过scheduler interface去做一些工作。
RAMJobStore
RAMJobStore是最简单的JobStore, 取决于CPU的性能。RAMJobStore将数据保存在内存,这也是它比较快且易于配置。缺点就是,你部署定时任务的应用停止运行后,所有的调度数据都会消失。
假定使用StdSchedulerFactory
, 在配置文件里指定org.quartz.simpl.RAMJobStore
:
Configuring Quartz to use RAMJobStore
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
这样基本没有其它的配置了。
JDBCJobStore
JDBCJobStore正如其名称一样,通过JDBC将数据保存在数据库里。这个配置起来比RAMJobStore复杂,所以也不是那么快了。然而,性能也不是想象的那么慢,当为数据库表的主键建了索引以后,检索和更新一个firing trigger不足10秒钟。
JDBCJobStore可以使用很多数据库,不如Oracle、PostgreSQL、MySQL、MSSQLServer, HSQLDB和DB2。在使用JDBCJobStore之前,需要建立quartz使用的数据表,创建数据库的脚本在”docs/dbTables”目录下。这些建立的数据表都是以”QRTZ_”作为前缀,比如”QRTZ_TRIGGERS”、”QRTZ_JOB_DETAIL”。这个前缀可以在properties配置文件里指定。使用不同的前缀可以创建不同集合的数据库,在同一个数据库里对应多个scheduler instances。
在数据表建好以后,在配置和触发JDBCJobStore之前,你得考虑你的应用要使用哪种事务,如果没有需求将scheduling commands(比如添加和删除triggers)和事务绑定,可以使用JobStoreTx
作为你的JobStore,让它为你管理事务,这也是比较通常的做法。
如果需要quartz工作在J2EE的应用服务器中,可以使用JobStoreCMT
, quartz会让app server container去管理事务。
怎样配置DataSource让JDBCJobStore从数据库获取connections。一种方式是在配置文件指定完整的数据库信息,让quartz自己创建和管理DataSource本身。另一种方式是quartz使用一个被应用服务器所管理的DataSource(quartz运行于应用服务器中),给JDBCStore指定DataSource的JNDI name 即可。更多细节,可以查看官网给examples。
假定使用StdSchedulerFactory
, 在使用JDBCJobStore, 需要为org.quartz.jobStore.class
属性指定org.quartz.impl.jdbcjobstore.JobStoreTX
或org.quartz.impl.jdbcjobstore.JobStoreCMT
。
Configuring Quartz to use JobStoreTx
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
下面需要指定JobStore使用的DriverDelegate
, JDBC的活都交给DriverDelegate
类去做了。数据库不同,选择的DriverDelegate
也不同,使用mysql就是org.quartz.impl.jdbcjobstore.StdJDBCDelegate
。
Configuring JDBCJobStore to use a DriverDelegate
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
告诉JobStore你使用的前缀:
Configuring JDBCJobStore with the Table Prefix
org.quartz.jobStore.tablePrefix = QRTZ_
最后指定哪个DataSource会被JobStore使用到,被命名的DataSource也需要在你的quartz properties文件里指定。下面的例子中,指定使用的DataSource name是”myDS”(这在其他地方配置的属性)。
Configuring JDBCJobStore with the name of the DataSource to use
org.quartz.jobStore.dataSource = myDS
如果你的scheduler很忙,比如执行的Job和线程池里的 线程数目差不多,那么DataSource的连接数应该是线程池中 线程数 + 2。
org.quartz.jobStore.useProperties默认是false, 可以设置为true, 告知JDBCJobStore对应所有JobDataMaps中数据都将是Strings,存储的是 name-value 对。而不是在一个BLOB列存储复杂的序列化对象。