C#定时任务框架 Quartz.NET 介绍与用法
Quartz.NET 是一个强大的、开源的定时任务调度框架,它可以用于 C# 编程语言中。
框架介绍
Quartz.NET 与 .NET Framework 完美结合,允许开发人员在自己的应用程序中创建并组织复杂的、企业级的定时任务调度系统。它被广泛应用于金融、电信、物流等领域,可以帮助开发人员在开发定时任务时,节省大量的开发时间和人工成本,提高开发效率。
Quartz.NET 的内置功能包括:
- 支持多种触发器类型,如简单触发器、CRON 触发器等;
- 支持任务调度的持久化;
- 支持任务调度的集群模式;
- 支持任务调度执行日志的记录;
- 支持同时处理任务中的多个触发器等。
安装与配置
安装 Quartz.NET 可以通过 NuGet 包管理器完成,具体步骤如下:
- 在 Visual Studio 中打开项目;
- 右键单击项目,在弹出菜单中选择“管理 NuGet 程序包”;
- 在弹出的 NuGet 程序包管理器中搜索 Quartz.NET;
- 找到并选中要安装的版本,点击“安装”。
安装完成之后,需要在应用程序的配置文件中做一些配置。
对于 .NET Core 3.1 及以上版本的应用程序,可以在 appsettings.json 文件中添加以下配置:
{
"Quartz": {
"Scheduler": {
"InstanceName": "QuartzScheduler",
"ThreadPool": {
"Type": "Quartz.Simpl.SimpleThreadPool, Quartz",
"ThreadCount": "10",
"ThreadPriority": "Normal"
}
},
"JobStore": {
"Type": "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
"DataSource": {
"ConnectionString": "Data Source=quartz.db;Version=3",
"Provider": "SQLite-Microsoft",
"UseProperties": "true",
"MaxConnections": "10"
},
"TablePrefix": "QRTZ_",
"DriverDelegateType": "Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz",
"InstanceName": "QuartzScheduler",
"Clustered": "false",
"MisfireThreshold": "60000",
"UseProperties": "true"
},
"Plugins": {
"AutoStart": "true",
"JobInitializer": {
"Type": "Quartz.Plugin.Xml.JobInitializationPlugin, Quartz.Plugins",
"FileNames": "jobs.xml",
"OverWriteExistingJobs": "true",
"FailOnFileNotFound": "true",
"ScanInterval": "10"
}
}
}
}
对于 .NET Framework 应用程序,可以在 app.config 文件中添加以下配置:
<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<quartz>
<add key="quartz.scheduler.instanceName" value="QuartzScheduler" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.dataSource.default.provider" value="SQLite-Microsoft" />
<add key="quartz.dataSource.default.connectionString" value="Data Source=quartz.db;Version=3" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz" />
<add key="quartz.scheduler.proxy" value="false" />
<add key="quartz.scheduler.proxy.address" value="" />
<add key="quartz.scheduler.instanceId" value="AUTO" />
<add key="quartz.scheduler.makeSchedulerThreadDaemon" value="true" />
<add key="quartz.jobStore.clustered" value="false" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
</quartz>
使用示例
接下来,我们将使用以下两个示例说明 Quartz.NET 的用法:
- 插入数据库定时任务;
- 发送邮件定时任务。
插入数据库定时任务
- 定义一个 C# 类,实现
IJob
接口,重写其中的Execute
方法。
public class InsertJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
using (var conn = new SQLiteConnection("Data Source=quartz.db;Version=3"))
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
using (var command = new SQLiteCommand("INSERT INTO Test (name) VALUES ('Quartz.NET')", conn, trans))
{
command.ExecuteNonQuery();
}
trans.Commit();
}
}
return Task.CompletedTask;
}
}
- 创建
IScheduler
实例,并使用IJobDetail
和ITrigger
配置定时任务。
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler();
var job = JobBuilder.Create<InsertJob>()
.WithIdentity("InsertJob", "InsertJobGroup")
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("InsertJobTrigger", "InsertJobGroup")
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(60)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job, trigger);
- 启动定时任务调度器。
await scheduler.Start();
Console.WriteLine("定时任务已启动");
Console.ReadLine();
await scheduler.Shutdown();
发送邮件定时任务
- 定义一个 C# 类,实现
IJob
接口,重写其中的Execute
方法。
public class SendEmailJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("发送人", "email@example.com"));
message.To.Add(new MailboxAddress("收件人", "email@example.com"));
message.Subject = "Quartz.NET 发送邮件";
message.Body = new TextPart("plain")
{
Text = "Quartz.NET 发送邮件测试。"
};
using (var client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect("smtp.exmail.qq.com", 465, true);
client.Authenticate("email@example.com", "password");
client.Send(message);
client.Disconnect(true);
}
return Task.CompletedTask;
}
}
- 创建
IScheduler
实例,并使用IJobDetail
和ITrigger
配置定时任务。
var schedulerFactory = new StdSchedulerFactory();
var scheduler = await schedulerFactory.GetScheduler();
var job = JobBuilder.Create<SendEmailJob>()
.WithIdentity("SendEmailJob", "SendEmailJobGroup")
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("SendEmailJobTrigger", "SendEmailJobGroup")
.WithCronSchedule("0 0/5 * * * ?")
.Build();
await scheduler.ScheduleJob(job, trigger);
- 启动定时任务调度器。
await scheduler.Start();
Console.WriteLine("定时任务已启动");
Console.ReadLine();
await scheduler.Shutdown();
总结
Quartz.NET 是一个功能强大、使用方便的定时任务调度框架,它可以帮助开发人员在开发定时任务时,节省大量的开发时间和人工成本,提高开发效率。在实际应用中,可以根据实际业务需求和场景,进行灵活的配置和使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#定时任务框架Quartz.NET介绍与用法 - Python技术站