zoukankan      html  css  js  c++  java
  • 定时任务框架 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>
  • 相关阅读:
    添加多个tab,并循环修改tab样式
    00五大原则(转)
    win7 & IIS7.5 HTTP 错误 404.17 Not Found 请求的内容似乎是脚本,因而将无法由静态
    人类的奇怪之处
    创业公司CEO每天应该做的13件事(转),个人感觉,同样有几条也适合于自己,或部门领导。
    购物车功能分析
    ASP.NET中DataTable的用法
    jQuery插件列表
    jQuery灯箱插件lightBox使用方法
    一个黑客与电脑白痴的聊天纪录
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12659890.html
Copyright © 2011-2022 走看看