如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在xml文件中对Job和Trigger的参数进行配置,然后定期去加载配置文件来实例化任务和Trigger,这样就解决了此类问题.
using System;using System.Collections.Specialized;using System.Threading;using Common.Logging;using Quartz;using Quartz.Impl;using Quartz.Job;using System.Windows.Forms;namespace QuartzDemo{ public class PlugInJobExample { public string Name { get { return GetType().Name; } } public virtual IScheduler Run() { var PRoperties = new NameValueCollection(); properties["quartz.plugin.triggHistory.type"] = "Quartz.Plugin.History.LoggingJobHistoryPlugin"; properties["quartz.plugin.jobInitializer.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin"; //配置文件名称 properties["quartz.plugin.jobInitializer.fileNames"] = "quartz_jobs.xml"; properties["quartz.plugin.jobInitializer.failOnFileNotFound"] = "true"; //每隔120秒进行探查,看配置文件是否更改 properties["quartz.plugin.jobInitializer.scanInterval"] = "120"; // 用插件XML定义的propertie来实例化一个ISchedulerFactory ISchedulerFactory sf = new StdSchedulerFactory(properties); IScheduler sched = sf.GetScheduler(); //启动 sched.Start(); //返回 return sched; } }}
1 using System; 2 using System.Collections.Generic; 3 4 using Common.Logging; 5 using Quartz; 6 using Quartz.Impl; 7 using Quartz.Job; 8 using System.Windows.Forms; 9 namespace QuartzDemo10 {11 12 public class SimpleJob1 : IJob13 {14 15 public virtual void Execute(IJobExecutionContext context)16 {17 JobKey jobKey = context.JobDetail.Key;18 if (isOpen("FrmConsole"))19 {20 try21 {22 //获取当前Form1实例23 __instance = (FrmConsole)application.OpenForms["FrmConsole"];24 //获取当前执行的线程ID25 __instance.SetInfo(" - "+jobKey + "Thread ID " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());26 27 //通过方法更新消息28 __instance.SetInfo(string.Format(" - {0} exec at {1}",29 jobKey,30 System.DateTime.Now.ToString()));31 32 }33 catch (Exception ex)34 {35 Console.WriteLine(ex.Message);36 }37 }38 // This job simply prints out its job name and the39 40 if (context.MergedJobDataMap.Count > 0)41 {42 ICollection<string> keys = context.MergedJobDataMap.Keys;43 foreach (string key in keys)44 {45 String val = context.MergedJobDataMap.GetString(key);46 __instance.SetInfo(string.Format(" - MergedJobDataMap entry: {0} = {1}", key, val));47 48 }49 }50 context.Result = "exec ok";51 }52 53 private static FrmConsole __instance = null;54 55 /// <summary>56 /// 判断窗体是否打开57 /// </summary>58 /// <param name="appName"></param>59 /// <returns></returns>60 private bool isOpen(string appName)61 {62 FormCollection collection = Application.OpenForms;63 foreach (Form form in collection)64 {65 if (form.Name == appName)66 {67 return true;68 }69 }70 return false;71 }72 }73 }
下面第一个是简单的Trigger配置,第二个是用CronTrigger:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 version="2.0"> 6 7 <processing-directives> 8 <overwrite-existing-data>true</overwrite-existing-data> 9 </processing-directives>10 11 <schedule>12 13 <job>14 <name>jobName1</name>15 <group>jobGroup1</group>16 <description>jobDesciption1</description>17 <job-type>QuartzDemo.SimpleJob1, QuartzDemo</job-type>18 <durable>true</durable>19 <recover>false</recover>20 <job-data-map>21 <entry>22 <key>key0</key>23 <value>value0</value>24 </entry>25 <entry>26 <key>key1</key>27 <value>value1</value>28 </entry>29 <entry>30 <key>key2</key>31 <value>value2</value>32 </entry>33 </job-data-map>34 </job>35 36 <trigger>37 <simple>38 <name>simpleName</name>39 <group>simpleGroup</group>40 <description>SimpleTriggerDescription</description>41 <job-name>jobName1</job-name>42 <job-group>jobGroup1</job-group>43 <start-time>2015-12-02T10:15:00.0Z</start-time>44 <end-time>2020-05-04T18:13:51.0Z</end-time>45 <misfire-instruction>SmartPolicy</misfire-instruction>46 <repeat-count>100</repeat-count>47 <repeat-interval>1000</repeat-interval>48 </simple>49 </trigger>50 51 </schedule>52 53 </job-scheduling-data>
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 version="2.0"> 6 7 <processing-directives> 8 <overwrite-existing-data>true</overwrite-existing-data> 9 </processing-directives>10 <schedule>11 <job>12 <name>SimpleJob1</name>13 <group>myJobGroup1</group>14 <description>SimpleJob1</description>15 <job-type>QuartzDemo.SimpleJob1, QuartzDemo</job-type>16 <durable>true</durable>17 <recover>false</recover>18 <job-data-map>19 <entry>20 <key>author</key>21 <value>jackwangcumt</value>22 </entry>23 <entry>24 <key>blog</key>25 <value>isaboy</value>26 </entry>27 <entry>28 <key>jobType</key>29 <value>XML Plugin Job</value>30 </entry>31 </job-data-map>32 </job>33 <trigger>34 <cron>35 <name>trigger1</name>36 <group>myTriggerGroup</group>37 <job-name>SimpleJob1</job-name>38 <job-group>myJobGroup1</job-group>39 <cron-expression>0/2 * * * * ?</cron-expression>40 </cron>41 </trigger>42 </schedule>43 </job-scheduling-data>
(可以将下图在另一个页签打开,看无压缩GIF图片)
新闻热点
疑难解答