Quartz - 作業調度框架 - 插件化開發
背景
大部分業務都是基於定時的任務,特別適合使用 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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/UNXjmr1IvnV2baKkTSrFYw