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

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

yuyutoo 2024-11-01 15:55 7 浏览 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 例子


    相关推荐

    .NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......

    ...

    全局和隐式 using 指令详解(全局命令)

    1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...

    请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍

    1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...

    ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战

    我是一位多年后端经验的工程师,其中前几年用ASP.NET...

    .NET AOT 详解(.net 6 aot)

    简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...

    一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)

    哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...

    asar归档解包(游戏arc文件解包)

    要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...

    在PyCharm 中免费集成Amazon CodeWhisperer

    CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...

    2014年最优秀JavaScript编辑器大盘点

    1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...

    基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享

    项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...

    JetBrains Toolbox推出全新产品订阅授权模式

    捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...

    idea最新激活jetbrains-agent.jar包,亲测有效

    这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...

    CountDownTimer的理解(countdowntomars)

    CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...

    反射为什么性能会很慢?(反射时为什么会越来越长)

    1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...

    btrace 开源!基于 Systrace 高性能 Trace 工具

    介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...

    取消回复欢迎 发表评论: