当前位置: 首页 > news >正文

Quartz.Net进阶之六:详述 JobStores

        一、介绍

            今天开始学习 JobStore,别的先不说,也不用翻译软件来翻译,直接从字面意思看来理解一下。我第一眼的感觉就是 job 是任务的意思,Store 是商店的意思,连起来就是可以存储 Job 的商店,或者说专门用来存储 Job 的容器。废话少说,开始我们今天的学习吧。

        二、详述 JobStore

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

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


            1、RAMJobStore

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

                配置Quartz以使用RAMJobStore

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


                要使用 RAMJobStore(假设您正在使用StdSchedulerFactory),您不需要做任何特殊的事情。 Quartz.NET的默认配置使用 RAMJobStore 作为任务存储实现。


            2、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以使用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、PostgreSQLDelegateLIMITN、OracleDelegate ROWCOUNT()<=n等)。

                选择委托之后,将其类名设置为 AdoJobStore 要使用的委托。

                配置AdoJobStore以使用DriverDelegate

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


                接下来,您需要通知JobStore您正在使用的表前缀(如上所述)。

                    quartz.jobStore.tablePrefix = QRTZ_


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

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

                    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

           
        三、总结

            好了,今天就写到这里了。大家感觉应该很轻松,内容不多。还是老规矩,我把英文原文地址发出来,英文好的可以直接看英文,理解的会更好。地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html

            不忘初心,继续努力。

转载于:https://www.cnblogs.com/PatrickLiu/p/10207228.html

相关文章:

  • DB-MySQL:MySQL 处理重复数据
  • 【[HEOI2016/TJOI2016]游戏】
  • iOS调用系统发送短信和邮件分享
  • ORM简介
  • Qt支持哪些硬件通信协议???
  • 不用代理IP加快速度会被封吗?
  • 基于zookeeper实现分布式锁
  • 微信小程序之----接口调用方式
  • django 的后台管理
  • Vue 目录
  • 蒟蒻的作文
  • PLC之六部十层电梯整体框架
  • js实现数组去重的几种方法
  • MapReduce编程:词频统计
  • Python基础之文件
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Django 博客开发教程 8 - 博客文章详情页
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • MySQL QA
  • storm drpc实例
  • Sublime text 3 3103 注册码
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • tweak 支持第三方库
  • 两列自适应布局方案整理
  • 配置 PM2 实现代码自动发布
  • 区块链技术特点之去中心化特性
  • 人脸识别最新开发经验demo
  • 如何解决微信端直接跳WAP端
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 硬币翻转问题,区间操作
  • 仓管云——企业云erp功能有哪些?
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #### go map 底层结构 ####
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (第二周)效能测试
  • (二)hibernate配置管理
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别