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

相关文章
|
5天前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
5天前
|
C#
.NET开源、免费、强大的交互式绘图库
.NET开源、免费、强大的交互式绘图库
|
5天前
|
存储 文字识别 C#
.NET开源免费、功能强大的 Windows 截图录屏神器
今天大姚给大家分享一款.NET开源免费(基于GPL3.0开源协议)、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器:ShareX。
|
5天前
|
数据可视化 开发工具 C#
.NET开源、免费、跨平台的Git可视化管理工具
俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工具:SourceGit。
|
5天前
|
定位技术 API C#
.NET开源、功能强大、跨平台的图表库
.NET开源、功能强大、跨平台的图表库
|
5天前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
|
5天前
|
人工智能 自然语言处理 算法
分享几个.NET开源的AI和LLM相关项目框架
分享几个.NET开源的AI和LLM相关项目框架
|
5天前
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用
|
5天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
48 0
|
5天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
23 0
http://www.vxiaotou.com