zoukankan      html  css  js  c++  java
  • 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 效果

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

  • 相关阅读:
    LINQ学习(1)
    [转]键盘上的标点符号的中英文名称对照表
    微信Android ANR原理解析及解决方案
    IOS错误日志抓取和分析
    蚂蚁金服测开面试题--转账功能
    MySQL CONV()函数
    分页功能
    在alert里面加入一个页面,子页面传值父页面
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; che
    缘起 网络编程
  • 原文地址:https://www.cnblogs.com/isaboy/p/quartz_net_plugin_job.html
Copyright © 2011-2022 走看看