背景
大部分业务都是基于定时的任务,特别适合使用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>
这样的封装就赋予框架新的技能,大大提高了开发人员的开发效率。
主要代码
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