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建表脚本:
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
(#换成@)。