你的位置:首页 > 软件开发 > ASP.net > Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库

Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库

发布时间:2015-12-04 08:00:07
Quartz.NET 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger(用于定义调度时间的元素,即按照什么时间规则去执行任务) 和 job 是任务调度的元数据,scheduler 是实际执行调度的控制器。在Quartz.NET中主要有两 ...

  Quartz.NET 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger(用于定义调度时间的元素,即按照什么时间规则去执行任务) 和 job 是任务调度的元数据,scheduler 是实际执行调度的控制器。在Quartz.NET中主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。无状态任务一般指可以并发的任务,即任务之间是独立的,不会互相干扰。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。某些任务需要对数据库中的数据进行增删改处理 , 这些任务不能并发执行,就需要用到无状态的任务 , 否则会造成数据混乱。

  另外有些情况下,我们需要将任务保存到数据库中,特别是有些任务中包含参数,例如累加的任务,如果可以保存到数据库中,即便中间断电或者程序异常重启,中间计算的结果也不会丢失,可以从断点的结果进行运算(首先恢复任务),下面介绍一下如何用AdoJobStore将任务保存到SQL Server数据库中. 

  事先要在数据库上新建一个QRTZ_数据库,并执行SQL建表脚本:

Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库

1 RecoveryJob

  是一个无状态的任务,代码如下:

 1 using System; 2 using System.Collections.Specialized; 3 using System.Threading; 4 using Common.Logging; 5 using Quartz; 6 using Quartz.Impl; 7 using Quartz.Job; 8 using System.Windows.Forms; 9 namespace QuartzDemo10 {11   /// <summary>12   /// 无状态的可恢复的任务13   /// </summary>14   public class RecoveryJob : IJob15   {16    17     private const get='_blank'>string Count = "count";18     public virtual void Execute(IJobExecutionContext context)19     {20 21       JobKey jobKey = context.JobDetail.Key;22       if (isOpen("FrmConsole"))23       {24         try25         {26           //获取当前Form1实例27           __instance = (FrmConsole)Application.OpenForms["FrmConsole"];28           // 如果任务是恢复的任务的话29           if (context.Recovering)30           {31             __instance.SetInfo(string.Format("{0} RECOVERING at {1}", jobKey, DateTime.Now.ToString("r")));32           }33           else34           {35             __instance.SetInfo(string.Format("{0} starting at {1}", jobKey, DateTime.Now.ToString("r")));36           }37 38           JobDataMap data = context.JobDetail.JobDataMap;39           int count;40           if (data.ContainsKey(Count))41           {42             //是否能从数据库中恢复,如果保存Job等信息的话,程序运行突然终端(可用调试时中断运行,而不是关闭窗体来模拟)43             count = data.GetInt(Count);44           }45           else46           {47             count = 0;48           }49           count++;50           data.Put(Count, count);51 52           __instance.SetInfo(string.Format(" {0} Count #{1}", jobKey, count));53         }54         catch (Exception ex)55         {56           Console.WriteLine(ex.Message);57         }58       }59     }60 61 62     private static FrmConsole __instance = null;63 64     /// <summary>65     /// 判断窗体是否打开66     /// </summary>67     /// <param name="appName"></param>68     /// <returns></returns>69     private bool isOpen(string appName)70     {71       FormCollection collection = Application.OpenForms;72       foreach (Form form in collection)73       {74         if (form.Name == appName)75         {76           return true;77         }78       }79       return false;80     }81 82   }83 }

原标题:Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。