• ASP.NET Core初步使用Quartz.NET(转载)


     一、什么是Quartz.NET?

    Quartz.NET 是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。

    Quartz.NET是纯净的,它是一个.Net程序集,是非常流行的Java作业调度系统Quartz的C#实现。

    二、Quartz.NET可以做什么?

    Quartz.NET很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。

    Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。

    Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

    我此次选择Quartz.Net使用的版本是 3.3.3

    这里强调一点:3.x的版本与2.x的版本使用方式有一定的差别

    Quartz.NET官方文档:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html

    三、ASP.NET Core如何使用Quartz.NET?

    1. 首先我们需要创建一个ASP.NET Core web的项目,创建的过程就不展示了,我创建的是API项目,使用传统三层架构。

    2. 项目创建好后,我们需要在NuGet包管理器中安装Quartz.AspNetCoreQuartz.Extensions.DependencyInjection

    3. 与2.x的使用方式不同,因为我使用的版本是3.3.3(此时最新版本)。我们就不像传统的创建调度中心类。传统的是定义作业工厂类【ResetJobFactory】,控制中心类【SchedulerCenter】,以及定期工作类【RegularWork】(如下图)在这就不过多介绍了。

    4. 只需创建一个定期工作类【RegularWork】,并且继承Quartz.net的IJob接口,I_RegularWork_BLL 能注入到RegularWork内需要UseMicrosoftDependencyInjectionJobFactory.

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

         public class RegularWork : IJob

          {

          private readonly I_RegularWork_BLL I_bll;

          public RegularWork(I_RegularWork_BLL Ibll)

          {

              I_bll = Ibll;

          }

          public Task Execute(IJobExecutionContext context)

          {

              Input_RoomType model = new Input_RoomType();

              model.currentPage = 1;

              model.pageSize = 1;

              var result = I_bll.getRoomTypeList(model);

              return Task.Run(() =>

              {

                  using (StreamWriter sw = new StreamWriter(@"F:/Quartz-NET.txt"true, Encoding.UTF8))

                  {

                     sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff =>") + JsonConvert.SerializeObject(result));

                  }

              });

          }

      }

    5. Startup.csConfigureServices方法内通过services去注册RegularWork

      1

      2

      //Quartz的工作单元

       services.AddTransient<RegularWork>();

    6. ConfigureServices方法内新增Quartz调度中心。Quartz.Extensions.DependencyInjection提供与Microsoft 依赖注入的集成,虽然Quartz 为作业工厂提供了两个内置替代方案,可以通过调用UseMicrosoftDependencyInjectionJobFactory或UseMicrosoftDependencyInjectionScopedJobFactory(已弃用)进行配置。

      从 Quartz.NET 3.3.2 开始,默认作业工厂生成的所有作业都是作用域作业,不应再使用UseMicrosoftDependencyInjectionScopedJobFactory。

      AddJob-新增一个工作单元;StartNow表示作业现在就开始执行;

      WithInterval用于执行时间策略执行规则;

      TimeSpan.FromSeconds表示执行的时间间隔,秒为单位;RepeatForever代表重复工作,可以用WithRepeatCount(5)代替RepeatForever;WithRepeatCount(5)代表执行5次
       

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

        //Quartz调度中心

          services.AddQuartz(q =>

          {

              //用于注入

              q.UseMicrosoftDependencyInjectionJobFactory();

              // 基本Quartz调度器、作业和触发器配置

              var jobKey = new JobKey("RegularWork""regularWorkGroup");

              q.AddJob<RegularWork>(jobKey, j => j

                  .WithDescription("My regular work")

              );

              q.AddTrigger(t => t

                  .WithIdentity("Trigger")

                  .ForJob(jobKey)

                  .StartNow()

                  .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s

                  .RepeatForever())//持续工作

                  .WithDescription("My regular work trigger")

              );

      });           

    7. ConfigureServices方法内新增添加Quartz服务

      1

      2

      3

      4

      5

      6

      // ASP.NET核心托管-添加Quartz服务器

       services.AddQuartzServer(options =>

       {

           // 关闭时,我们希望作业正常完成

           options.WaitForJobsToComplete = false;

       });

      完整代码如下

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      //Quartz的工作单元

       services.AddTransient<RegularWork>();

       //Quartz调度中心

       services.AddQuartz(q =>

       {

           //用于注入

           q.UseMicrosoftDependencyInjectionJobFactory();

           // 基本Quartz调度器、作业和触发器配置

           var jobKey = new JobKey("RegularWork""regularWorkGroup");

           q.AddJob<RegularWork>(jobKey, j => j

               .WithDescription("My regular work")

           );

           q.AddTrigger(t => t

               .WithIdentity("Trigger")

               .ForJob(jobKey)

               .StartNow()

               .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s

               .WithRepeatCount(5))//持续工作

               .WithDescription("My regular work trigger")

           );

       });

       // ASP.NET核心托管-添加Quartz服务

       services.AddQuartzServer(options =>

       {

           // 关闭时,我们希望作业正常完成

           options.WaitForJobsToComplete = false;

       });

    8.  这时候我们启动项目,定期工作开始执行。这时候的注入是有效的,查询数据后结果打印在F盘下的Quartz-NET.txt文件内(如下图)。

    四、Quartz的cron表达式

    官方的文档介绍:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html#format

    由7段构成:秒 分 时 日 月 星期 年(可选)
    "-" :表示范围  MON-WED表示星期一到星期三
    "," :表示列举 MON,WEB表示星期一和星期三
    "*" :表是“每”,每月,每天,每周,每年等
    "/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
    "?" :只能出现在日,星期段里面,表示不指定具体的值
    "L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
    "W" :表示工作日,距离给定值最近的工作日
    "#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)

    ExpressionMeaning
    0 0 12 * * ? 每天中午12点触发
    0 15 10 ? * * 每天上午10:15触发
    0 15 10 * * ? 每天上午10:15触发
    0 15 10 * * ? * 每天上午10:15触发
    0 15 10 * * ? 2005 2005年的每天上午10:15触发
    0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
    0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
    0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
    0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
    0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
    0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
    0 15 10 15 * ? 每月15日上午10:15触发
    0 15 10 L * ? 每月最后一日的上午10:15触发
    0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
    0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
    0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
    0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
    0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
    0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
    0 11 11 11 11 ? Fire every November 11th at 11:11am.

  • 相关阅读:
    O2O、B2B、C2C(通俗讲解)
    前端 $.parseJson()
    django反向解析传参
    从url(地址栏)获取参数:Jquery中getUrlParam()方法的使用
    Django:前后端分离后联调给前端传数据
    xpath 中 [<Element a at 3985984dj343>]
    sumafan:python爬虫多线程爬取数据小练习(附答案)
    window安装mysql(详细步骤)
    sqlserver从xlsx读取数据
    第一个kotlin程序
  • 原文地址:https://www.cnblogs.com/songjuntao/p/15135063.html
Copyright © 2020-2023  润新知