在要求输入邮箱的文本域,请填写真实的邮件地址。非真实邮件地址,将收不到回复信息。

使用Quartz.NET实现定时(计划)任务

.net core 清风 104℃ 0评论

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

Quartz.NET现在已经支持.NET CORE项目。

实现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 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();
        }
    }
}

以上代码出现的“0/1 * * * * ?”为Cron表达式。

Cron表达式

关于Quart.net说是用的Cron表达式的说明,请参考这篇内容:Quartz.net的Cron表达式

下载

示例下载

转载请注明:清风博客 » 使用Quartz.NET实现定时(计划)任务

喜欢 (0)or分享 (0)
支付宝扫码打赏 微信打赏
发表我的评论
取消评论

CAPTCHA Image
Reload Image
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址