Quartz.NET
Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
官网:http://www.quartz-scheduler.net/
源码:https://github.com/quartznet/quartznet
示例:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html
其实Quartz是一个完全由java编写的开源作业调度框架,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。而Quartz.Net与NPOI一样是一个DoNet平台下的对应版本。如果您使用Java直接访问这里就好了http://www.quartz-scheduler.org/
搭建Quartz定时任务
安装
新建一个Quartz.NET.Apply项目, 使用Quartz.net之前,我们需要引入Nuget包,在Nuget包管理器中搜索Quartz,点击就可以安装了,当然也可以在包控制台里输入:
Install-Package Quartz
实现IJob
public class ConsoleWriteJobShowDatetime : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"任务执行时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return Task.CompletedTask;
}
}
Execute就是我们要执行任务入口,此方法会根据相关配置执行一次或者多次。
任务触发器
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();
}
}
运行
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后就可以直接调用公共方法,使简单的定时任务更加方面快捷。内容如下:
public static class QuartzHelpers
{
public static async Task StartAsync(TimeSpan ts, string jobName, string triggerName, string groupName) where T : IJob
{
DateTimeOffset runTime = DateBuilder.EvenSecondDate(DateTime.Now);
IJobDetail job = JobBuilder.Create().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(string cronExp, string jobName, string triggerName, string groupName) where T : IJob
{
DateTimeOffset runTime = DateBuilder.EvenSecondDate(DateTime.Now);
IJobDetail job = JobBuilder.Create().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();
}
}
}
简单调用如下:
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(new TimeSpan(0,0,1),"job1", "triggerName1", "groupName");
Task job2 = QuartzHelpers.StartAsync("0/1 * * * * ? ", "job2", "triggerName2", "groupName1");
Console.Read();
}
}
}
Cron表达式
关于Quart.net说是用的Cron表达式的说明,请参考这篇内容:Quartz.net的Cron表达式
下载
示例下载
转载请注明:清风亦平凡 » 使用Quartz.NET实现定时(计划)任务