1、介绍
今天开始学习 JobStore,别的先不说,也不用翻译软件来翻译,直接从字面意思看来理解一下。我第一眼的感受就是 job 是任务的意思,Store 是商店的意思,连起来就是能够存储 Job 的商店,或者说专门用来存储 Job 的容器。废话少说,开始咱们今天的学习吧。
2、详述 JobStore
JobStore 负责跟踪您为调度程序提供的全部“工做数据”:任务,触发器,日历等。为 Quartz 调度程序实例选择适当的IJobStore实现是一个重要的步骤。 幸运的是,一旦你理解了它们之间的差别,选择应该是一个很是简单的选择。 在向 SchedulerFactory 提供的用于生成调度器实例的属性文件(或对象)中声明调度器应该使用哪一个 JobStore(及其配置设置)。
切勿在代码中直接使用 JobStore 实例。 出于某种缘由,许多人试图这样作。 JobStore 用于Quartz自己的幕后使用。 您必须告诉 Quartz(经过配置)使用哪一个 JobStore,可是您应该只使用代码中的Scheduler接口。
一、RAMJobStore
RAMJobStore是使用最简单的JobStore,它也是性能最高的(就CPU时间而言)。 RAMJobStore 以见名知意的方式命名:它将全部数据保存在RAM内存中。 这就是它闪电般快速的缘由,也是配置如此简单的缘由。 缺点是,当您的应用程序结束(或崩溃)时,全部调度信息都将丢失 - 这意味着 RAMJobStore 没法遵照做业和触发器上的“非易失性”设置。 对于某些应用程序,这是能够接受的 - 甚至是指望的行为,但对于其余应用程序,这多是灾难性的。
配置Quartz以使用RAMJobStore
html
quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz
要使用 RAMJobStore(假设您正在使用StdSchedulerFactory),您不须要作任何特殊的事情。 Quartz.NET的默认配置使用 RAMJobStore 做为任务存储实现。
二、ADO.NET Job Store (AdoJobStore)
AdoJobStore 这个名字取的也很恰如其分 - 它经过ADO.NET将全部数据保存在数据库中。 所以,配置比RAMJobStore要复杂一些,并且速度也不快。 可是,性能这方面的缺点并非很是的糟糕,特别是若是您使用主键上的索引构建数据库表。
要使用AdoJobStore,首先必须为Quartz.NET建立一组数据库表以供使用。 您能够在 Quartz.NET 发行版的“database / dbtables”目录中找到建立表的SQL脚本。 若是您尚未适用于本身的数据库类型的脚本,能够查看其中现有的脚本,而后根据我的的需求对其进行相应的修改。 须要注意的一点是,在这些脚本中,全部表都之前缀“QRTZ_”开头,例如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”。 实际上,这个前缀你能够作任何的修改和定义,只要你通知 AdoJobStore 前缀是什么(在你的Quartz.NET属性中)。 对于在同一数据库内为多个调度程序实例建立多组表,使用不一样的前缀可能颇有用。
目前,做为做业存储(Job Store)的内部实现的惟一选择就是 JobStoreTX,它本身建立事务。 这与Quartz的Java版本不一样,后者还能够选择使用J2EE容器 JobStoreCMT 管理事务的 。
最后一个难题是设置一个数据源,AdoJobStore能够从中得到与数据库的链接。 数据源在Quartz.NET属性中定义。 数据源信息包含链接字符串和ADO.NET委托信息。
配置Quartz以使用JobStoreTxsql
quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz
接下来,您须要为 JobStore 选择要使用的 IDriverDelegate 实现。 DriverDelegate 是负责执行针对特定数据库可能须要的任何ADO.NET工做。 StdAdoDelegate是一个使用“vanilla”ADO.NET代码(和SQL语句)来完成其工做的委托。 若是没有专门为您的数据库建立的另外一个委托,请尝试使用此委托 - 特殊委托一般具备更好的性能或变通方法来解决数据库特定问题。 其余委托能够在“Quartz.Impl.AdoJobStore”命名空间中找到,也能够在其子命名空间中找到。
注意:若是您正在使用默认的StdAdoDelegate,则Quartz.NET会发出警告,由于当您有不少触发器要从中选择时,它的性能会不好。特定的委托具备特殊的SQL语句来限制结果集长度(SQLServerDelegate使用TOP n、PostgreSQLDelegateLIMITN、OracleDelegate ROWCOUNT()<=n等)。
选择委托以后,将其类名设置为 AdoJobStore 要使用的委托。
配置AdoJobStore以使用DriverDelegate数据库
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz
接下来,您须要通知JobStore您正在使用的表前缀(如上所述)。安全
quartz.jobStore.tablePrefix = QRTZ_
最后,您须要设置JobStore应该使用哪一个数据源。 还必须在Quartz属性中定义指定的数据源。 在这种状况下,咱们指定Quartz应该使用数据源名称“myDS”(在配置属性中的其余位置定义)。
使用要使用的数据源的名称配置AdoJobStoreide
quartz.jobStore.dataSource = myDS
配置的最后一件事是设置数据源链接字符串信息和数据库提供程序。 链接字符串是标准的ADO.NET链接,它是针对特定于驱动程序的。 数据库提供程序是数据库驱动程序的抽象,用于在数据库驱动程序和Quartz之间建立松耦合。
设置数据源的链接字符串和数据库提供程序性能
quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
quartz.dataSource.myDS.provider = MySql
目前支持如下数据库提供程序:
SqlServer - SQL Server driver for .NET Framework 2.0
OracleODP - Oracle’s Oracle Driver
OracleODPManaged - Oracle’s managed driver for Oracle 11
MySql - MySQL Connector/.NET
SQLite - SQLite ADO.NET Provider
SQLite-Microsoft - Microsoft SQLite ADO.NET Provider
Firebird - Firebird ADO.NET Provider
Npgsql - PostgreSQL Npgsql
若是有最新的驱动程序是可用的,您应该使用最新版本的驱动程序,只需建立一个程序集绑定重定向便可。
若是您的调度程序很是繁忙(即几乎老是执行与线程池大小相同的做业数,那么您应该将数据源中的链接数设置为大约线程池的大小+ 1。 这一般在ADO.NET链接字符串中配置 - 有关详细信息,请参阅驱动程序实现。
“quartz.jobStore.useProperties”配置参数能够设置为“true”(默认为false),以指示 AdoJobStore 全部的值在 JobDataMaps 里面都是以字符串类型存储,所以能够存储为 名称 - 值 对,而不是以序列化的形式存储更复杂的对象在 BLOB 列中。 从长远来看,这样更安全,由于您能够避免将非字符串(non-String)的类型反序列化为BLOB复杂类型时出现的类的版本问题。
配置 AdoJobStore 以将字符串用做 JobDataMap 值(推荐)
学习
quartz.jobStore.useProperties = true
3、总结
好了,今天就写到这里了。你们感受应该很轻松,内容很少。仍是老规矩,我把英文原文地址发出来,英文好的能够直接看英文,理解的会更好。地址以下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html
不忘初心,继续努力。spa