定时任务框架 Quartz.NET 的简单应用

定时任务框架 Quartz.NET 的简单应用


博客园文章Id: 12659890


Quartz .NET

概述:

Quartz .NET 是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。

  • 定时数据库同步。
  • 定时通知。
  • 定时处理数据。

Quartz .NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz .NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

接下来我们就来创建一个简单的例子来说明Quartz .NET 在定时任务方面的应用,大概步骤分为以下几步:

  1. 我们需要编写一个类用来实现某个需要进行定时执行的任务.
  2. 创建用于进行调度定时任务调度器.
  3. 通过JobBuilder生成一个任务Job.
  4. 通过TriggerBuilder创建一个触发器Trigger.
  5. 将创建的Job实例和Trigger实例加入到调度器Scheduler中.

在编写Demo之前,我们需要先进行一些准备工作:

在Visual Studio中,我们通过NuGet包管理器,需要先安装Quartz包,此处我们安装2.5.0版本,命令如下:

Install-Package Quartz -Version 2.5.0

在下面的示例中,主要需要用到下列三个dll程序集.

  • Common.Logging.dll
  • Common.Logging.Core.dll
  • Quartz.dll

上面的NuGet命令,已经将我们所需要的三个程序集下载到当前项目中.

使用代码方式:

下面是代码示例:

创建某个具体任务实现的作业:

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 用于演示需要定时执行的任务
    /// </summary>
    class DemoJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine(string.Format("Exceute Job : 执行时间:{0}", DateTime.Now.ToString()));
        }
    }
}

创建某个具体实现的触发器:

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 调度器
    /// </summary>
    class DemoScheule
    {
        public static void Start()
        {
            /*------Demo1 无参数 简单调用的方法 -----------*/

            //实例化调度器工厂
            ISchedulerFactory schedulefactory = new StdSchedulerFactory();

            //通过调度工厂获取一个调度器对象
            IScheduler scheduler = schedulefactory.GetScheduler();

            //启动调度器
            scheduler.Start();

            //创建一个定时任务作业
            IJobDetail job1 = JobBuilder.Create<DemoJob>().WithIdentity("DemoJob","groupa").Build();

            //创建一个触发器
            ITrigger trigger1 = TriggerBuilder
                .Create()
                .WithIdentity("DemoTrigger","groupa")
                .StartNow()                                 //设置每五秒执行一次,无限循环执行
                .WithSimpleSchedule(u=>u.WithIntervalInSeconds(5).RepeatForever()).Build();

            //把定时任务作业,和触发器加入调度器
            scheduler.ScheduleJob(job1, trigger1);
        }
    }
}

调用触发器进行定时任务的执行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //调用调度器
            Console.WriteLine("Job Start");

            DemoScheule.Start();

            Console.ReadKey();

        }
    }
}

某个具体任务实现的作业(带参数)

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 用于演示需要定时执行的任务(带参数)
    /// </summary>
    class DemoJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap = context.JobDetail.JobDataMap;

            string str = dataMap.GetString("id");  //调用数据

            Console.WriteLine(string.Format("Exceute Job :{0} 执行时间:{1}",str, DateTime.Now.ToString()));
        }
    }
}

创建某个具体实现的触发器(带参数):

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 调度器
    /// </summary>
    class DemoScheule
    {
        public static void Start()
        {
            /*------Demo1 无参数 简单调用的方法 -----------*/

            //实例化调度器工厂
            ISchedulerFactory schedulefactory = new StdSchedulerFactory();

            //通过调度工厂获取一个调度器对象
            IScheduler scheduler = schedulefactory.GetScheduler();

            //启动调度器
            scheduler.Start();

            //创建一个定时任务作业
            IJobDetail job1 = JobBuilder
                .Create<DemoJob>()
                .WithIdentity("DemoJob", "groupa")
                .UsingJobData("id","1")  //装载数据
                .Build();

            //创建一个触发器
            ITrigger trigger1 = TriggerBuilder
                .Create()
                .WithIdentity("DemoTrigger","groupa")
                .StartNow()
                //.WithSimpleSchedule(u=>u.WithIntervalInSeconds(5).RepeatForever()) //设置每五秒执行一次,无限循环执行
                .WithSimpleSchedule(u=>u.WithIntervalInSeconds(3).WithRepeatCount(2)) //3秒执行一次执行两次后停止, 开始运行会执行一次
                .Build();

            //把定时任务作业,和触发器加入调度器
            scheduler.ScheduleJob(job1, trigger1);
        }
    }
}

调用触发器进行定时任务的执行,的过程和上面是一样的.

使用配置方式

上面我们进行任务调度都是通过代码来实现的,当我们要修改歹毒规则的时候,就要重新编译代码这是很不方便的,Quartz .Net 提供了通过配置文件的方式来进行操作.

首先我们在Web.Config或app.Config里面进行配置<Quartz></Quartz>节点的数据.

Quartz在Web.Config或App.Config中块描述.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--我们需要将Quartz的块配置声明放到startup块的最前面,否则会报错.-->
  
  <configSections>
    <!--声明Quzrtz块-->
    <section name="Quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  </configSections>
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>

  <!--对Quartz块的描述-->
  <Quartz>
    <add key="quartz.scheduler.instanceName" value="ServerScheduler" />

    <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.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
    <add key="quartz.plugin.xml.fileNames" value = "quartz_jobs.xml" />

    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
    
  </Quartz>
  
</configuration>
posted @ 2020-04-08 14:45  HelloZyjS  阅读(295)  评论(0编辑  收藏  举报