• 开源作业调度框架


    简介:

    第一步:下载Quartz.NET

     下载Quartz.NET只需要打开网址选择适宜的版本进行下载解压缩即可。

    目前最新版本是2.3.3,压缩包为6MB,不过鉴于国内网速。我还是加一下博客园的下载链接会快一些。

    下载链接:sourceforge 

    站内下载:cnblogs 

    第二步:添加到项目中

     在VS中添加引用以下三个dll

    Quartz.NET-2.3.3in4.0 eleaseQuartzCommon.Logging.Core.dll
    Quartz.NET-2.3.3in4.0 eleaseQuartzCommon.Logging.dll
    Quartz.NET-2.3.3in4.0 eleaseQuartzQuartz.dll

    第三步:如何使用

        一些最基本最常用类、接口和方法,知道了这些接口和类,可以满足一般的调度作业

    //该接口为主要的调度者,
    Quartz.IScheduler
    
    //该类用于获取调度者对象
    Quartz.Impl.StdSchedulerFactory  
    
    //该类用于存储IJobDetail的唯一ID
    Quartz.JobKey
    
    //每个具体作业的实例对象
    Quartz.IJobDetail
    
    //存储一个作业所需要的一些参数。
    Quartz.JobDataMap
    
    //用于构建IJobDetail实例
    Quartz.JobBuilder
    
    //触发规则接口
    Quartz.ITrigger
    
    //用于构建Itrigger实例
    Quartz.TriggerBuilder

    //作业接口,每种作业均需要实现该接口
    Quartz.IJob

    现在是一个基本的代码

    首先我们必须先实现IJob接口来完成一个具体作业的类。

    using Quartz;
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Web;
    
    namespace Scheduler.Jobs
    {
        /// <summary>
        /// 计算报表作业类
        /// </summary>
        public class Report : IJob
        {
            public Report()
            {
            }
    
            //当调度对象发现该作业满足Itrigger的规则时都会调用本方法
            public void Execute(IJobExecutionContext context)
            {
                //从上下文对象(Context)中获取作业的运行参数JobDataMap,该对象中保存字典对象
                JobDataMap jobData = context.JobDetail.JobDataMap;
                
                //具体读取参数,使用Key来获取。
                string modid = jobData["modid"].ToString();
                string type = jobData["type"].ToString();
                string cron = jobData["cron"].ToString();
                string date1 = jobData["date1"].ToString();
                string date2 = jobData["date2"].ToString();
                string[] date1Arr = date1.Split(new char[] { ' ' });
                string[] date2Arr = date2.Split(new char[] { ' ' });
    
                //具体实现代码blablablalbla
                int newId = sys_report.CreateReport(modid, begin, end, "");
    
                sys_report.Run(newId);
            }
        }
    }
    using Quartz;
    using Quartz.Impl;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Web;
    
    public class QuartzManager
    {
        private static QuartzManager instance;
        private IScheduler scheduler = null;
    
        private QuartzManager()
        {
            //初始化调度对象,使用单例模式避免多次初始化
            
            //获取一个默认的调度对象
            scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
        }
    
        public static QuartzManager GetInstance()
        {
            if (instance == null)
            {
                instance = new QuartzManager();
            }
            return instance;
        }
    
        /// <summary>
        /// 初始化或变更已定时生成报表的计划。
        /// </summary>
        public void LoadReport()
        {
            string sqlstr = "SQL";
    
            DataTable dt = db.getdataset(sqlstr).Tables[0];
    
            foreach (DataRow dr in dt.Rows)
            {
                string id = dr["id"].ToString();
                string type = dr["type"].ToString();
                string cron = dr["cron"].ToString();
                string date1 = dr["date1"].ToString();
                string date2 = dr["date2"].ToString();
                string identity = "reportTime" + id;
    
                //实例化一个作业Key对象,用于获取作业对象或判断是否存在作业时使用。
                JobKey jobKey = new JobKey(identity);
    
                //通过作业Ke对象 获取已经添加过同一个作业,(如果没有为NULL)
                IJobDetail job = scheduler.GetJobDetail(jobKey);
                
                //检查调度中是否存在该作业,存在并且参数有变化就删除作业。
                if (scheduler.CheckExists(jobKey) && job.JobDataMap["cron"].ToString() != cron)
                {
                    scheduler.DeleteJob(jobKey);
                }
                
                //检查调度中是否存在该作业
                if (scheduler.CheckExists(jobKey)==false)
                {
                    //创建一个字典对象,存储作业执行时传递的必要参数 
                    IDictionary<string, object> dicData = new Dictionary<string, object>();
    
                    //添加作业在运行时需要的一些参数
                    dicData.Add("id", id);
                    dicData.Add("type", type);
                    dicData.Add("cron", cron);
                    dicData.Add("date1", date1);
                    dicData.Add("date2", date2);
    
                    //将存有作业参数的字典添加到JobDataMap中
                    JobDataMap jobData = new JobDataMap(dicData);
    
                    //通过JobBuilder创建一个指定作业实例,通过泛型确定作业的类型
                    //这里要说明是JobBuilder对象使用链式调用的方式进行设置。
                    job = JobBuilder.Create<Scheduler.Jobs.Report>()
                    
                    //设置作业的维一ID
                    .WithIdentity(identity)
                   
                    //将作业参数传入作业对象中
                    .SetJobData(jobData)
                   
                    //构建IJobDetail实例
                    .Build();
     
                    //通过TriggerBuilder创建一个指定触发实例
                    ITrigger trigger = TriggerBuilder.Create()
                    
                    //设置触发实例的ID,设置了ID后可以批量操作同一运行规则的作业。
                    .WithIdentity(identity, identity)
                    
                    //传入Cron表达式字符串,字符串具体内容在下面会有一个说明。
                    .WithCronSchedule(cron)
                    
                    //构建Itrigger实例
                    .Build();
    
                    //添加一个作业,并设置作业实例和触发作业执行规则的实例
                    scheduler.ScheduleJob(job, trigger);
                }
            }
        }
    }

    最后,我们在网站启动时或程序启动时调用并启动调度对象就可以了

    <%@ Application Language="C#" %>
    <script RunAt="server">
        void Application_Start(object sender, EventArgs e)
        {
            QuartzManager.GetInstance().LoadReport();
        }    
        void Application_End(object sender, EventArgs e)
        {
        }
        void Application_Error(object sender, EventArgs e)
        {
        }
        void Session_Start(object sender, EventArgs e)
        {
        }
        void Session_End(object sender, EventArgs e)
        {
        }       
    </script>

    第四步:Cron表达式

     Cron表达式其实是对作业触发规则的一种字符串,它按照一定的规则填写

    字符串的具体格式为

    秒 分钟 小时 日 月 星期 [年]

    每项中间使用一个空格隔开,注意的是 年 参数不是必须填写的。

    其中会用到一些符号来表示

    *  表示任何

    ?  表示不指定

    /  表示周期 符号前和符号后填写数字

    -  表示范围 符号前和符号后填写数字

    ,  表示多个值多个值可以用多个逗号分开

    其它符号:如L  W # 等,

    更详细的Cron表达式就不在写了,博客园已经有很多很详细的说明文章了。

    搜索链接

    更有一些 Web小工具可以在线生成Cron表达式,可以通工小工具快方便的理解Cron表达式

    本文地址

    2016.05.29

  • 相关阅读:
    Laravel update某一字段值为另一字段值
    Layui 批量
    CI 框架多表关联查询
    PHP数组函数
    PHP固定长度字符串
    PHP常用方法汇总
    CI 框架批量添加数据(如果数据库有就更新数据)
    使用nginx-http-concat优化网站响应
    mysql自动化安装
    SQL迁移到ORACLE实例
  • 原文地址:https://www.cnblogs.com/jgjgjg23/p/4071055.html
Copyright © 2020-2023  润新知