本文作者:小黑黑

[Quartz.Net]Quartz.Net - 持久化与集群部署

小黑黑 1年前 ( 2019-03-20 ) 862 抢沙发
[Quartz.Net]Quartz.Net - 持久化与集群部署摘要:         我们前面介绍了Quartz的基本使用语法与类库。但是它的执行计划都是被写到内存或是x...

        我们前面介绍了Quartz的基本使用语法与类库。但是它的执行计划都是被写到内存或是xml文件中的,无法做到集群,如果支持集群与持久化,单靠单机的内存和xml来保存计算任务调度的各种状态,这是非常困难的。这时候我们就需要数据库。

        AdoJobStore的命名非常得体,它将所有的数据通过Ado.Net保存到数据库中。因此,配置比RAMJobStore要复杂一些,而且速度也不快。但是,性能缺点并不是特别糟糕,特别是如果你在数据库表的主键上构建索引。

        要使用AdoJobStore,必须首先为Quartz.Net创建一组数据库以供其使用。你可以在 Github 上找到创建数据表的SqlServer脚本。目前,作业存储的内部实现的唯一选择是JobStoreTX,它自己创建事务。

配置Quartz以使用JobStoreTX

quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz

接下来,我们需要为JobStore选择一种DriverDelegate,DriverDelegate负责执行特定数据库可能需要的任何ADO.NET工作。StdAdoDelegate是一个用“vanilla”ADO.NET代码(和SQL语句)来完成其工作的委托。

配置AdoJobStore以使用DriverDelegate

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

配置AdoJobStore的数据表前缀

quartz.jobStore.tablePrefix = QRTZ_

最后,还需要设置JobStore应该使用哪个数据源,还必须在Quartz属性中定义指定的数据源,比如,我们指定Quartz使用的数据源名称为"myDS".

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

quartz.jobStore.dataSource = myDS

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

设置数据源的连接字符串和数据库提供程序

quartz.dataSource.myDS.connectionString = Data Source=.; Initial Catalog=quartz; User id=sa; Password=123456;
quartz.dataSource.myDS.provider = SqlServer


目前支持一下数据库提供程序

  • SqlServer - .Net Framework 2.0的SqlServer驱动程序

  • OracleODP - Oracle的Oracle驱动程序

  • OracleODPManaged - Oracle的Oracle 11托管驱动程序

  • MySql - MySql Connector / .NET

  • SQLite - SQLite ADO.NET Provider

  • SQLite-Microsoft - Microsoft SQLite ADO.NET Provider

  • Firebird - Firebird ADO.NET提供程序

  • Npgsql - PostgreSQL Npgsql

NameValueCollection nameValue = new NameValueCollection();

nameValue["quartz.scheduler.instanceName"] = "DefaultScheduler";

//设置序列化器
nameValue["quartz.serializer.type"] = "json";

nameValue["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";


//指定驱动类型
//目前支持的驱动
//Quartz.Impl.AdoJobStore.FirebirdDelegate
//Quartz.Impl.AdoJobStore.MySQLDelegate
//Quartz.Impl.AdoJobStore.OracleDelegate
//Quartz.Impl.AdoJobStore.PostgreSQLDelegate
//Quartz.Impl.AdoJobStore.SQLiteDelegate
//Quartz.Impl.AdoJobStore.SqlServerDelegate
//另外我们也可以在Github上找到Mongodb和redis的驱动

nameValue["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";

//设置数据库表前缀配置
nameValue["quartz.jobStore.tablePrefix"] = "QRTZ_";

//设置要使用的数据库的名称
nameValue["quartz.jobStore.dataSource"] = "myDS";

//设置数据库的连接字符串和数据库提供程序
nameValue["quartz.dataSource.myDS.connectionString"] = @"Data Source=.; Initial Catalog=quartz; User id=sa; Password=123456;";

//设置数据库提供程序
nameValue["quartz.dataSource.myDS.provider"] = "SqlServer";

ISchedulerFactory schedulerFactory = new StdSchedulerFactory(nameValue);
IScheduler scheduler = await schedulerFactory.GetScheduler();

这样我们就可以将所有数据保存到数据库中了,如果我们要集群的话,只需要添加下面两个配置

nameValue["quartz.jobStore.clustered"] = "true";
nameValue["quartz.scheduler.instanceId"] = "AUTO";

这样,我们在两台服务器上进行部署任务,两台机器可以同时跑,任务不会重复执行,且一台服务器挂掉后仍可准确无误的运行。

分享到: 网站分享代码

发表评论

快捷回复:

评论列表 (暂无评论,862人围观)参与讨论

还没有评论,来说两句吧...