请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 350|回复: 5

控制台基于Quartz.Net组件实现定时任务调度(一)

  [复制链接]
  • TA的每日心情
    开心
    昨天 08:52
  • 签到天数: 1523 天

    [LV.Master]伴坛终老

    3908

    主题

    5826

    帖子

    10万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    105012

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2019-8-13 17:58:31 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    前言:

    你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢?

    180007ql0w3goot4amzu8q.png

    这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器。允许开发人员根据日期间隔来实现任务调度任务。非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。

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

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

    导图:

    180007ksemmdehcsqevbhm.png

    特性:

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

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

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

    概念:

    Scheduler 作业调度器

    180008rpt8pe511fltm88a.png

    所有的scheduler都应该由SchedulerFactory来创建

    1. //创建scheduler
    2. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    复制代码

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

    180008endx2e8p8d26eeyy.png

    通过实现IJob接口来使你的.NET组件可以很简单地被scheduler执行

    1. public class ConsoleJob : IJob
    2. {
    3. public Task Execute(IJobExecutionContext context)
    4. {
    5. return Console.Out.WriteLineAsync($"执行作业");
    6. }
    7. }
    复制代码

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

    JobBuilder是一个建造者模式,链式建造。通过静态方法构建一个JobBuilder实例,然后再调用类方法Build()创建一个IJobDetail的实现。

    1. public static JobBuilder Create(Type jobType)
    2. {
    3. JobBuilder b = new JobBuilder();
    4. b.OfType(jobType);
    5. return b;
    6. }
    复制代码

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

    180009j52buyzsz2o2luyx.png

    通过静态方法构建一个TriggerBuilder实例,然后再调用类方法Build()创建一个ITrigger的实现。

    1. public static TriggerBuilder Create()
    2. {
    3. return new TriggerBuilder();
    4. }
    复制代码

    根据任务设置触发的开始时间和结束时间

    1. /// <summary>
    2. /// 开始时间
    3. /// </summary>
    4. /// <param name="startTimeUtc"></param>
    5. /// <returns></returns>
    6. public TriggerBuilder StartAt(DateTimeOffset startTimeUtc)
    7. {
    8. startTime = startTimeUtc;
    9. return this;
    10. }
    11. /// <summary>
    12. /// 结束时间
    13. /// </summary>
    14. /// <param name="endTimeUtc"></param>
    15. /// <returns></returns>
    16. public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc)
    17. {
    18. endTime = endTimeUtc;
    19. return this;
    20. }
    复制代码

    步骤:

    180009ipcjpo9siwa3f3kj.png

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

    2、启动 Scheduler

    3、创建 job 任务

    4、创建 trigger 触发器

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

    开始:

    注意:

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

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

    1. Install-Package Quartz
    复制代码

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

    180010dh8hmsem48y8hmey.png

    一、创建一个scheduler的引用:

    1. ISchedulerFactory schedFact = new StdSchedulerFactory();
    2. IScheduler sched = await schedFact.GetScheduler();
    复制代码

    二、启动 scheduler:

    1. await sched.Start();
    复制代码

    三、实现IJob:

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

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

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

    1. ITrigger trigger = TriggerBuilder.Create()
    2. .WithIdentity("trigger1", "group1") //触发器 组
    3. .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
    4. .Build();
    复制代码

    五、触发器执行任务:

    1. await sched.ScheduleJob(job, trigger);
    复制代码

    将几个步骤整合子女码如下:

    1. /// <summary>
    2. /// 任务调度的使用过程
    3. /// </summary>
    4. /// <returns></returns>
    5. public async static Task Run()
    6. {
    7. // 1.创建scheduler的引用
    8. ISchedulerFactory schedFact = new StdSchedulerFactory();
    9. IScheduler sched = await schedFact.GetScheduler();
    10. //2.启动 scheduler
    11. await sched.Start();
    12. // 3.创建 job
    13. IJobDetail job = JobBuilder.Create<ConsoleJob>()
    14. .WithIdentity("job1", "group1")
    15. .Build();
    16. // 4.创建 trigger (创建 trigger 触发器)
    17. ITrigger trigger = TriggerBuilder.Create()
    18. .WithIdentity("trigger1", "group1") //触发器 组
    19. .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
    20. .Build();
    21. // 5.使用trigger规划执行任务job (使用触发器规划执行任务)
    22. await sched.ScheduleJob(job, trigger);
    23. }
    复制代码

    运行:

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

    180010y34ws0owjt6knfij.png

    附加:

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

    引用张队文章的内容:

    180011qofl0pztot8koojf.png

    总结:

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

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

    3.项目源码地址


    来源:https://www.cnblogs.com/i3yuan/p/11332931.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
  • TA的每日心情
    开心
    2019-8-30 08:53
  • 签到天数: 198 天

    [LV.7]常住居民III

    43

    主题

    201

    帖子

    5581

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    5581
    QQ
    发表于 2019-8-14 10:56:01 | 显示全部楼层
    楠哥,Quartz.Net不是不支持集群吗?
  • TA的每日心情
    开心
    昨天 08:52
  • 签到天数: 1523 天

    [LV.Master]伴坛终老

    3908

    主题

    5826

    帖子

    10万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    105012

    推广达人突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2019-8-14 15:35:54 | 显示全部楼层
    剑弑 发表于 2019-8-14 10:56
    楠哥,Quartz.Net不是不支持集群吗?

    我没用过他集群,但是查了下是支持集群的

    点评

    哦  详情 回复 发表于 2019-8-22 11:52
    C#论坛 www.ibcibc.com IBC编程社区
    C#
    C#论坛
    IBC编程社区
  • TA的每日心情
    开心
    2019-8-30 08:53
  • 签到天数: 198 天

    [LV.7]常住居民III

    43

    主题

    201

    帖子

    5581

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    5581
    QQ
    发表于 2019-8-22 11:52:58 | 显示全部楼层
    ibcadmin 发表于 2019-8-14 15:35
    我没用过他集群,但是查了下是支持集群的

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则