任务调度系统Quartz.net详解3持久化
Quartz.net还可以通过数据库进行持久化
JobStore
JobStore用于追踪任务调度相关的所有数据,如Job,Trigger,Calendar等。Quartz.net 提供了两种JobStore:RAMJobStore,AdoJobStore。
RAMJobStore
RAMJobStore
是最简单的JobStore,顾名思义这种JobStore将所有的数据都存放在内存中,这也是它运行速度快的原因,但是弊端也很明显:一旦应用结束或者遇到断电所有的数据都会丢失。RAMJobStore是默认的JobStore,我们也已通过下边的代码来显式设置使用的JobStore为RAMJobStore。
1 2 3 4 5 6 7 8
| NameValueCollection properties = new NameValueCollection { ["quartz.jobStore.type"] = "Quartz.Simpl.RAMJobStore, Quartz" }; ISchedulerFactory factroy = new StdSchedulerFactory(properties); IScheduler scheduler= await factroy .GetScheduler();
|
AdoJobStore
AdoJobStore通过Ado.net将数据存储在数据库中,因此可以解决断电数据丢失的问题,但是因为要读写数据库所以效率相对较低。AdoJobStore官方支持的数据库有:MySql,SqlServer,Sqllite,Oracle等
Quartz.net持久化
首先需要自行创建相应的表格,git上已经为我们提供了不同数据库的脚本,地址详见https://github.com/quartznet/quartznet/blob/main/database/tables
,为了简单演示,本文直接使用sqlite进行持久化。
为了使用sqlite,首先nuget安装:

进行持久化配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| NameValueCollection pars = new NameValueCollection() { ["quartz.scheduler.instanceName"] = "MyScheduler", ["quartz.threadPool.threadCount"] = "10", ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz", ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz", ["quartz.jobStore.dataSource"] = "myDS", ["quartz.jobStore.tablePrefix"] = "QRTZ_", ["quartz.dataSource.myDS.connectionString"] = "Data Source=C:\\Users\\Administrator\\Desktop\\data.db;", ["quartz.dataSource.myDS.provider"] = "SQLite", ["quartz.serializer.type"] = "binary", ["quartz.scheduler.instanceId"] = "AUTO", };
|
增加定时任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| StdSchedulerFactory factory = new StdSchedulerFactory(pars); IScheduler scheduler = factory.GetScheduler().Result;
IJobDetail job = JobBuilder .Create<MyJob>() .WithIdentity("jobName3", "jonGroup") .WithDescription("增加一个描述") .Build();
ITrigger trigger = TriggerBuilder.Create() .StartNow() .WithSimpleSchedule(x => x.WithIntervalInSeconds(1) .WithRepeatCount(100)).Build();
scheduler.ScheduleJob(job,trigger).Wait();
scheduler.Start();
|
==============中间部分,只需要首次定义好就可以,第二次不进行定义也可以按照我们的预期进行执行,因为已经在数据库中进行了持久化。
注意:千万不要通过代码来直接操作JobStore(比如我们直接通过代码修改数据库中的数据),JobStore让Quartz自动操作即可,我们只使用Scheduler提供的接口方法来实现Job和Trigger等的增/删/改/查/暂停/恢复即可。接口详细信息参见QuartzScheduler APi)