前言:

Quartz一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,基于C#写成,可应用于winform、asp.net、asp.net core应用中。提供了巨大的灵活性,是一个更为强大,方便管理,集群部署的作业调度框架。

所以,有时候项目需要在不同时刻,执行一个或很多个不同的作业,你可以用它来完成执行创建简单或复杂的任务调度。

特性:

1:支持集群,作业分组,作业远程管理。

2:自定义精细的时间触发器,使用简单,作业和触发分离。

3:数据库支持,可以寄宿Windows服务,WebSite,winform等。

概念:

Scheduler        作业调度器

IJob             作业接口,继承并实现Execute, 编写执行的具体作业逻辑。

JobBuilder       根据设置,生成一个详细作业信息(JobDetail)。

TriggerBuilder   根据规则,生产对应的Trigger,触发器可以规划执行任务

步骤:

1、创建一个ISchedulerFactory,然后并且获取 Scheduler

2、启动 Scheduler

3、创建 job 任务

4、创建 trigger 触发器

5、使用触发器规划执行任务

对应的API

1、IScheduler - 与 scheduler 进行交互的主要接口

2、IJob - 你希望被 scheduler 执行的组件的接口

3、IJobDetail - 用于定义 Jobs 实例

4、ITrigger - 定义将会在scheduler上执行的 job 上的组件

5、JobBuilder - 用于定义或建立(define/build) JobDetail 实例,JobDetail定义了Jobs实例

6、TriggerBuilder - 用于定义或建立 Trigger 实例

开始:

注意:

新建一个Quartz项目后,需要安装下面的程序包:

你可以用控制台命令的方式安装

Install-Package Quartz

也可以使用下面这种方式选择安装版本

一、创建一个scheduler的引用:

            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = await schedFact.GetScheduler();

二、启动 scheduler:

            await sched.Start();

三、实现IJob:

ConsoleJob.cs 实现IJob,在Execute方法里编写要处理的业务逻辑,系统就会按照Quartz的配置,定时处理

    /// <summary>
    /// 实现IJob,Execute方法里编写要处理的业务逻辑
    /// </summary>
    public class ConsoleJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Console.Out.WriteLineAsync($"ConsoleJob执行工作 在当前时间{DateTime.Now}--上一次执行时间:{DateTime.Now.AddSeconds(-5)}");
        }
    }

四、创建trigger:(建立一个某个时间点的触发器,并且每5秒执行一次)

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")  //触发器 组
                .WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever())
                .Build();

五、触发器执行任务:

            await sched.ScheduleJob(job, trigger);

将几个步骤整合后代码如下:

        /// <summary>
        /// 任务调度的使用过程
        /// </summary>
        /// <returns></returns>
        public async static Task Run()
        {
            // 1.创建scheduler的引用
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = await schedFact.GetScheduler();

            //2.启动 scheduler
            await sched.Start();

            // 3.创建 job
            IJobDetail job = JobBuilder.Create<ConsoleJob>()
                    .WithIdentity("job1", "group1")
                    .Build();

            // 4.创建 trigger (创建 trigger 触发器)
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")  //触发器 组
                .WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever())
                .Build();

            // 5.使用trigger规划执行任务job (使用触发器规划执行任务)
            await sched.ScheduleJob(job, trigger);
        }

运行:

间隔5秒执行一次后的效果:

附加:

这里使用的quartz为3.x 版本,整个版本相对于2.0版本进行了大量的修改,正式支持了.NET Core 和async/await

引用张队文章的内容:

3.x 版本的新功能

  • 支持 async/await 基于任务的作业,内部以async/await工作

  • 支持.NET Core / netstandard 2.0和.NET Framework 4.5.2及更高版本

  • 通过提供程序名称SQLite-Microsoft支持Microsoft.Data.Sqlite,旧的提供程序SQLite也仍然有效,还可以用

  • 增加了对SQL Server内存优化表的初步支持和Quartz.Impl.AdoJobStore.UpdateLockRowSemaphoreMOT

  • 从依赖关系中删除Common.Logging

  • 删除C5 Collections,使用.NET框架内置的Collections

  • 在插件启动时添加对作业调度XML文件的验证

  • 在TimeZoneUtil中添加对额外自定义时区解析器功能的支持

API 不兼容

  • 作业和插件分离到一个单独的程序集/ NuGet包里 Quartz.Jobs和Quartz.Plugins
  • ADO.NET提供程序名称已经简化,提供程序名称不带版本,例如SqlServer-20 => SqlServer
  • API方法已经被重新定义,主要使用IReadOnlyCollection,这隐藏了两个HashSets和List
  • LibLog已经隐藏到内部(ILog等),就像它本来打算的那样
  • SimpleThreadPool 消失了,用系统的线程池取代了
  • 调度程序方法已经改为基于Task,记得要await 它们
  • IJob接口现在返回一个Task
  • 一些IList属性已经更改为IReadOnlyList ,以正确反映意图
  • SQL Server CE支持已被删除
  • DailyCalendar现在使用日期时间排除日期,并具有ISet接口来访问它们
  • IObjectSerializer有新的方法,必须实现 void Initialize()
  • IInterruptableJob取消了上下文的CancellationToken

总结:

1.其实在实际项目中,可以将上面的方法进行封装处理,形成不同的任务,特别是处理多任务的时候,在不同的job中调用不同的trigger,后续会继续完善开发

2.quartz还有更多的用法,可以参考资料:Quartz.Net官方文档   和  Quartz.Net开源地址

C# Quartz结合控制台实现定时任务的更多相关文章

  1. ASP.NET Core2.2+Quartz.Net 实现web定时任务

    作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本. 但是 ...

  2. 使用Quartz.net来执行定时任务

    Quartz.net使用方法:http://www.cnblogs.com/lizichao1991/p/5707604.html 最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.n ...

  3. springboot和quartz整合实现动态定时任务(持久化单节点)

    Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制,它支持定时任务持久化到数据库,从而避免了重启服务器时任务丢失,支持分布式多节点,大大的 ...

  4. 使用spring+quartz配置多个定时任务

    Spring被用在了越来越多的项目中, quartz也被公认为是比较好用的定时器设置工具, 在这里通过一个demo说明如何使用spring和quartz配置多个定时任务. 环境: eclipse + ...

  5. JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图

    1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...

  6. C#中Quartz的简单易懂定时任务实现

    作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种 ...

  7. springboot整合Quartz实现动态配置定时任务

    前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...

  8. 使用quartz数据库锁实现定时任务的分布式部署

    ,1.根据项目引用的quartz依赖版本,确定下载的quartz-distribution安装包,我项目引用的信息如下图所示: 2.解压,在\quartz-2.2.3-distribution\qua ...

  9. spring boot整合quartz实现多个定时任务

        版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/78543574 最近收到了很多封邮件, ...

随机推荐

  1. Azkaban 3.73.1 集群搭建(Multiple Executor)

    一.简介 Azkaban是LinkedIn开源的任务调度框架,采用java编写 Azkaban功能和特点: 任务的依赖处理 任务监控,失败告警 任务流的可视化 任务权限管理 Azkaban具有轻量可插 ...

  2. Codeforces 757B:Bash's Big Day(分解因子+Hash)

    http://codeforces.com/problemset/problem/757/B 题意:给出n个数,求一个最大的集合并且这个集合中的元素gcd的结果不等于1. 思路:一开始把素数表打出来, ...

  3. Intent对象(组件间的通信原理)

    Intent对象是一种可以在运行时动态绑定组件的关键技术,通过使用Intent对象,可以告诉系统你想要实现什么样的操作,也就是Intent对象里面包含的请求内容,请求再由Android操作系统接收到, ...

  4. ServiceFabric极简文档-1.3删除群集

    删除群集 若要删除群集,请运行包文件夹中的 RemoveServiceFabricCluster.ps1 Powershell 脚本,并传入 JSON 配置文件的路径. 可以选择性地指定删除日志的位置 ...

  5. 【06】Jenkins:Gitlab 自动触发构建以及钉钉通知

    写在前面的话 在某些时候,我们希望能够实现这样一个功能,当用户提交东西到 gitlab 上的时候,希望它能够自动触发构建,发布到我们需要的环境. 目前我们内部有做类似的需求:产品提交原型到 gitla ...

  6. 关于int和integer

    大家可以看一下下面这个java程序的运行结果 int k = 1; int l = 1; System.out.println(k == l); int a = 128; int b = 128; S ...

  7. Java开发面试题汇总 -- 精选版(附答案)

    最近事情太多,没太时间写公众号.今天抽空再整理整理面试中的那点事吧,帮助那些正在找工作或想跳槽找工作的兄弟姐妹们. 前面我己写过多篇推文,相信关注此公众号的伙伴们已经了解掌握了不少.从目前流行的开发技 ...

  8. 浅入深出Vue:代码整洁之封装

    深入浅出vue系列文章已经更新过半了,在入门篇中我们实践了一个小小的项目. <代码整洁之道>一书中提到过一句话: 神在细节中 这句话来自20世纪中期注明现代建筑大师 路德维希·密斯·范·德 ...

  9. k8s学习 - 概念 - Deployment

    k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管 ...

  10. 用Python和Pandas以及爬虫技术统计历史天气

    背景 最近在计划明年从北京rebase到深圳去,所以最近在看深圳的各个方面.去年在深圳呆过一段时间,印象最深的是,深圳总是突然就下雨,还下好大的雨.对于我这种从小在南方长大但是后面又在北京呆了2年多的 ...