Quartz.NET-课程9:JobStores

JobStore’s负责跟踪您给调度程序的所有“工作数据”:作业,触发器,日历等。为Quartz调度程序实例选择合适的IJobStore实施是非常重要的步骤。幸运的是,一旦你了解它们之间的差异,这是一个非常简单的选择。您可以在您提供给SchedulerFactory的属性文件(或对象)中声明您的调度程序应使用哪个JobStore(以及它的配置设置),以便用于生成调度程序实例。

切勿在代码中直接使用JobStore实例。出于某种原因,许多人试图做到这一点。JobStore用于Quartz本身的幕后使用。你必须告诉Quartz(通过配置)使用哪个JobStore,但是你应该只使用代码中的Scheduler接口。

RAMJobStore

RAMJobStore是最简单的JobStore,它也是性能最高的(就CPU时间而言)。RAMJobStore以显而易见的方式获得其名称:它将所有数据保存在RAM中。这就是为什么它闪电般快速,以及配置如此简单的原因。缺点是当您的应用程序结束(或崩溃)时,所有的调度信息都会丢失 - 这意味着RAMJobStore无法遵守作业和触发器上的“非易失性”设置。对于某些应用程序而言,这是可以接受的 - 甚至是所需的行为,但对于其他应用程序而言,这可能是灾难性的

配置Quartz以使用RAMJobStore

quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz

要使用RAMJobStore(并假设你使用的是StdSchedulerFactory),你不需要做任何特别的事情。Quartz.NET的默认配置使用RAMJobStore作为作业存储实现。

ADO.NET作业存储(AdoJobStore)

AdoJobStore也被巧妙地命名 - 它通过ADO.NET将其所有数据保存在数据库中。因此,配置比RAMJobStore稍微复杂一些,而且速度也不尽如人意。但是,性能退化不是非常糟糕,特别是如果使用主键上的索引构建数据库表时。

要使用AdoJobStore,您必须首先为Quartz.NET创建一组数据库表以供使用。您可以在Quartz.NET发行版的“database / dbtables”目录中找到创建表的SQL脚本。如果您的数据库类型没有脚本,只需查看其中一个现有脚本,然后以任何必要的方式修改您的数据库。需要注意的一点是,在这些脚本中,所有表都以前缀“QRTZ_”开头,例如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。这个前缀实际上可以是任何你想要的,只要你告诉AdoJobStore前缀是什么(在你的Quartz.NET属性中)。使用不同的前缀对于在同一数据库中为多个调度程序实例创建多组表,可能很有用。

目前内部实现作业存储的唯一选择是JobStoreTX,它自己创建事务。这与Quartz的Java版本不同,在Quartz中也可以选择使用J2EE容器管理事务的JobStoreCMT。

最后一块难题是设置一个数据源,AdoJobStore可以通过该数据源连接到数据库。数据源是在Quartz.NET属性中定义的。数据源信息包含连接字符串和ADO.NET委托信息。

配置Quartz使用JobStoreTx

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,PostgreSQLDelegate LIMIT n,OracleDelegate ROWCOUNT()<= n等)。

选择代理后,将其类名设置为AdoJobStore使用的代理。

配置AdoJobStore以使用DriverDelegate

tz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz

接下来,通知JobStore表前缀是什么(正如上面讨论的)。

使用表前缀配置AdoJobStore

quartz.jobStore.tablePrefix = QRTZ_

最后,您需要设置JobStore应该使用哪个数据源。指定的数据源也必须在您的Quartz属性中定义。在这种情况下,我们指定Quartz应该使用数据源名称“myDS”(在配置属性中的其他位置定义)。

使用要使用的数据源的名称配置AdoJobStore

quartz.jobStore.dataSource = myDS

配置所需的最后一件事是设置数据源连接字符串信息和数据库提供程序。连接字符串是驱动程序特定的标准ADO.NET连接。数据库提供程序是数据库驱动程序的抽象,用于在数据库驱动程序和Quartz之间创建松耦合。

设置数据源的连接字符串和数据库提供程序(Setting Data Source’s Connection String And Database Provider)

 quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
 quartz.dataSource.myDS.provider = MySql

目前支持以下数据库提供者:

  • SqlServer - 用于.NET Framework 2.0的SQL Server驱动程序
  • OracleODP - Oracle的Oracle驱动程序
  • OracleODPManaged - Oracle的Oracle 11管理驱动程序
  • MySql - MySQL Connector / .NET
  • SQLite - SQLite ADO.NET提供程序
  • SQLite-Microsoft - Microsoft SQLite ADO.NET提供程序
  • Firebird - Firebird ADO.NET Provider
  • Npgsql - PostgreSQL Npgsql

如果更新可用,您可以并应该使用最新版本的驱动程序,只需创建程序集绑定重定向即可。

如果您的调度程序非常忙碌(即,几乎总是按线程池的大小执行相同数量的作业,那么您应该将数据源中的连接数设置为线程池的大小+ 1。这通常在ADO.NET连接字符串中进行配置 - 请参阅您的驱动程序实现以了解详细信息。

可以将“quartz.jobStore.useProperties”配置参数设置为“true”(默认为false),以便指示AdoJobStore JobDataMaps中的所有值都是字符串,因此可以存储为name-value,而不是存储在BLOB列中以序列化形式存在更复杂的对象。从长远来看,这更安全,因为您可以避免将非String类序列化为BLOB时出现的类版本问题。

配置AdoJobStore以使用字符串作为JobDataMap值(推荐)

quartz.jobStore.useProperties = true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值