Quartz.NET开源作业调度框架系列(四):Plugin Job

  如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的参数进行配置,然后定期去加载配置文件来实例化任务和Trigger,这样就解决了此类问题.

1 PlugInJobExample

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; } } }

2 SimpleJob1

 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 QuartzDemo 10 { 11 
12     public class SimpleJob1 : IJob 13  { 14       
15         public virtual void Execute(IJobExecutionContext context) 16  { 17             JobKey jobKey = context.JobDetail.Key; 18             if (isOpen("FrmConsole")) 19  { 20                 try
21  { 22                     //获取当前Form1实例
23                     __instance = (FrmConsole)Application.OpenForms["FrmConsole"]; 24                     //获取当前执行的线程ID
25                     __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 the
39 
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 }

3 xml配置文件

下面第一个是简单的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>

 4 效果

Quartz.NET开源作业调度框架系列(四):Plugin Job_第1张图片

 (可以将下图在另一个页签打开,看无压缩GIF图片)

你可能感兴趣的:(Quartz.NET开源作业调度框架系列(四):Plugin Job)