zoukankan      html  css  js  c++  java
  • 使用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/quartznet

    首先是对定义的MyJobService进行完善。

    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()
            {
                //操作逻辑
            }
        }
    }
    

    完善之后的代码如下

    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的配置,如果再没有,代码内置的有默认的配置项。

    使用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/TestData

    实现Job

    详细文档地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.html

    IScheduler.Start(System.Threading.CancellationToken)调用之后将启动实现的Job,该Job必须继承IJob,执行的操作放在实现的Execute方法中,该方法标识了Task,也就是说我们可以在Execute方法内调用同步方法或者异步方法。

    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!");
            }
        }
    }
    
    
  • 相关阅读:
    ABAP中的‘多线程’
    SAP数据库表维护视图分配事务代码
    SAP调用外部数据库
    ABAP-小技巧/知识(1)
    sap中用函数增加断点(break point)
    把内表 itab1 的 n1 到 n2 行内容附加到 itab2 内表中去.
    ABAP打开TCODE
    查看用户下有那些事务码
    check、continue、exit的区别
    将excel数据导入内表的函数
  • 原文地址:https://www.cnblogs.com/AlienXu/p/11017921.html
Copyright © 2011-2022 走看看