Quartz – 作业调度框架-插件化开发

  • A+
所属分类:.NET技术
摘要

大部分业务都是基于定时的任务,特别适合使用quartz这类框架解决定时问题。具体quartz的使用,看官方文档就可以了。下面谈谈对quartz插件化的封装。我们使用quartz.plugin。然后在quartz_jobs.xml方法里面定义了schedule,其中灵活的地方在于,里面定义了Jobs的属性,在QuartzPlugin的start方法执行的时候,会去加载quartz_jobs文件,逐个job信息进行加载。


背景

大部分业务都是基于定时的任务,特别适合使用quartz这类框架解决定时问题。具体quartz的使用,看官方文档就可以了。下面谈谈对quartz插件化的封装。我们使用quartz.plugin。然后在quartz_jobs.xml方法里面定义了schedule,其中灵活的地方在于,里面定义了Jobs的属性,在QuartzPlugin的start方法执行的时候,会去加载quartz_jobs文件,逐个job信息进行加载。

解决思路

在实际使用中,开发就变得相对简单了,不需要关注job任务是如何被调度的。只需要在程序中定义一个类实现job接口,填充业务代码,然后在文件里面填写该job属性:

 [DisallowConcurrentExecution]     public class AnalysisJob : IJob     {         public void Execute(IJobExecutionContext context)         {           xxxxxxxxxx         }             }  <job>       <name>名称</name>       <group>分组</group>       <description>描述</description>       <job-type>类库</job-type>       <durable>true</durable>       <recover>false</recover>     </job>

 这样的封装就赋予框架新的技能,大大提高了开发人员的开发效率。

Quartz - 作业调度框架-插件化开发

 

 

主要代码

using System; using System.Collections.Generic; using System.Linq; using Topshelf;   namespace HSCP.Task {     class Program     {         static void Main(string[] args)         {             HostFactory.Run(x =>             {                 x.Service<MainService>((s) =>                 {                     s.ConstructUsing(settings => new MainService());                     s.WhenStarted(tr => tr.Start());                     s.WhenStopped(tr => tr.Stop());                 });                 x.RunAsLocalSystem();                 x.SetDescription("");                 x.SetDisplayName("xxxx任务管理器");                 x.SetServiceName("HSCP.Task");             });         }     } }    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Quartz; using Quartz.Impl;    namespace HSCP.Task {     class MainService     {         static IScheduler sched;         public void Start()         {             try             {                 ISchedulerFactory factory = new StdSchedulerFactory();                 sched = factory.GetScheduler();                 sched.Start();                 Console.WriteLine($"共 {sched.GetJobGroupNames().Count} 任务");                 foreach (string gn in sched.GetJobGroupNames())                     Console.WriteLine(gn);             }             catch (Exception exc)             {                 Console.WriteLine(exc.ToString());             }             // NLogger.Info(string.Format("启动成功 {0}", DateTime.Now));         }          public void Stop()         {             sched.Shutdown(true);         }     } }

开源地址

https://github.com/quartznet/quartznet