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

简介: Quartz.NET提供了插件技术,可以通过在XML文件中对Job和Trigger的参数进行配置,然后定期去加载配置文件来实例化任务和Trigger。

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

1 PlugInJobExample


下面给出一个示例程序,用插件XML定义的propertie来实例化一个ISchedulerFactory,配置文件名称用properties["quartz.plugin.jobInitializer.fileNames"] = "quartz_jobs.xml";语句来进行限定。具体示例代码如下:

usingSystem;
usingSystem.Collections.Specialized;
usingSystem.Threading;
usingCommon.Logging;
usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
usingSystem.Windows.Forms;
namespaceQuartzDemo{
publicclassPlugInJobExample    {
publicstringName        {
get { returnGetType().Name; }
        }
publicvirtualISchedulerRun()
        {
varproperties=newNameValueCollection();
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来实例化一个ISchedulerFactoryISchedulerFactorysf=newStdSchedulerFactory(properties);
ISchedulersched=sf.GetScheduler();
//启动sched.Start();
//返回returnsched;
        }
    }
}

2 SimpleJob1


下面给出一个简单的Job定义,它实现了IJob接口,这里需要实现Execute(IJobExecutionContext context)方法,它可以更新另外一个窗口的相关信息。示例代码如下:

usingSystem;
usingSystem.Collections.Generic;
usingCommon.Logging;
usingQuartz;
usingQuartz.Impl;
usingQuartz.Job;
usingSystem.Windows.Forms;
namespaceQuartzDemo{
publicclassSimpleJob1 : IJob    {
publicvirtualvoidExecute(IJobExecutionContextcontext)
        {
JobKeyjobKey=context.JobDetail.Key;
if (isOpen("FrmConsole"))
            {
try                {
//获取当前Form1实例__instance= (FrmConsole)Application.OpenForms["FrmConsole"];
//获取当前执行的线程ID__instance.SetInfo(" - "+jobKey+"Thread ID "+System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
//通过方法更新消息__instance.SetInfo(string.Format(" - {0} exec at {1}",
jobKey,
System.DateTime.Now.ToString()));
                }
catch (Exceptionex)
                {
Console.WriteLine(ex.Message);
                }
            }
// This job simply prints out its job name and theif (context.MergedJobDataMap.Count>0)
            {
ICollection<string>keys=context.MergedJobDataMap.Keys;
foreach (stringkeyinkeys)
                {
Stringval=context.MergedJobDataMap.GetString(key);
__instance.SetInfo(string.Format(" - MergedJobDataMap entry: {0} = {1}", key, val));
                }
            }
context.Result="exec ok";
        }
privatestaticFrmConsole__instance=null;
/// <summary>/// 判断窗体是否打开/// </summary>/// <param name="appName"></param>/// <returns></returns>privateboolisOpen(stringappName)
        {
FormCollectioncollection=Application.OpenForms;
foreach (Formformincollection)
            {
if (form.Name==appName)
                {
returntrue;
                }
            }
returnfalse;
        }
    }
}

3 xml配置文件


下面第一个是简单的Trigger配置,<repeat-interval>1000</repeat-interval>表示间隔时间为1秒,<repeat-count>100</repeat-count>表示循环次数为100次。第二个用的是CronTrigger进行任务定义,周期使用CronExpression进行限定的,如<cron-expression>0/2 * * * * ?</cron-expression>。相关示例代码如下:

<?xmlversion="1.0" encoding="UTF-8"?><job-scheduling-dataxmlns="http://quartznet.sourceforge.net/JobSchedulingData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.0"><processing-directives><overwrite-existing-data>true</overwrite-existing-data></processing-directives><schedule><job><name>jobName1</name><group>jobGroup1</group><description>jobDesciption1</description><job-type>QuartzDemo.SimpleJob1, QuartzDemo</job-type><durable>true</durable><recover>false</recover><job-data-map><entry><key>key0</key><value>value0</value></entry><entry><key>key1</key><value>value1</value></entry><entry><key>key2</key><value>value2</value></entry></job-data-map></job><trigger><simple><name>simpleName</name><group>simpleGroup</group><description>SimpleTriggerDescription</description><job-name>jobName1</job-name><job-group>jobGroup1</job-group><start-time>2015-12-02T10:15:00.0Z</start-time><end-time>2020-05-04T18:13:51.0Z</end-time><misfire-instruction>SmartPolicy</misfire-instruction><repeat-count>100</repeat-count><repeat-interval>1000</repeat-interval></simple></trigger></schedule></job-scheduling-data>
<?xmlversion="1.0" encoding="UTF-8"?><job-scheduling-dataxmlns="http://quartznet.sourceforge.net/JobSchedulingData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.0"><processing-directives><overwrite-existing-data>true</overwrite-existing-data></processing-directives><schedule><job><name>SimpleJob1</name><group>myJobGroup1</group><description>SimpleJob1</description><job-type>QuartzDemo.SimpleJob1, QuartzDemo</job-type><durable>true</durable><recover>false</recover><job-data-map><entry><key>author</key><value>jackwangcumt</value></entry><entry><key>blog</key><value>isaboy</value></entry><entry><key>jobType</key><value>XML Plugin Job</value></entry></job-data-map></job><trigger><cron><name>trigger1</name><group>myTriggerGroup</group><job-name>SimpleJob1</job-name><job-group>myJobGroup1</job-group><cron-expression>0/2 * * * * ?</cron-expression></cron></trigger></schedule></job-scheduling-data>

4 效果


执行示例程序,界面如下:

1.jpg

可以通过修改配置文件,动态修改任务的相关参数,演示动画如下图所示:

76497-20151203104546236-1777388685.gif

相关文章
|
19天前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
52 26
|
19天前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
66 23
|
2月前
|
区块链 C# Windows
PasteEx:一款.NET开源的Windows快捷粘贴神器
PasteEx:一款.NET开源的Windows快捷粘贴神器
53 17
|
2月前
|
XML C# 数据格式
一个.NET开源、免费、功能强大的 PDF 处理工具
一个.NET开源、免费、功能强大的 PDF 处理工具
|
2月前
|
Web App开发 C# Windows
一款.NET开源的Windows资源管理器标签页工具
一款.NET开源的Windows资源管理器标签页工具
|
2月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
5月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
59 7
|
5月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
108 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
78 0
|
6月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?