JobStore负责保持对所有scheduler “工作数据”追踪,这些工作数据包括:job(任务),trigger(触发器),calendar(日历)等。为你的Quartz scheduler选择合适的JobStore是非常重要的一步,幸运的是,如果你理解了不同的JobStore之间的差别,那么选择就变得非常简单。在提供产生scheduler 实例的SchedulerFactory的属性文件中声明scheduler所使用的JobStore(以及它的配置)。

注:不要在代码中直接使用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. 1.0.7
  • MySql-109 - MySQL Connector/.NET v. 1.0.9
  • 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. 1.0.44 (.NET 2.0)

如果Scheduler非常忙(比如,执行的任务数量差不多和线程池的数量相同,那么你需要正确地配置DataSource的连接数量为线程池数量。为了指示AdoJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中,应设置 quartz.jobStore.useProperties配置参数的值为"true"(这是缺省的方式)。这样做,从长远来看非常安全,这样避免了对存储在BLOB中的非字符串的序列化对象的类型转换问题。

转载于:https://www.cnblogs.com/shanyou/archive/2007/08/25/869110.html

Quartz.net官方开发指南 第九课: JobStore相关推荐

  1. Quartz.net官方开发指南 第二课:Jobs And Triggers

    正如前面所提到的那样,通过实现IJob接口来使你的.NET组件可以很简单地被scheduler执行.下面是IJob接口: namespace Quartz {      /**//// <sum ...

  2. Quartz.net官方开发指南 第十课: 配置、资源使用以及SchedulerFactory

    Quartz以模块方式构架,因此,要使它运行,几个组件必须很好的咬合在一起.幸运的是,已经有了一些现存的助手可以完成这些工作. 在Quartz进行工作之前需要被配置的组件主要有: • ThreadPo ...

  3. Quartz.net官方开发指南 第五课: SimpleTrigger

    如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行,简单地说,如果你想让触发器在<?xml:namespace prefix = st1 ns = " ...

  4. Quartz.net官方开发指南 第七课 : TriggerListeners和JobListeners

    监听器是在scheduler事件发生时能够执行动作的对象.可以看出,TriggerListeners接收与triggers相关的事件,而JobListeners则接收与Job相关的事件.<?xm ...

  5. OpenCart 官方开发指南翻译一 —— 模块开发

    模块开发   编写 OpenCart 模块可以很好地了解 OpenCart 如何运作的基本原理.就像 OpenCart 的其余部分一样,模块遵循 MVCL 设计模式.本文档指南将介绍如何使用 MVC- ...

  6. Knockout应用开发指南

    第一章:入门 1.Knockout简介 (Introduction) Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化. Knockout有如下4大重要 ...

  7. cups源码下载 linux_【正点原子FPGA连载】第九章Linux显示设备的使用-领航者ZYNQ之linux开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  8. Go官方库RPC开发指南

    Go官方提供了一个RPC库: net/rpc.包rpc提供了通过网络访问一个对象的方法的能力.服务器需要注册对象, 通过对象的类型名暴露这个服务.注册后这个对象的输出方法就可以远程调用,这个库封装了底 ...

  9. Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题

    这两天一直在做google map接入前的准备工作 特此在这里将自己在加载官方demo时出现的问题以及详细的接入步骤进行记录,已免后者踩坑 注:项目实际运行时不要使用虚拟机 因为电脑ip和虚拟机ip不 ...

最新文章

  1. golang 切片的三种简单使用方式及区别
  2. 精心收集汇总的Python学习资源(书籍+工具+视频),强烈建议收藏!
  3. 网络与IO知识扫盲(六):多路复用器
  4. C语言 删除文件 M,最全的C盘可删除文件清单
  5. html5 学习_5分钟内学习HTML
  6. linux修改文件权限和用户组管理小结
  7. iOS学习笔记03-UITableView
  8. CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量
  9. 六、面向对象,会了面向对象妈妈再也不用担心我找不到对象了!
  10. 项目过程中的部分逻辑
  11. DevExpress之ChartControl用法
  12. MATLAB图像去雾霭算法及其实现
  13. 冰点还原标准版-中文版(全面支持Windows 7)7.0.020.3172(最新版)下载与注册
  14. matlab随机函数
  15. 恢复PyCharm顶部菜单栏
  16. 基于JSP(java)网络百宝箱的设计和实现(含源文件)
  17. LeetCode-分数排名
  18. 持续集成之Jenkins+Gitlab实现持续集成
  19. Vulkan再探(12):输入附件
  20. 解决友坚恒天4412不能读取U盘的问题

热门文章

  1. ubuntu14.04,安装JDK1.8(JAVA程序需要的开发、运行环境)
  2. qq地区采集_用户诉QQ浏览器违法收集个人隐私,法院裁定腾讯立即停止相关行为...
  3. python回归模型 变量筛选_如何进行高维变量筛选和特征选择(一)?Lasso回归
  4. 产品开发管理方法工具流程 pdf_pdf转化为word的方法有什么?实用工具就有这两个...
  5. 机器学习是什么--周志华
  6. CVPR 2018 MCCT:《Multi-Cue Correlation Filters for Roubust Visual Tracking》论文笔记
  7. python 游戏脚本 vbs_用VBScript制作QQ自动登录的脚本代码
  8. 安卓java模拟器_用大白话告诉你:Java 后端到底是在做什么?
  9. Celery分布式任务队列的认识和基本操作
  10. requests模块的入门使用