通过配置文件调度Quartz.NET,并构建Job工厂的实现方式
大家都知道Quartz.Net目前支持通过XML配置Job以及Trigger列表,但是可能还有很多同学对于Job的处理仍然需要写很多实现IJob接口的实现类,似乎显得不雅。
我们实际上可以通过Job Data Map,获取Job真正所需调用的Assembly以及Type。
我的示例XML如下:
1
<?xml version="1.0" encoding="utf-8" ?>2
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData"3
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4
version="1.0"5
overwrite-existing-jobs="true">6
<!--Thread Demo job-->7
<job>8
<job-detail>9
<name>SimpleThreadJob</name>10
<group>SimpleThreadGroup</group>11
<job-type>MorningStar.Demo.NeverStop.AllServerJob, MorningStar.Demo.NeverStop</job-type>12
<job-data-map>13
<entry>14
<key>execution assembly</key>15
<value>MorningStar.Demo.ThreadSample</value>16
</entry>17
<entry>18
<key>execution servicename</key>19
<value>MorningStar.Demo.ThreadSample.ThreadSample</value>20
</entry>21
</job-data-map>22
</job-detail>23
<trigger>24
<simple>25
<name>SimpleThreadTrigger</name>26
<group>TriggerGroup</group>27
<job-name>SimpleThreadJob</job-name>28
<job-group>SimpleThreadGroup</job-group>29
<start-time>2007-12-09T18:08:50</start-time>30
<!--Run only once-->31
<repeat-count>0</repeat-count>32
<!--repeat every 2 minutes-->33
<repeat-interval>120000</repeat-interval>34
</simple>35
</trigger>36
</job>37
</quartz>大家都看出来了,MorningStar.Demo.NeverStop.AllServerJob是实现了IJOB的实现类,该类的实现如下:
1

/**//******************Service Scheduler Factory****************2
******************Creater:Blade He*************************3
******************Creater Date:2009-09-04******************4
*/ 5
using System;6
using System.Collections.Generic;7
using System.Linq;8
using System.Text;9
using Quartz;10
using Common.Logging;11
using System.Reflection;12
using FastReflectionLib;13

14
namespace MorningStar.Demo.NeverStop15


{16
public class AllServerJob:IJob17

{18
private static ILog _log = LogManager.GetLogger(typeof(AllServerJob));19
// parameter names specific to this job20
public const string EXECUTION_SERVICENAME = "execution servicename";21
public const string EXECUTION_ASSEMBLY = "execution assembly";22

23
public AllServerJob() 24

{ 25
}26

27

IJob Members#region IJob Members28
public void Execute(JobExecutionContext context)29

{30
31
try32

{33
string jobName = context.JobDetail.FullName;34
_log.Info(string.Format("---{0} executing at {1}", jobName, DateTime.Now.ToString("r")));35
JobDataMap data = context.JobDetail.JobDataMap;36

37
//Get Service Assembly And Service Type38
string serviceAssemblyName = data.GetString(EXECUTION_ASSEMBLY);39
string serviceTypeName = data.GetString(EXECUTION_SERVICENAME);40
Assembly assembly = Assembly.Load(serviceAssemblyName);41
Type type = assembly.GetType(serviceTypeName);42
MethodInfo method = type.GetMethod("StartProcess");43
Object obj = System.Activator.CreateInstance(type);44

45
//Fast Invoke,Keep good performance46
method.FastInvoke(obj, null);47
_log.Info(string.Format("---{0} completed at {1}", jobName, DateTime.Now.ToString("r")));48
}49
catch (Exception ex)50

{51
SimpleTrigger trigger = ((Quartz.SimpleTrigger)(context.Trigger));52

53
//If RepeatCount equals 1,then Refire immediately!54
if (trigger.RepeatCount == 0)55

{56
JobExecutionException jobException = new JobExecutionException(ex);57
// this job will refire immediately58
jobException.UnscheduleFiringTrigger = true;59
jobException.RefireImmediately = true;60
throw jobException;61
}62
else63

{64
_log.Info("--- Error in job!");65
_log.Error(String.Format("Date:{0} ErrorInfo:{1},StackTrace:{2} ", DateTime.Now.ToString(),66
ex.Message, ex.StackTrace));67
}68
}69

70
71
}72
#endregion73
}74
}75

其中EXECUTION_SERVICENAME以及EXECUTION_ASSEMBLY,这两个字符串常量的值,即对应着配置XML文件中的Assembly以及Type的描述。
之后,就可以用工厂模式,运行各自所需要运行的Job了。

浙公网安备 33010602011771号