net利用quartz任务调度,开发Job管理系统一

来源:互联网 发布:打开key的软件 编辑:程序博客网 时间:2024/04/25 08:55

.net利用quartz任务调度,开发Job管理系统一

  一、背景

一个庞大的系统,往往会被拆分成很多独立的子系统。每个系统都有着其独特的业务逻辑。如果说一个系统就是一个人,那么各个子系统就是人的器官,而数据就是血与肉将,通过数据的交互将各个独立系统贯穿成一个完整的系统。但是各个系统的数据通讯,并不能像我们想象中的那么通畅,特别是在数据量特别大的时候,或者说当其中有个系统故障了,导致无法正常传输数据。或者说我们想在业务主流程之外,想做一些定时的辅助功能,比如定时的数据查询;定时的触发一些事件。执行这些定时辅助功能需要开销一定的系统资源,我们不能把这些功能放在主流程上执行,因为会消耗大量的系统性能。所以就需要创建一些独立于主流程的后台任务,利用这些任务来执行辅助功能,当然也就需要一个统筹管理的一个系统——Job管理系统。

二、系统概述


建立一个后台管理系统,用于管理Job方法所在的命名空间、类名,方法名;JOB定时触发条件;查看当前JOB的活动状态;下一次的执行时间等。当开发创建写了一个辅助功能,比如数据查询,由核心类将这个方法添加到一个发布者的委托队列中。由quartz调用委托队列,向订阅者发布消息。那么我们只需要往后台添加一条记录,记录包括job(发布者)的命名空间、类名、方法名,以及相关的调用规则(比如一分钟调用一次)。以便quartz能够按照指定的规则动态调用委托来触发事件。

三、详细设计(待更新)

3.1 数据库字段设计
字段名称字段类型备注JobIDint主键JobNamevarchar(100)job命名空间+类名;例如(JobService.Job)JobMethodvarchar(100)job方法名JobNickNamevarchar(100)job中文名称JobRegulavarchar(100)job触发规则JobFlagtinyintjob状态JobCreatornvarchar(100)创建者JobCreateTimedatetime创建时间JobRowStatustinyint行状态JobGroupvarchar(100)job所在组默认为default组

3.2代码设计

    /// <summary>    /// 任务托管方法    /// </summary>    public delegate void ExecteDelegate();    /// <summary>    /// 任务类,实现IJob接口    /// </summary>    class JobCore : IJob    {        private static readonly List<ExecteDelegate> objDelegateList = new List<ExecteDelegate>();        private static readonly Hashtable objJobHashTable = new Hashtable();        public JobCore()        {        }        public JobCore(ExecteDelegate jobDelegate)        {            objDelegateList.Add(jobDelegate);        }        public JobCore(ExecteDelegate objJobDelegate, string strJobExeName, string strJobGroupName)        {            //去掉重复的            if (objJobHashTable.Contains(strJobExeName + strJobGroupName))            {                objJobHashTable.Remove(strJobExeName + strJobGroupName);            }            objJobHashTable.Add(strJobExeName + strJobGroupName, objJobDelegate);        }        /// <summary>        /// 增加必执行delegate        /// </summary>        /// <param name="jobDelegate">job方法委托</param>        public static void AddJobDelegate(ExecteDelegate objJobDelegate)        {            objDelegateList.Add(objJobDelegate);        }        /// <summary>        /// 增加带group的job的delegate        /// </summary>        /// <param name="jobDelegate">job方法委托</param>        public static void AddJobDelegate(ExecteDelegate objJobDelegate, string strJobExeName, string strJobGroupName)        {            objJobHashTable.Add(strJobExeName + strJobGroupName, objJobDelegate);        }        /// <summary>        /// 实现IJob接口的Execute方法.        /// </summary>        /// <param name="objJobExeContext">job执行上下文.</param>        public void Execute(JobExecutionContext objJobExeContext)        {            //必执行的job            foreach (ExecteDelegate ed in objDelegateList)            {                ed();            }            //争对不同的group的job执行            foreach (object key in objJobHashTable.Keys)            {                if (key.ToString() == objJobExeContext.JobDetail.Name + objJobExeContext.JobDetail.Group)                {                    try                    {                        ((ExecteDelegate)objJobHashTable[key])();                    }                    catch                    {                    }                }            }        }


/// <summary>    /// 任务管理器    /// </summary>    public class SchedulerManager    {        private static SchedulerManager scheduler;        private static readonly object ObjLock = new object();        private readonly IScheduler _scheduler;        private static string _defaultJobGroup = "DefaultJobGroup";        private static string _defaultTrigerGroup = "DefaultJobGroup";        public static string DefaultJobGroup        {            get            {                return _defaultJobGroup;            }        }        public IScheduler Scheduler        {            get            {                return _scheduler;            }        }        /// <summary>        /// 构建单例        /// </summary>        public static SchedulerManager Instance        {            get            {                if (scheduler == null)                {                    lock (ObjLock)                    {                        if (scheduler == null)                        {                            return scheduler = new SchedulerManager();                        }                    }                }                return scheduler;            }        }        private SchedulerManager()        {            ISchedulerFactory sf = new StdSchedulerFactory();            _scheduler = sf.GetScheduler();        }        /// <summary>        /// Add Job        /// </summary>        /// <param name="jobDetail">Conveys the detail properties of a given IJob instance</param>        private void AddJob(JobDetail jobDetail)        {            _scheduler.AddJob(jobDetail, true);        }        /// <summary>        /// 增加job        /// </summary>        /// <param name="ed">job委托</param>        /// <param name="jobname">job名字.</param>        public void AddJob(ExecteDelegate ed, string jobname)        {            JobAgent ja = new JobAgent(ed, jobname, _defaultJobGroup);            AddJob(typeof(JobAgent), jobname);        }        /// <summary>        /// Create a JobDetail  with the given name, and group, and the default settings of all the other properties.         /// </summary>        /// <param name="jobtype">a given IJob instance's type</param>        /// <param name="jobname">the given name</param>        private void AddJob(Type jobtype, string jobname)        {            JobDetail jobdetail = new JobDetail(jobname, _defaultJobGroup, jobtype);            AddJob(jobdetail);        }        /// <summary>        /// 增加CronTrigger        /// </summary>        /// <param name="trigerName">triger名字</param>        /// <param name="jobName">job名字</param>        /// <param name="regCron">triger cron如:0/50 * * * * ?</param>        public void AddCronTrigger(string trigerName, string jobName, string regCron)        {            AddTrigger(new CronTrigger(trigerName, _defaultTrigerGroup, jobName, _defaultJobGroup, regCron));        }        /// <summary>        /// 应用于转换trigger        /// </summary>        /// <param name="trigerName">Name of the triger.</param>        /// <param name="jobName">Name of the job.</param>        /// <param name="regCron">The reg cron.</param>        /// <param name="ed">The ed.</param>        public void AddCronTriggerJob(string trigerName, string jobName, string regCron, ExecteDelegate ed)        {            //切换trigger            _scheduler.UnscheduleJob(trigerName, _defaultTrigerGroup);            AddJob(ed, jobName);            AddTrigger(new CronTrigger(trigerName, _defaultTrigerGroup, jobName, _defaultJobGroup, regCron));        }        /// <summary>        /// 停止一个任务.        /// </summary>        /// <param name="trigerName">Name of the triger.</param>        public void UnscheduleJob(string trigerName)        {            _scheduler.UnscheduleJob(trigerName, _defaultTrigerGroup);        }        private void AddTrigger(Trigger trigger)        {            _scheduler.ScheduleJob(trigger);        }        private void AddScheduleJob(JobDetail jobDetail, Trigger trigger)        {            _scheduler.ScheduleJob(jobDetail, trigger);        }        /// <summary>        /// 开始计划任务        /// </summary>        public void Start()        {            if (!_scheduler.IsStarted)            {                _scheduler.Start();            }        }        /// <summary>        /// 关闭计划任务        /// </summary>        public void ShutDown()        {            if (!_scheduler.IsShutdown)            {                _scheduler.Shutdown(true);            }        }        /// <summary>        /// 暂停计划任务        /// </summary>        public void PauseAll()        {            _scheduler.PauseAll();        }        /// <summary>        /// 重启计划任务        /// </summary>        public void ResumeAll()        {            _scheduler.ResumeAll();        }        /// <summary>        /// 暂停Job        /// </summary>        /// <param name="jobname"></param>        public void PauseJob(string jobname)        {            _scheduler.PauseJob(jobname, _defaultJobGroup);        }        /// <summary>        /// 重启Job        /// </summary>        /// <param name="jobname"></param>        public void ResumeJob(string jobname)        {            _scheduler.ResumeJob(jobname, _defaultJobGroup);        }    }


    /// <summary>    ///  接口    /// </summary>    /// <typeparam name="TEntity"></typeparam>    public interface IJobService<TEntity>    {        /// <summary>        /// 加载Job        /// </summary>        /// <param name="strNeedStartJobName"></param>        void LoadJobs(string strNeedStartJobName = "");        /// <summary>        /// 停止Job        /// </summary>        /// <param name="strStopJobName"></param>        void StopJob(string strStopJobName = "");        /// <summary>        /// 重启Job        /// </summary>        /// <param name="strResumeJobName"></param>        void ResumeJob(string strResumeJobName = "");        /// <summary>        /// 修改Job        /// </summary>        /// <param name="objNeedEditJob"></param>        /// <returns></returns>        bool ModifyJobData(TEntity objNeedEditJob);        /// <summary>        /// 添加Job        /// </summary>        /// <param name="objNeedEditJob"></param>        void AddJobData(TEntity objNeedEditJob);        /// <summary>        /// 获取数据集合        /// </summary>        /// <returns></returns>        List<TEntity> GetJobList();    }



0 0
原创粉丝点击