百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Quartz.NET一个优秀的作业调度框架

yuyutoo 2024-11-01 15:55 2 浏览 0 评论

1 什么是Quartz.NET?

Quartz是一个功能齐全的开源作业调度系统,可以与几乎任何其他软件系统集成或一起使用。

2 为什么需要Quartz.NET?

.NET Framework通过System.Timers.Timer类具有“内置”计时器功能-为什么有人使用Quartz而不是这些标准功能?

原因有很多!这里有一些:

  • 计时器没有持久性机制。
  • 计时器的时间安排不灵活(只能设置开始时间和重复间隔,没有基于日期,一天中的时间等信息)。
  • 计时器不使用线程池(每个计时器一个线程)
  • 计时器没有真正的管理方案-您必须编写自己的机制以能够按名称记住,组织和恢复任务等。
  • 3 如何使用Quartz.NET?

    首先,安装Quartz

    Quartz
    

    然后,定义一个任务类

    using System;
    using System.Threading.Tasks;
    
    namespace Quartz.ConsoleApp01
    {
        public class HelloJob : IJob
        {
            public Task Execute(IJobExecutionContext context)
            {
                Console.WriteLine("Hello "+DateTime.Now);
                return Task.CompletedTask;
            }
        }
    }
    

    最后,实例化并启动调度程序,并调度要执行的作业:

    using Quartz.Impl;
    using System;
    using System.Threading.Tasks;
    
    namespace Quartz.ConsoleApp01
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                Console.WriteLine("开始调度!");
    
                //1、创建一个调度
                var factory = new StdSchedulerFactory();
                var scheduler = await factory.GetScheduler();
                await scheduler.Start();
    
                //2、创建一个任务
                var job = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job1", "group1")
                    .Build();
    
                //3、创建一个触发器
                var trigger = TriggerBuilder.Create()
                    .WithIdentity("trigger1", "group1")
                    .WithCronSchedule("0/5 * * * * ?")     //5秒执行一次
                    .Build();
    
                await scheduler.ScheduleJob(job, trigger);
    
                Console.ReadKey();
            }
        }
    }
    

    我们来看一下输出结果:

    开始调度!
    Hello 2021/1/19 14:37:40
    Hello 2021/1/19 14:37:45
    Hello 2021/1/19 14:37:50
    Hello 2021/1/19 14:37:55
    

    3 使用配置文件方式使用Quartz.NET?

    首先,安装Quartz,Quartz.Plugins

    Quartz
    Quartz.Plugins
    

    然后,定义一个任务类

    using System;
    using System.Threading.Tasks;
    
    namespace Quartz.ConsoleApp02
    {
        public class HelloJob : IJob
        {
            public Task Execute(IJobExecutionContext context)
            {
                Console.WriteLine("Hello " + DateTime.Now);
                return Task.CompletedTask;
            }
        }
    }
    

    接着,配置quartz_jobs.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- This file contains job definitions in schema version 2.0 format -->
    <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>
    		<!--TestJob测试 任务配置-->
    		<job>
    			<name>job1</name>
    			<group>group1</group>
    			<description>job1</description>
    			<job-type>Quartz.ConsoleApp02.HelloJob,Quartz.ConsoleApp02</job-type>
    			<durable>true</durable>
    			<recover>false</recover>
    		</job>
    		<trigger>
    			<cron>
    				<name>trigger1</name>
    				<group>group1</group>
    				<job-name>job1</job-name>
    				<job-group>group1</job-group>
    				<cron-expression>0/5 * * * * ?</cron-expression>
    			</cron>
    		</trigger>
    	</schedule>
    </job-scheduling-data>
    

    最后,实例化并启动调度程序:

    using Quartz.Impl;
    using System;
    using System.Collections.Specialized;
    using System.Threading.Tasks;
    
    namespace Quartz.ConsoleApp02
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                Console.WriteLine("开始调度!");
    
                //1、首先,我们必须获得对调度程序的引用
                var properties = new NameValueCollection
                {
                    ["quartz.scheduler.instanceName"] = "XmlConfiguredInstance",
                    ["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz",
                    ["quartz.threadPool.threadCount"] = "5",
                    ["quartz.plugin.xml.type"] = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins",
                    ["quartz.plugin.xml.fileNames"] = "~/quartz_jobs.xml",
                    // this is the default
                    ["quartz.plugin.xml.FailOnFileNotFound"] = "true",
                    // this is not the default
                    ["quartz.plugin.xml.failOnSchedulingError"] = "true"
                };
    
                //2、创建一个调度
                var factory = new StdSchedulerFactory(properties);
                var scheduler = await factory.GetScheduler();
                await scheduler.Start();
    
                Console.ReadKey();
            }
        }
    }
    

    4 Cron表达式

    4.1 介绍

    cron是已存在很长时间的UNIX工具,因此其调度功能强大且经过验证。
    cron表达式是由7段构成:秒 分 时 日 月 星期 年(可选)

  • "*" 用于选择字段中的所有值,例如,在分钟字段中表示“每分钟”。
  • "?" 在需要在允许使用字符的两个字段之一中指定某些内容而在另一个不允许使用的字段中指定内容时很有用。例如,如果我希望触发器在每月的某个特定日期(例如10号)触发,但不在乎是星期几,则将其10输入“月日”字段,以及?“星期几”字段中。
  • "-" 用于指定范围。例如,10-12在小时字段中表示“小时10、11和12”。
  • "," 用于指定其他值。例如,MON,WED,FRI在“星期几”字段中表示“星期一,星期三和星期五的日子”。
  • "/" 用于指定增量。例如,0/15在秒字段中表示“秒0、15、30和45”。和5/15在秒字段的意思是“秒5,20,35和50”。
  • "L" 在允许使用的两个字段中都有不同的含义。例如,“L月日”字段中的值表示“月的最后一天”
  • "W" 用于指定最接近给定日期的工作日(星期一至星期五)。例如,如果您要指定“15W月日”字段的值,则含义是:“离月15日最近的工作日”。
  • "#" 用于指定每月的“第n个” XXX天。例如,“6#3星期几”字段中的值表示“每月的第三个星期五”(第6天=星期五,“#3” =每月的第三个星期五)。

  • 4.2 例子


    相关推荐

    jQuery VS AngularJS 你更钟爱哪个?

    在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...

    Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0

    在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...

    如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例

    要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...

    编程技巧:Jquery实时验证,指定长度的「负小数」

    为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...

    一篇文章带你用jquery mobile设计颜色拾取器

    【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

    编程技巧:Jquery实时验证,指定长度的「正小数」

    为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...

    jquery.validate检查数组全部验证

    问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...

    Vue进阶(幺叁肆):npm查看包版本信息

    第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...

    layui中使用lay-verify进行条件校验

    一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...

    jQuery是什么?如何使用? jquery是什么功能组件

    jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...

    django框架的表单form的理解和用法-9

    表单呈现...

    jquery对上传文件的检测判断 jquery实现文件上传

    总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...

    Nodejs之MEAN栈开发(四)-- form验证及图片上传

    这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...

    大数据开发基础之JAVA jquery 大数据java实战

    上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...

    推荐四个开源的jQuery可视化表单设计器

    jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...

    取消回复欢迎 发表评论: