程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Quartz.NET開源作業調度框架系列(四):Plugin Job,quartz.netplugin

Quartz.NET開源作業調度框架系列(四):Plugin Job,quartz.netplugin

編輯:C#入門知識

Quartz.NET開源作業調度框架系列(四):Plugin Job,quartz.netplugin


  如果在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 效果

 (可以將下圖在另一個頁簽打開,看無壓縮GIF圖片)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved