任务调度系统Quartz.net详解3持久化

任务调度系统Quartz.net详解3持久化

任务调度系统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
//2.通过代码配置scheduler
NameValueCollection properties = new NameValueCollection
{
//JobStore类型为内存存储
["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安装:

image-20240902160449117

进行持久化配置

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()
{
//scheduler名字
["quartz.scheduler.instanceName"] = "MyScheduler",
//线程池个数
["quartz.threadPool.threadCount"] = "10",
//存储类型为JobStoreXT,
["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",
//自动生成scheduler实例ID,主要为了保证集群中的实例具有唯一标识
["quartz.scheduler.instanceId"] = "AUTO",
//是否配置集群
//["quartz.jobStore.clustered"] = "true",
};

增加定时任务

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;
//=========只有首次需要定义=======start==================
//创建job
IJobDetail job = JobBuilder
.Create<MyJob>() //创建一个jobBuilder
.WithIdentity("jobName3", "jonGroup") //辨识名称和分组
.WithDescription("增加一个描述")
.Build(); //生成IJobDetail

ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(1)
.WithRepeatCount(100)).Build();

scheduler.ScheduleJob(job,trigger).Wait();
//=========只有首次需要定义========end=================
scheduler.Start();


==============中间部分,只需要首次定义好就可以,第二次不进行定义也可以按照我们的预期进行执行,因为已经在数据库中进行了持久化。

注意:千万不要通过代码来直接操作JobStore(比如我们直接通过代码修改数据库中的数据),JobStore让Quartz自动操作即可,我们只使用Scheduler提供的接口方法来实现Job和Trigger等的增/删/改/查/暂停/恢复即可。接口详细信息参见QuartzScheduler APi)

任务调度系统Quartz.net详解3持久化

https://bubuweiying.site/任务调度系统Quartznet3/

作者

步步为营

发布于

2024-09-02

更新于

2025-03-15

许可协议