C#定时任务框架Quartz.NET介绍与用法

C#定时任务框架 Quartz.NET 介绍与用法

Quartz.NET 是一个强大的、开源的定时任务调度框架,它可以用于 C# 编程语言中。

框架介绍

Quartz.NET 与 .NET Framework 完美结合,允许开发人员在自己的应用程序中创建并组织复杂的、企业级的定时任务调度系统。它被广泛应用于金融、电信、物流等领域,可以帮助开发人员在开发定时任务时,节省大量的开发时间和人工成本,提高开发效率。

Quartz.NET 的内置功能包括:

  • 支持多种触发器类型,如简单触发器、CRON 触发器等;
  • 支持任务调度的持久化;
  • 支持任务调度的集群模式;
  • 支持任务调度执行日志的记录;
  • 支持同时处理任务中的多个触发器等。

安装与配置

安装 Quartz.NET 可以通过 NuGet 包管理器完成,具体步骤如下:

  1. 在 Visual Studio 中打开项目;
  2. 右键单击项目,在弹出菜单中选择“管理 NuGet 程序包”;
  3. 在弹出的 NuGet 程序包管理器中搜索 Quartz.NET;
  4. 找到并选中要安装的版本,点击“安装”。

安装完成之后,需要在应用程序的配置文件中做一些配置。

对于 .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 的用法:

  • 插入数据库定时任务;
  • 发送邮件定时任务。

插入数据库定时任务

  1. 定义一个 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;
    }
}
  1. 创建 IScheduler 实例,并使用 IJobDetailITrigger 配置定时任务。
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);
  1. 启动定时任务调度器。
await scheduler.Start();

Console.WriteLine("定时任务已启动");
Console.ReadLine();

await scheduler.Shutdown();

发送邮件定时任务

  1. 定义一个 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;
    }
}
  1. 创建 IScheduler 实例,并使用 IJobDetailITrigger 配置定时任务。
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);
  1. 启动定时任务调度器。
await scheduler.Start();

Console.WriteLine("定时任务已启动");
Console.ReadLine();

await scheduler.Shutdown();

总结

Quartz.NET 是一个功能强大、使用方便的定时任务调度框架,它可以帮助开发人员在开发定时任务时,节省大量的开发时间和人工成本,提高开发效率。在实际应用中,可以根据实际业务需求和场景,进行灵活的配置和使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#定时任务框架Quartz.NET介绍与用法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# 基础入门–注释

    非常感谢你对C#基础学习的关注!注释是一种非常重要的编程元素,它能够加强代码的可读性、可维护性和可访问性。在本篇文章中,我将为您介绍如何在C#程序中使用注释,包括单行注释和多行注释。 单行注释 单行注释会在某一行的末尾添加标记符号“//”,表示该行后面的文字都是注释内容。例如,下面的代码演示了单行注释的使用: // 这是一个单行注释 int x = 5; /…

    C# 2023年6月7日
    00
  • C# 面向对象的基本原则

    C#面向对象的基本原则包括封装、继承和多态。以下是这些原则的详细说明。 封装 封装是一种将对象的状态数据和行为操作包装在一起的方式。这使得对象的内部实现细节对外部用户不可见。在C#中,我们使用访问修饰符来实现封装。 例如,下面是一个示例代码: public class Person { private string name; // 私有字段 public …

    C# 2023年5月15日
    00
  • Go遍历struct,map,slice的实现

    首先,可以通过for-range语句遍历切片和映射。for-range语句让代码更清晰易懂。 遍历slice 下面是遍历slice的示例: package main import "fmt" func main() { // 声明一个字符串切片 fruits := []string{"apple", "ban…

    C# 2023年5月31日
    00
  • bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法

    好的。针对 “bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法” 这个问题,需要做如下解读: 确认问题:在使用 bootstrap datetimepicker 日期插件的过程中,在火狐浏览器下会出现一条报错信息。 原因分析:bootstrap datetimepicker 日期插件基于 jQuery,它…

    C# 2023年6月1日
    00
  • VS2015中C#版本6.0的新特性 你需要知道

    VS2015 中 C# 版本 6.0 的新特性 简介 C# 6.0 是一种微软为.NET Framework所开发的编程语言,是.NET开发领域的主流语言之一,在 VS2015 中提供了许多新的语言特性,包括NULL条件运算符、字符串插值、表达式体成员等。本文将会详细介绍 VS2015 中C# 6.0 的新特性。 NULL 条件运算符 NULL 条件运算符是…

    C# 2023年6月1日
    00
  • asp.net core集成CKEditor实现图片上传功能的示例代码

    ASP.NET Core 是一个跨平台、高性能的开源框架,用于 Web 应用程序的构建。CKEditor 是一个功能强大的 WYSIWYG 编辑器,可以支持图像上传功能。在 ASP.NET Core 中集成 CKEditor 实现图片上传功能的过程并不复杂。以下是示例代码: 集成 CKEditor 首先,我们需要在 ASP.NET Core 项目中安装 CK…

    C# 2023年6月3日
    00
  • C#实现动态执行字符串脚本(优化版)的示例代码

    让我来详细讲解“C#实现动态执行字符串脚本(优化版)的示例代码”的完整攻略。 首先,需要明确的是,我们要实现的目标是动态执行字符串脚本,所以需要满足以下要求: 能够将字符串解析为C#代码 能够动态地将解析出来的代码编译成程序集 能够调用编译后的程序集中的方法 针对上述要求,我们需要利用C#的编译器,通过代码生成器将字符串转为C#代码,并通过编译器将生成后的代…

    C# 2023年5月15日
    00
  • C#分布式事务的超时处理实例分析

    C#分布式事务的超时处理实例分析 简介 本文将介绍在C#中处理分布式事务超时的实例,重点是针对传统的数据库操作,如何处理分布式事务超时的问题。 超时处理 在分布式事务中,一个事务可能会跨越多个数据库。当一个分布式事务出现了超时异常,我们需要对其进行处理。 超时处理有两个主要的目的: 避免事务无限制地等待,耗尽所有的资源 报告错误并撤销操作 下面介绍两个示例,…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部