发布:2023/12/7 15:52:41作者:大数据 来源:大数据 浏览次数:640
.NET CORE定时任务Quartz。控制台使用Quartz。在某个特定时间点执行定时任务
Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
其实Quartz是一个完全由java编写的开源作业调度框架,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。而Quartz.Net与NPOI一样是一个DoNet平台下的对应版本。如果您使用Java直接访问这里就好了http://www.quartz-scheduler.org/
新建一个Quartz.NET.Apply项目, 使用Quartz.net之前,我们需要引入Nuget包,在Nuget包管理器中搜索Quartz,点击就可以安装了,当然也可以在包控制台里输入:
Install-Package Quartz
1 2 3 4 5 6 7 8 |
public class ConsoleWriteJobShowDatetime : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine($"任务执行时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); return Task.CompletedTask; } } |
Execute就是我们要执行任务入口,此方法会根据相关配置执行一次或者多次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class QuartzRunJob { public static async Task RunJob() { ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler scheduler = await schedulerFactory.GetScheduler(); DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now, 1); IJobDetail job = JobBuilder.Create() .WithIdentity("ConsoleWriteJobShowDatetime","job") .Build(); ITrigger trigger = TriggerBuilder.Create() .StartAt(startTime) .WithIdentity("ConsoleWriteJobShowDatetime", "job") .WithSimpleSchedule(x=>x.WithIntervalInSeconds(1).RepeatForever()) .Build(); await scheduler.ScheduleJob(job, trigger); await scheduler.Start(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using Quartz.Impl; using System; using System.Threading.Tasks; namespace Quartz.NET.Apply { class Program { static void Main(string[] args) { Task job= QuartzRunJob.RunJob(); job.Wait(); Console.Read(); } } } |
我们可以封装一个通用的方法,实现Ijob后就可以直接调用公共方法,使简单的定时任务更加方面快捷。内容如下:
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 26 27 28 |
public static class QuartzHelpers { public static async Task StartAsync<T>(TimeSpan ts, string jobName, string triggerName, string groupName) where T : IJob { DateTimeOffset runTime = DateBuilder.EvenSecondDate(DateTime.Now); IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, groupName).Build(); ITrigger trigger = TriggerBuilder.Create().WithIdentity(triggerName, groupName).StartAt(runTime) .WithSimpleSchedule(x => x.WithInterval(ts).RepeatForever()).Build(); ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.ScheduleJob(job, trigger); await scheduler.Start(); } public static async Task StartAsync<T>(string cronExp, string jobName, string triggerName, string groupName) where T : IJob { DateTimeOffset runTime = DateBuilder.EvenSecondDate(DateTime.Now); IJobDetail job = JobBuilder.Create<T>().WithIdentity(jobName, groupName).Build(); ITrigger trigger = TriggerBuilder.Create().WithIdentity(triggerName, groupName) .WithCronSchedule(cronExp).StartAt(runTime).Build(); ISchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.ScheduleJob(job, trigger); await scheduler.Start(); } } |
简单调用如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using Quartz.Impl; using System; using System.Threading.Tasks; namespace Quartz.NET.Apply { class Program { static void Main(string[] args) { Task job= QuartzRunJob.RunJob(); Task job1=QuartzHelpers.StartAsync<ConsoleWriteJobShowDatetime>(new TimeSpan(0,0,1),"job1", "triggerName1", "groupName"); Task job2 = QuartzHelpers.StartAsync<ConsoleWriteJobShowDatetime>("0/1 * * * * ? ", "job2", "triggerName2", "groupName1"); Console.Read(); } } } |
关于Quart.net说是用的Cron表达式的说明,请参考这篇内容:Quartz.net的Cron表达式
示例下载
官方参考:
https://www.quartz-scheduler.net/
https://github.com/quartznet/quartznet/tree/main/src/Quartz.Examples
其它参考:
http://tnblog.net/aojiancc2/article/details/7082
https://www.skyfinder.cc/2019/12/16/quartz-net-execute-task/
.NET的开源作业计划系统QuartzNet
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4