C# 基于Quartz.Net实现定时任务


前言

大家好,我是不自由的小码,这次要给大家分享的是基于Quartz.Net实现定时任务。timer这个东西相信大家都不会陌生,然而,timer的局限性,注定了在复杂任务调度下以及多任务长时间运行下,很容易出现无法达到预期的效果。


一、Quartz.Net是什么?

Quartz.Net是任务调度框架。根据官方的说法,它具有以下特点:
1.【运行时环境】可以嵌入在应用程序中运行,甚至可以实例化为独立程序集群(具有负载平衡和故障转移功能)
2.【作业调度】作业计划在给定触发器发生时运行,触发器支持多种计划选项
3.【作业执行】作业可以是实现简单 IJob 接口的任何 .NET 类,为作业可以执行的工作留下了无限的可能性
4.【作业持久性】可以实现作业存储来提供各种机制来存储作业,内存中和多个关系数据库开箱即用
5.【聚类】内置支持对工作负载平衡和正常故障转移
6.【侦听器和插件】应用程序可以通过实现一个或多个侦听器接口来捕获调度事件以监视或控制作业/触发器行为

二、Quartz.Net应用

1.引入库

打开VS2022通过Nuget搜索并且安装Quartz.Net。

using Quartz;
using Quartz.Impl;

2.任务调度配置类

JobScheduler配置类,下图很好解析了,一个任务调度的原理:

一旦调度程序被实例化,就可以启动它,将其置于待机模式并关闭。请注意,一旦调度程序关闭,如果不重新实例化,就无法重新启动它。触发器在计划程序启动之前不会触发(作业不会执行),也不会在计划程序处于暂停状态时触发。

    public class JobScheduler
    {
        public static void Start()
        {
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();

            IJobDetail job = JobBuilder.Create<InventoryJob>().Build();

            ITrigger trigger1 = TriggerBuilder.Create()
                .WithDailyTimeIntervalSchedule
                  (s =>
                     s.WithIntervalInHours(24)
                    .OnEveryDay()
                    .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
                  )
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                .Build();

            ITrigger CronTrigger = TriggerBuilder.Create()
            .WithCronSchedule(Com.corn)
            .Build();

            scheduler.ScheduleJob(job, CronTrigger);
        }
    }

3.作业实现类

InventoryJob类要继承于IJob,然后创建执行方法Execute(),该类是任务调度触发后第一时间执行的方法,一般应用于业务逻辑。

public class InventoryJob : IJob
{
   public void Execute(IJobExecutionContext context)
   {
   		//to do something
   }
}

4.配置Corn表达式

App.config文件中配置corn代码,配置是为了更灵活,没有别的意义,也可以写死在代码中。

<appSettings>
   <!--Corn表达式,每两小时的35分执行一次-->
   <add key="Corn" value="0 35 */2 * * ?" />
</appSettings>

初始化corn的值,也就是拿到我这个任务要在什么时间点执行。

Com.corn = ConfigurationManager.AppSettings["Corn"] != null ? ConfigurationManager.AppSettings["Corn"] : "0 35 0/1 * * ?";

表达式最终会在调度配置类中应用【JobScheduler】

ITrigger CronTrigger = TriggerBuilder.Create()
            .WithCronSchedule(**Com.corn**)
            .Build();

5.启动

Com.InitPara();//初始化配置参数,如初始化上面的Corn表达式。
JobScheduler.Start();

6.关闭

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Shutdown(true);//true 任务都执行完成以后在关闭 false 直接关闭

6.暂停、挂起

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Standby();

6.强制停止任务

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Shutdown(false);//true 任务都执行完成以后在关闭 false 直接关闭

三、注意事项

如果业务框架是CS模式,比如Winform、WPF下,在关闭窗体的时候需要考虑,任务管理器后台进行会不会结束掉,一般的Close,Exit,等都会出现杀不掉情况,使用下面代码进行Kill进程即可:

Process.GetCurrentProcess().Kill();
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# 中,可以使用 Quartz.NET实现定时任务,同时支持数据库持久化。Quartz.NET 是一个功能强大且灵活的开源作业调度库,可以用于创建定时任务和计划任务,支持数据库持久化和集群部署等高级功能。 要使用 Quartz.NET 实现数据库持久化,需要先创建一个用于存储调度程序数据的数据库表,可以使用 Quartz.NET 提供的 SQL 脚本来创建表。然后在应用程序中配置 Quartz.NET,指定数据库类型和连接字符串等信息。示例如下: ```csharp using Quartz; using Quartz.Impl; using Quartz.Impl.AdoJobStore; using Quartz.Spi; using System; using System.Collections.Specialized; class Program { static void Main() { Console.WriteLine("Starting scheduler..."); // 创建一个调度程序实例 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(GetSchedulerProperties()); IScheduler scheduler = schedulerFactory.GetScheduler().Result; // 启动调度程序 scheduler.Start(); Console.WriteLine("Scheduler started."); // 创建一个作业实例 IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .Build(); // 创建一个触发器实例,每秒钟触发一次 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInSeconds(1) .RepeatForever()) .Build(); // 将作业和触发器添加到调度程序中 scheduler.ScheduleJob(job, trigger); // 等待用户按下 Enter 键退出 Console.ReadLine(); // 关闭调度程序 scheduler.Shutdown(); Console.WriteLine("Scheduler stopped."); } static NameValueCollection GetSchedulerProperties() { // 配置调度程序属性,指定数据库持久化和相关参数 NameValueCollection properties = new NameValueCollection(); properties["quartz.scheduler.instanceName"] = "MyScheduler"; properties["quartz.scheduler.instanceId"] = "AUTO"; properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"; properties["quartz.jobStore.dataSource"] = "default"; properties["quartz.dataSource.default.provider"] = "SqlServer-20"; properties["quartz.dataSource.default.connectionString"] = "Server=(local);Database=Quartz;Trusted_Connection=True;"; return properties; } } public class HelloJob : IJob { public void Execute(IJobExecutionContext context) { Console.WriteLine("Hello, Quartz.NET!"); } } ``` 这个示例会创建一个调度程序实例,然后创建一个作业实例和触发器实例,并将它们添加到调度程序中。作业类 HelloJob 实现了 IJob 接口,用于定义作业执行的逻辑。在 GetSchedulerProperties 方法中,配置了调度程序属性,指定了数据库类型和连接字符串等信息。在这个示例中,使用的是 SQL Server 数据库。 需要注意的是,在使用 Quartz.NET 进行数据库持久化时,需要保证数据库连接可靠和高效,同时需要考虑并发执行的问题。可以适当地调整作业和触发器的参数,以达到最优的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不自由的小码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值