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

1 PlugInJobExample

  1. using System;
  2. using System.Collections.Specialized;
  3. using System.Threading;
  4. using Common.Logging;
  5. using Quartz;
  6. using Quartz.Impl;
  7. using Quartz.Job;
  8. using System.Windows.Forms;
  9.  
  10. namespace QuartzDemo
  11. {
  12. public class PlugInJobExample
  13. {
  14. public string Name
  15. {
  16. get { return GetType().Name; }
  17. }
  18.  
  19. public virtual IScheduler Run()
  20. {
  21.  
  22. var properties = new NameValueCollection();
  23. properties["quartz.plugin.triggHistory.type"] = "Quartz.Plugin.History.LoggingJobHistoryPlugin";
  24. properties["quartz.plugin.jobInitializer.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin";
  25. //配置文件名称
  26. properties["quartz.plugin.jobInitializer.fileNames"] = "quartz_jobs.xml";
  27. properties["quartz.plugin.jobInitializer.failOnFileNotFound"] = "true";
  28. //每隔120秒进行探查,看配置文件是否更改
  29. properties["quartz.plugin.jobInitializer.scanInterval"] = "";
  30.  
  31. // 用插件XML定义的propertie来实例化一个ISchedulerFactory
  32. ISchedulerFactory sf = new StdSchedulerFactory(properties);
  33. IScheduler sched = sf.GetScheduler();
  34.  
  35. //启动
  36. sched.Start();
  37. //返回
  38. return sched;
  39.  
  40. }
  41. }
  42. }

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 > )
  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图片)

Quartz.NET开源作业调度框架系列(四):Plugin Job的更多相关文章

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

    如果在Quartz.NET作业运行时我们想动态修改Job和Trigger的绑定关系,同时修改一些参数那么该怎么办呢?Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的 ...

  2. Quartz.NET开源作业调度框架系列

    Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...

  3. Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递

    前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...

  4. Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转

    前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...

  5. Quartz.NET开源作业调度框架系列(一):快速入门step by step

    Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...

  6. Quartz.NET开源作业调度框架系列(一):快速入门step by step-转

    Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...

  7. Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库

    Quartz.NET 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger(用于定义调度时间的元素,即按照什么时间规则去执行任务) 和 job 是任务调度的元数 ...

  8. Quartz.NET开源作业调度框架系列(二):CronTrigger

    CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...

  9. Quartz.NET开源作业调度框架系列(二):CronTrigger-转

    CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...

随机推荐

  1. 快速入门系列--TSQL-01基础概念

    作为一名程序员,对于SQL的使用算是基础中的基础,虽然也写了很多年的SQL,但常常还是记不清一些常见的命令,故而通过一篇博文巩固相关的记忆,并把T-SQL本身的一些新特性再进行一次学习. 首先回顾基础 ...

  2. 支持自动切换的tab标签代码札记

    html代码如下: <!-- tab标签代码begin --> <div class="tab1" id="tab1"> <div ...

  3. WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Che ...

  4. 邻接表有向图(二)之 C++详解

    本章是通过C++实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...

  5. Example of ApplicationContextAware in Spring--转

    原文地址:http://www.concretepage.com/spring/example_applicationcontextaware_spring In spring we can get ...

  6. JAVA 设计模式 适配器模式

    用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式是一种结构型模式. 结构

  7. SQL Server代理(7/12):作业活动监视器

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的前几篇文章里,你创建配置了SQ ...

  8. Django之Form、CSRF、cookie和session

    Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...

  9. 记一个同时支持模糊匹配和静态推导的Atom语法补全插件的开发过程: 序

    简介 过去的一周,都睡的很晚,终于做出了Atom上的APICloud语法提示与补全插件:apicloud_autocomplete.个中滋味,感觉还是有必要记录下来的.代码基于 GPL-3.0 开源, ...

  10. Java中不同转换符实现不同数据类型到字符串的转换

    String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重载形式. form ...