使用Quartz實現定時做業

該文章是系列文章 基於.NetCore和ABP框架如何讓Windows服務執行Quartz定時做業 的其中一篇。
Quartz是一個開源的做業調度框架,準確的稱謂應該是 Quartz.Net,它是Java開源項目Quartz Scheduler的一部分。
關於Quartz的功能可訪問 https://www.quartz-scheduler.net/features.html
nuget地址:https://www.nuget.org/packages/Quartz/3.0.7/
GitHub地址:https://github.com/quartznet/quartznethtml

首先是對定義的MyJobService進行完善。git

using System.Threading.Tasks;

namespace Demo.MyJob
{
    public class MyJobService
    {
        public async Task StartAsync()
        {
            //操做邏輯
        }

        public async Task StopAsync()
        {
            //操做邏輯
        }

        public async Task ContinueAsync()
        {
            //操做邏輯
        }

        public async Task PauseAsync()
        {
            //操做邏輯
        }
    }
}

完善以後的代碼以下github

using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;

namespace Demo.MyJob
{
    public class MyJobService
    {
        private readonly Task<IScheduler> _defaultScheduler;
        private static IScheduler _scheduler;
        public MyJobService()
        {
            _defaultScheduler = StdSchedulerFactory.GetDefaultScheduler();
        }
        public async Task StartAsync()
        {
            _scheduler = await _defaultScheduler;
            await _scheduler.Start();
        }

        public async Task StopAsync()
        {
            await _scheduler.Shutdown();
        }

        public async Task ContinueAsync()
        {
            await _scheduler.ResumeAll();
        }

        public async Task PauseAsync()
        {
            await _scheduler.PauseAll();
        }
    }
}

IScheduler是主要的接口,它由ISchedulerFactory生成,StdSchedulerFactory繼承自ISchedulerFactoryStdSchedulerFactory獲取配置的順序是先從App.config查找quartz section,沒找到就查找文件名爲quartz.config的配置,若是再沒有,代碼內置的有默認的配置項。express

使用XML文件配置

quartz.config的簡略配置以下框架

quartz.scheduler.instanceName = QuartzTest
quartz.threadPool.threadCount = 10
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
  • quartz.scheduler.instanceName - 此調度程序的名稱將爲「QuartzTest」,若是沒配置,默認名稱是「QuartzScheduler」
  • quartz.threadPool.threadCount - 最多可同時運行10個做業,若是如今有超過10個job須要執行的話,不會報錯,可是將有job不能執行。
  • quartz.plugin.xml.type和quartz.plugin.xml.fileNames須要新加nuget包Quartz.Plugins,指定了配置job詳情的xml文件,該文件與quartz.config在同級目錄下。

注意:新增了三個文件,分別是job_scheduling_data_2_0.xsd、quartz.config、quartz_jobs.xml,文件屬性爲若是較新則複製異步

quartz_jobs.xml示例

<?xml version="1.0" encoding="UTF-8"?>

<job-scheduling-data xmlns="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>SayHelloJob</name>
      <group>SayHelloJobGroup</group>
      <description>SayHello</description>
      <job-type>Demo.MyJob.Jobs.SayHelloJob,Demo.MyJob</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <trigger>
      <cron>
        <name>SayHelloJobTrigger</name>
        <group>SayHelloJobGroup</group>
        <description>SayHello</description>
        <job-name>SayHelloJob</job-name>
        <job-group>SayHelloJobGroup</job-group>
        <start-time>2019-06-13T00:00:00+08:00</start-time>
        <cron-expression>0 30 1 * * ?</cron-expression>
      </cron>
    </trigger>
  </schedule>
</job-scheduling-data>

job-type標識加載SayHelloJob的名稱,要指定正確否則報錯。更多配置能夠參考:Quartz.Tests.Integration/Xml/TestDataasync

實現Job

詳細文檔地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.htmlspa

IScheduler.Start(System.Threading.CancellationToken)調用以後將啓動實現的Job,該Job必須繼承IJob,執行的操做放在實現的Execute方法中,該方法標識了Task,也就是說咱們能夠在Execute方法內調用同步方法或者異步方法。.net

using System;
using System.Threading.Tasks;
using Quartz;

namespace Demo.MyJob.Jobs
{
    class SayHelloJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Task.Run(() =>
            {
                Console.WriteLine("Hello World to Async!");
            });
            Console.WriteLine("Hello World!");
        }
    }
}
相關文章
相關標籤/搜索