Quartz.net 一款.net中的实用任务调度工具

    代码开发过程中,经常会用到一些需要任务调度去完成的工作,而Quartz则能很好的实现这一功能,下面话不多说进入正题

一 、首先我们在项目中要引用Quartz dll ,我们使用nuget则能很好的管理DLL

如图:

二、接下来我们需要引用两个命名空间,分别为Quartz 和 Quartz.Imp

服务入口及任务调度周期配置代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
using System.Configuration;
using Quartz;
using Quartz.Impl;

namespace AccountControlService
{
    public partial class Service1 : ServiceBase
    {

        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Service1));
        

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            log.Info("Begin Start");
            JobScheduler.Instance.Start();
            log.Info("End Start");
        }

        protected override void OnStop()
        {
            log.Info("Begin Stop");
            JobScheduler.Instance.Stop();
            log.Info("End Stop");
        }
       
    }

    public class JobScheduler
    {
        static IScheduler _sched = StdSchedulerFactory.GetDefaultScheduler();
        static JobScheduler _instance = null;
        static object lockObj = new object();
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(JobScheduler));



        /// <summary>
        /// 线程安全的单例对象
        /// </summary>
        public static JobScheduler Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (lockObj)
                    {
                        if (_instance == null)
                        {
                            _instance = new JobScheduler();
                        }
                    }
                }
                return _instance;
            }
        }
        public void Start()
        {
            try
            {
                IJobDetail job = JobBuilder.Create<UpdateAccountStateJob>().Build();
                //ITrigger trigger1 = TriggerBuilder.Create()
                //    .WithDailyTimeIntervalSchedule
                //      (s =>
                //         s.WithIntervalInHours(24)
                //        .OnEveryDay()
                //        .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
                //      )
                //    .Build();

                //ITrigger trigger = TriggerBuilder.Create()
                //    .WithIdentity("trigger1", "group1")
                //    .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                //    .Build();
                string corn = "0 0 0/1 * * ? " ;
                ITrigger CronTrigger = TriggerBuilder.Create()
                .WithCronSchedule(corn)//每一小时执行一次
                .Build();
                _sched.ScheduleJob(job, CronTrigger);
                _sched.Start();
            }
            catch (Exception ex)
            {
                log.Info("Error:" + ex.ToString());
            }

        }

        public void Stop()
        {
            _sched.Shutdown(true);
        }
    }
}

三、Quartz 中corn 介绍:

string corn = "0 0 0/1 * * ? "

3.1、Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

               字段名                 允许的值                        允许的特殊字符  
               秒                         0-59                               , - * /  
               分                         0-59                               , - * /  
               小时                     0-23                               , - * /  
               日                         1-31                               , - * ? / L W C  
               月                         1-12 or JAN-DEC         , - * /  
               周几                     1-7 or SUN-SAT           , - * ? / L C #  
               年 (可选字段)     empty, 1970-2099      , - * /

 

               “?”字符:表示不确定的值

               “,”字符:指定数个值

               “-”字符:指定一个值的范围

               “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

               “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

               “W”字符:指定离给定日期最近的工作日(周一到周五)

               “#”字符:表示该月第几个周X。6#3表示该月第3个周五

3.2、Cron表达式范例:

                 每隔5秒执行一次:*/5 * * * * ?

                 每隔1分钟执行一次:0 */1 * * * ?

                 每天23点执行一次:0 0 23 * * ?

                 每天凌晨1点执行一次:0 0 1 * * ?

                 每月1号凌晨1点执行一次:0 0 1 1 * ?

                 每月最后一天23点执行一次:0 0 23 L * ?

                 每周星期天凌晨1点实行一次:0 0 1 ? * L

                 在26分、29分、33分执行一次:0 26,29,33 * * * ?

                 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

3.3、Cron 生成网站,(程序员都爱偷懒 QAQ)

http://jason.hahuachou.com/cron/index.htm


四、接下来任务调度需要实现Quartz 中的Ijob接口,

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

namespace AccountControlService
{
    class UpdateAccountStateJob:IJob
    {
        private readonly static log4net.ILog log = log4net.LogManager.GetLogger(typeof(UpdateAccountStateJob));
        public void Execute(IJobExecutionContext context)
        {
            log.Info("begin Job and DateTime is "+DateTime.Now.ToString("yyyy-MM-dd  HH:mm:ss"));
            // to do something;
            log.Info("End Job and DateTime is " + DateTime.Now.ToString("yyyy-MM-dd  HH:mm:ss"));
        }
    }
}

接下来我们把任务部署就大功告成了。


另附上Quartz下载地址:http://grepcode.com/snapshot/repo1.maven.org/maven2/org.quartz-scheduler/quartz/1.7.3

猜你喜欢

转载自my.oschina.net/u/2430726/blog/488625