net利用quartz任务调度,开发Job管理系统一
来源:互联网 发布:打开key的软件 编辑:程序博客网 时间:2024/04/25 08:55
.net利用quartz任务调度,开发Job管理系统一
一、背景
一个庞大的系统,往往会被拆分成很多独立的子系统。每个系统都有着其独特的业务逻辑。如果说一个系统就是一个人,那么各个子系统就是人的器官,而数据就是血与肉将,通过数据的交互将各个独立系统贯穿成一个完整的系统。但是各个系统的数据通讯,并不能像我们想象中的那么通畅,特别是在数据量特别大的时候,或者说当其中有个系统故障了,导致无法正常传输数据。或者说我们想在业务主流程之外,想做一些定时的辅助功能,比如定时的数据查询;定时的触发一些事件。执行这些定时辅助功能需要开销一定的系统资源,我们不能把这些功能放在主流程上执行,因为会消耗大量的系统性能。所以就需要创建一些独立于主流程的后台任务,利用这些任务来执行辅助功能,当然也就需要一个统筹管理的一个系统——Job管理系统。
二、系统概述
建立一个后台管理系统,用于管理Job方法所在的命名空间、类名,方法名;JOB定时触发条件;查看当前JOB的活动状态;下一次的执行时间等。当开发创建写了一个辅助功能,比如数据查询,由核心类将这个方法添加到一个发布者的委托队列中。由quartz调用委托队列,向订阅者发布消息。那么我们只需要往后台添加一条记录,记录包括job(发布者)的命名空间、类名、方法名,以及相关的调用规则(比如一分钟调用一次)。以便quartz能够按照指定的规则动态调用委托来触发事件。
三、详细设计(待更新)
3.1 数据库字段设计
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
- net利用quartz任务调度,开发Job管理系统一
- 采用开发框架quartz调度管理Job
- ASP.NET MVC 5实现基于Quartz.net 的任务调度管理平台(一)
- Quartz 调度,添加,修改,删除 任务,Job
- 任务调度(Quartz Enterprise Job Scheduler)
- 任务调度(Quartz Enterprise Job Scheduler)
- Quartz Job & Spring 动态任务调度
- Quartz.net基于数据库的任务调度管理(Only.Jobs)
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一
- Quartz.NET 任务调度框架
- 任务调度框架 Quartz.NET
- Quartz.NET 任务调度框架
- 一、Quartz任务调度--单机
- spring3与 quartz job 任务调度的整合
- windows定时计划任务管理系统quartz.net的使用
- Quartz.net 在应用程序中统一调度各任务,Config文件配置所有的任务项
- ASP.NET MVC 5 实现基于Quartz.net 的任务调度管理平台(二)
- ASP.NET MVC 5 实现基于Quartz.net 的任务调度管理平台(三)
- android之实现各个组件点击事件处理
- mysql commond
- fstream::good
- 安卓互联网恶意软件危害用户
- hist()R 直方图
- net利用quartz任务调度,开发Job管理系统一
- printf("%x.yf",n)
- 360和baidu的战争号角再次吹响
- 浏览器关闭之后session对象还存在吗
- 王爽汇编语言学习笔记(二)--寄存器
- LeetCode Two Sum
- IP协议详解之二:深入理解IP路由选择过程
- Android多线程界面更新方法的总结
- Saas模式的优势和缺点总结