Quartz.NET的具体使用

 更新时间:2021-09-22 21:45:23   作者:佚名   我要评论(0)

目录一、什么是Quartz.NET?二、Quartz.NET可以做什么?三、ASP.NET Core如何使用Quartz.NET?四、Quartz的cron表达式一、什么是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?

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

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


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

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

 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));
            }
        });
    }
}

在Startup.cs的ConfigureServices方法内通过services去注册RegularWork

//Quartz的工作单元
 services.AddTransient<RegularWork>();

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次

  //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")
        );
});           

ConfigureServices方法内新增添加Quartz服务

// ASP.NET核心托管-添加Quartz服务器
 services.AddQuartzServer(options =>
 {
     // 关闭时,我们希望作业正常完成
     options.WaitForJobsToComplete = false;
 });

完整代码

//Quartz的工作单元
    services.AddTransient();
    //Quartz调度中心
    services.AddQuartz(q =>
    {
        //用于注入
        q.UseMicrosoftDependencyInjectionJobFactory();
        // 基本Quartz调度器、作业和触发器配置
        var jobKey = new JobKey("RegularWork", "regularWorkGroup");
        q.AddJob(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;
});

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

四、Quartz的cron表达式

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

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

Expression Meaning
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.

到此这篇关于Quartz.NET的具体使用的文章就介绍到这了,更多相关Quartz.NET使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • .NET 2.0获取配置文件AppSettings和ConnectionStrings节数据的方法
  • 详解ASP.NET MVC的整个生命周期
  • Asp.net Core 如何设置黑白名单(路由限制)
  • 详解.NET数据库连接池
  • C#和vb.net实现PDF 添加可视化和不可见数字签名
  • .NET5控制台程序使用EF连接MYSQL数据库的方法
  • C#中使用jieba.NET、WordCloudSharp制作词云图的步骤
  • .NET AppSettings与ConnectionStrings使用案例详解

相关文章

  • Quartz.NET的具体使用

    Quartz.NET的具体使用

    目录一、什么是Quartz.NET?二、Quartz.NET可以做什么?三、ASP.NET Core如何使用Quartz.NET?四、Quartz的cron表达式一、什么是Quartz.NET?
    2021-09-22
  • asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

    asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

    目录认证授权 身份认证 授权 默认授权选择授权总结 开发了一个公司内部系统,使用asp.net core 3.1。在开发用户认证授权使用的是简单的c
    2021-09-22
  • 详解.NET数据库连接池

    详解.NET数据库连接池

    目录前置知识背景1. .NET数据库连接池的背景2. .NET 数据库连接池的表现3. .NET是如何形成数据库连接池的&#63;4. 连接池中的连接什么时候被移
    2021-09-22
  • .Net Core 之AutoFac的使用

    .Net Core 之AutoFac的使用

    目录Autofac介绍组件的三种注册方式生命周期AutoFac 在asp .net core中的使用本文不介绍IoC和DI的概念,如果你对Ioc之前没有了解的话,建议先
    2021-09-22
  • Asp.net Core 如何设置黑白名单(路由限制)

    Asp.net Core 如何设置黑白名单(路由限制)

    在原有的AspnetMvc中我们会使用到路由访问限制,在AppStart/RouteConfig.cs中写上如下: routes.IgnoreRoute("{resource}.axd/{*pathInfo}
    2021-09-22
  • C#中efcore-ShardingCore呈现“完美”分表

    C#中efcore-ShardingCore呈现“完美”分表

    目录efcore支持情况 数据库支持情况如何开始使用 自定义分表键,自定义分表规则 默认路由 动态添加分表信息 支持select,join,group by等
    2021-09-22
  • .NET Core对象池的应用:编程篇

    .NET Core对象池的应用:编程篇

    目录一、对象的借与还二、依赖注入三、池化对象策略四、对象池的大小五、对象的释放借助于有效的自动化垃圾回收机制,.NET让开发人员不在关心
    2021-09-22
  • .NET Core对象池的应用:设计篇

    .NET Core对象池的应用:设计篇

    目录一、 IPooledObjectPolicy<T>二、ObjectPool<T>DefaultObjectPool<T>DisposableObjectPool<T>三、ObjectPoolProvider《编程篇》已经涉及
    2021-09-22
  • 运用.net core中实例讲解RabbitMQ高可用集群构建

    运用.net core中实例讲解RabbitMQ高可用集群构建

    目录一、集群架构简介二、普通集群搭建2.1 各个节点分别安装RabbitMQ2.2 把节点加入集群2.3 代码演示普通集群的问题三、镜像集群四、HAProxy
    2021-09-22
  • .Net Core 中选项Options的具体实现

    .Net Core 中选项Options的具体实现

    目录由代码开始定义一个用户配置选项定义json配置文件:myconfig.json 创建ServiceCollection 示例代码 代码运行结果 通过运行代码得到的
    2021-09-22

最新评论