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