JobStore负责保持对所有scheduler “工作数据”追踪,这些工作数据包括:job(任务),trigger(触发器),calendar(日历)等。为你的Quartz scheduler选择合适的JobStore是非常重要的一步,幸运的是,如果你理解了不同的JobStore之间的差别,那么选择就变得非常简单。在提供产生scheduler 实例的SchedulerFactory的属性文件中声明scheduler所使用的JobStore(以及它的配置)。 <?XML:NAMESPACE PREFIX = O />
注:不要在代码中直接使用JobStore实例,处于某些原因,很多人试图这么做。JobStore是由Quartz自身在幕后使用。你必须告诉(通过配置)Quartz使用哪个JobStore,而你只是在你的代码中使用Scheduler接口完成工作。
RAMJobStore
RAMJobStore是最简单的JobStore,也是性能最好的(根据CPU时间)。从名字就可以直观地看出,RAMJobStore将所有的数据都保存在RAM中。这就是为什么它闪电般的快速和如此容易地配置。缺点就是当应用结束时所有的日程信息都会丢失,这意味着RAMJobStore不能满足Jobs和Triggers的持久性(“non-volatility”)。对于有些应用来说,这是可以接受的,甚至是期望的行为。但是对于其他应用来说,这将是灾难。
为了使用RAMJobStore(假设你使用DirectSchedulerFactory),指使简单地将类名Quartz.Simpl.RAMJobStore作为你的quartz的配置值。
配置 Quartz 使用 RAMJobStore
<quartz>
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
</quartz>
这里没有其他需要的担心的配置。 Qiartz.net缺省使用的就是RAMJobStore.
ADO.NET Job Store (AdoJobStore)
基于ADO.NET的 job store 目前正在开发中,还存在很多的bug. 从0.6版本开始
AdoJobStore基本上可以用了.
AdoJobStore的命名也非常得体,它将所有的数据通过ADO.NET保存到数据库可中。它的配置要比RAMJobStore稍微复杂,同时速度也没有那么快。但是性能的缺陷不是非常差,尤其是如果你在数据库表的主键上建立索引。
AdoJobStore几乎可以在任何数据库上工作,它广泛地使用Oracle, MySQL, MS SQLServer2000, HSQLDB, PostreSQL 以及 DB2。要使用AdoJobStore,首先必须创建一套Quartz使用的数据库表,可以在Quartz 的database/tables找到创建库表的SQL脚本。如果没有找到你的数据库类型的脚本,那么找到一个已有的,修改成为你数据库所需要的。需要注意的一件事情就是所有Quartz库表名都以QRTZ_作为前缀(例如:表"QRTZ_TRIGGERS",及"QRTZ_JOB_DETAIL")。实际上,可以你可以将前缀设置为任何你想要的前缀,只要你告诉AdoJobStore那个前缀是什么即可(在你的Quartz属性文件中配置)。对于一个数据库中使用多个scheduler实例,那么配置不同的前缀可以创建多套库表,十分有用。
一旦数据库表已经创建,在配置和启动AdoJobStore之前,就需要作出一个更加重要的决策。你要决定在你的应用中需要什么类型的事务。如果不想将scheduling命令绑到其他的事务上,那么你可以通过对JobStore使用JobStoreTX来让Quartz帮你管理事务(这是最普遍的选择)。
最后的疑问就是如何建立获得数据库联接的数据源(DataSource)。Quartz属性中定义数据源是通过提供所有联接数据库的信息,让Quartz自己创建和管理数据源。
要使用AdoJobStore(假定使用StdSchedulerFactory),首先需要设置Quartz配置中的quartz.jobStore.type属性为Quartz.Impl.AdoJobStore.JobStoreTX, Quartz。
配置 Quartz使用 JobStoreTx
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
下一步,需要为JobStore 选择一个DriverDelegate , DriverDelegate负责做指定数据库的所有ADO.NET工作。StdADO.NETDelegate是一个使用vanilla" ADO.NET代码(以及SQL语句)来完成工作的代理。如果数据库没有其他指定的代理,那么就试用这个代理。只有当使用StdADO.NETDelegate发生问题时,我们才会使用数据库特定的代理(这看起来非常乐观。其他的代理可以在Quartz.Impl.AdoJobStor命名空间找到。)。其他的代理包括PostgreSQLDelegate ( 专为PostgreSQL 7.x)。
一旦选择好了代理,就将它的名字设置给AdoJobStore。
配置AdoJobStore 使用DriverDelegate
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
接下来,需要为JobStore指定所使用的数据库表前缀(前面讨论过)。
配置AdoJobStore的数据库表前缀
quartz.jobStore.tablePrefix = QRTZ
然后需要设置JobStore所使用的数据源。必须在Quartz属性中定义已命名的数据源,比如,我们指定Quartz使用名为"default"的数据源(在配置文件的其他地方定义)。
配置 AdoJobStore使用数据源源的名字
properties["quartz.jobStore.dataSource"] = "default"
最后,需要配置数据源的使用的Ado.net数据提供者和数据库连接串,数据库连接串是标准的Ado.net 数据库连接的连接串。数据库提供者是关系数据库同Quartz.net之间保持低耦合的数据库的连接提供者。
配置AdoJobStore使用数据源源的数据库连接串和数据库提供者
quartz.dataSource.default.connectionString = Server=(local);Database=quartz;Trusted_Connection=True;
quartz.dataSource.default.provider= SqlServer-11
目前Quartz.net支持的以下数据库的数据提供者:
-
SqlServer-11 - SQL Server driver for .NET Framework 1.1
-
SqlServer-20 - SQL Server driver for .NET Framework 2.0
-
OracleClient-20 - Microsoft's Oracle Driver (comes bundled with .NET Framework)
-
OracleODP-20 - Oracle's Oracle Driver
-
MySql-10 - MySQL Connector/.NET v. <?XML:NAMESPACE PREFIX = ST1 /><chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.0.7</chsdate>
-
MySql-109 - MySQL Connector/.NET v. <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.0.9</chsdate>
-
MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)
-
MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)
-
SQLite1044 - SQLite ADO.NET 2.0 Provider v. <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.0.44</chsdate> (.NET 2.0)
如果Scheduler非常忙(比如,执行的任务数量差不多和线程池的数量相同,那么你需要正确地配置DataSource的连接数量为线程池数量。为了指示AdoJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中,应设置 quartz.jobStore.useProperties配置参数的值为"true"(这是缺省的方式)。这样做,从长远来看非常安全,这样避免了对存储在BLOB中的非字符串的序列化对象的类型转换问题。
分享到:
相关推荐
Quartz.NET 官方源码及演示例子,官方下载地址:http://sourceforge.net/projects/quartznet/files/quartznet/
前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API...
Quartz.NET 官方源码
Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...
Quartz.NET-2.1.2 官方包
quartz.net+TopShelf
Quartz.net 任务调度数据库持久化和集群;持久化能保证实例重启后job不丢失、 集群能均衡服务器压力和解决单点问题
Autofac.Extras.Quartz, Quartz.Net的Autofac集成 Autofac.Extras.Quartz用于 Quartz.Net的Autofac集成包。Autofac.Extras.Quartz 为每个石英作业创建嵌套的litefime作用域。 完成作业执行后释放嵌套作用域。这允许...
制定Quartz.NET调度计划,以及监控Quartz.NET以及Topshelf运行情况 应用场景:定时Job配置以及定时Job运行情况记录
Quartz.net-几十分钟后执行代码
刘冬编写Spring.NET学习笔记25——整合Quartz.NET例子。 原文: http://www.cnblogs.com/GoodHelper/archive/2009/11/20/SpringNet_QuartzNet.html
C# 使用Quartz.NET作业调度的简单Windows服务事例。
Quartz 教程 官方开发指南,非常实用和详细。
官方Quartz.NET 2.3.1 源码(官方2015.1.15更新) 附带15个示例 全部可用
C# quartz.net 定时任务源码,实现了远程操控.动态追加dll,可以安装到windows服务中.
C# Quartz.Net定时任务操作明细、完整过程 每种场景均有涉及,代码Copy稍作修改就可使用
Quartz.NET+TopSelf 实现定时服务,支持Job持久化和集群,异常重启 介绍:https://blog.csdn.net/qq_27559331/article/details/105067550 如果你觉得对你有用,麻烦你给个好评!
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或...quartz.net是java的.net移植版本,用法一样。
Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多...
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的...