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#通过JObject解析json对象

    下面是如何通过C#中的JObject类解析JSON对象的完整攻略: 1. 引用Newtonsoft.Json包 要使用JObject类来解析JSON对象,需要引用Newtonsoft.Json包。在Visual Studio中,可以通过NuGet包管理器安装引用。在Package Manager Console中执行以下命令即可: Install-Packa…

    C# 2023年5月31日
    00
  • c#消息提示框messagebox的详解及使用

    C#消息提示框MessageBox的详解及使用 在C#编程中,提示信息是非常重要的,而MessageBox是处理提示信息的一种非常常见的方式。在本篇文章中,我们将深入探讨C#中的MessageBox,并介绍如何使用它来优化你的应用程序。 MessageBox对象 MessageBox是System.Windows.Forms命名空间的一部分,是一个弹出窗口,…

    C# 2023年6月7日
    00
  • C#实现将一个字符转换为整数

    讲解“C#实现将一个字符转换为整数”的完整攻略,主要使用C#内置的Convert.ToInt32()方法进行转换,具体步骤如下: 1. 将字符转换为字符串 首先,需要将输入的字符转换为字符串类型,可以使用ToString()方法或直接将字符使用双引号引起来,如: char c = ‘5’; string s = c.ToString(); // 或者 str…

    C# 2023年5月15日
    00
  • C#通过DataSet读写xml文件的方法

    下面是详细讲解C#通过DataSet读写XML文件的方法的完整攻略: 准备工作 在开始之前,需要使用C#项目创建好一个XML文件,并且设置好文件的格式和数据。 读取XML文件 创建DataSet对象,并读取XML文件 DataSet ds = new DataSet(); ds.ReadXml("文件路径及名称.xml"); 查找特定节点…

    C# 2023年6月1日
    00
  • C# Winform实现石头剪刀布游戏

    下面我将详细讲解“C#Winform实现石头剪刀布游戏”的完整攻略。 准备工作 首先,我们需要创建一个Winform应用程序,然后在窗体中添加三个按钮,分别代表石头、剪刀、布。接着,我们需要编写代码,实现石头剪刀布的逻辑。 实现过程 1.定义变量 首先,我们需要在代码中定义三个变量,分别代表石头、剪刀和布。代码如下: int rock = 1; int sc…

    C# 2023年5月15日
    00
  • C#文件非占用读取与帮助类FileHelper

    C#的FileHelper类库提供了许多方便的方法来处理文件读写操作,FileHelper类库中的File类封装了很多文件读写的方法,同时还提供了非占用读取文件的方法,可以有效防止文件被占用而无法进行读取或写入操作。 非占用读取文件 在进行文件读写操作时,有时候文件可能被其他应用程序或者进程占用而无法进行读写操作。FileHelper类库提供了一种解决方法:…

    C# 2023年6月1日
    00
  • 关于C#中ajax跨域访问问题

    下面我来详细讲解一下关于C#中ajax跨域访问问题的攻略。 什么是跨域访问? 跨域访问是指在浏览器中访问另一个域名的网页时,由于浏览器中遵循的同源策略,导致不能直接通过Ajax进行跨域访问。 如何解决C#中ajax跨域访问问题? 1. 使用JSONP方式 JSONP是一种跨域访问方式,其原理是利用script标签的src属性不受同源策略限制的特点,在请求时将…

    C# 2023年5月15日
    00
  • C# 正则表达式常用的符号和模式解析(最新推荐)

    C# 正则表达式常用的符号和模式解析(最新推荐) 简介 正则表达式是面向“字符”模式的,由字符组成的一种检索模式。在C#中,对正则表达式有很好的支持,我们可以使用System.Text.RegularExpressions.Regex类进行正则表达式的匹配和操作。 虽然正则表达式的语法看似复杂,但是当你掌握了其中的一些常用的符号,你会发现正则表达式变得简单易…

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