首页 > 其他分享 >快速掌握Quartz.Net计划任务调度框架,轻松实现定时任务

快速掌握Quartz.Net计划任务调度框架,轻松实现定时任务

时间:2024-12-09 19:28:29浏览次数:6  
标签:Quartz Scheduler 作业 scheduler Net 任务调度 public

在这里插入图片描述

前言

Quartz.Net是一个开源的作业调度框架,可以用于管理计划任务和定期执行。Quartz.Net提供了丰富的作业计划选项,例如精确或模糊时间表达式、日期和时间限制等。Quartz.Net采用分布式架构,允许在多个计算机上运行任务。

Quartz.Net架构设计

Quartz.Net的架构设计采用了经典的MVC(Model-View-Controller)模式,其中:

  • Model:表示应用程序中的数据和状态。在Quartz.Net中,Model由Job和Trigger组成,并由Scheduler调度。
  • View:表示与用户交互的部分。在Quartz.Net中,View由Scheduler框架提供的API和UI组件组成。
  • Controller:负责处理用户输入并更新Model和View。在Quartz.Net中,Controller由Scheduler控制器组成。

Quartz.Net组件模块

Quartz.Net包含以下组件模块:

  • Scheduler:负责作业的调度和执行。Scheduler维护一个作业和触发器的调度列表,并根据定义的条件选择要调度的作业。
  • Job:表示要执行的作业。在Quartz.Net中,Job必须实现IJob接口。
  • Trigger:定义何时执行作业。在Quartz.Net中,有多种类型的触发器可供选择,例如简单触发器、Cron触发器等。
  • JobDetail:表示作业的详细信息,包括执行作业所需的Job类及其名称、描述和其他数据。
  • JobExecutionContext:在作业执行期间提供与应用程序和Quartz.Net框架交互所需的上下文信息。
  • SchedulerFactory:用于创建Scheduler的工厂类。

集成Quartz.Net

在NetCore项目中集成Quartz.Net,可以通过以下步骤实现:

  1. 安装Quartz.Net NuGet包
    在Visual Studio的NuGet包管理器中搜索安装Quartz.Net包,或通过命令行安装:dotnet add package Quartz。

  2. 创建作业类
    依据项目需求创建对应的作业类,并实现IJob接口,例如:

public class MyJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        await Console.Out.WriteLineAsync("Hello, Quartz.Net!");
    }
}
  1. 配置Scheduler
    在Startup.cs文件中添加配置代码,创建Scheduler,添加作业和触发器:
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IJobFactory, SingletonJobFactory>();
    services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
    services.AddSingleton(new JobSchedule(
        jobType: typeof(MyJob),
        cronExpression: "0/5 * * * * ?")); // 每5秒执行一次

    services.AddHostedService<QuartzHostedService>();
}

public class JobSchedule
{
    public Type JobType { get; }
    public string CronExpression { get; }

    public JobSchedule(Type jobType, string cronExpression)
    {
        JobType = jobType;
        CronExpression = cronExpression;
    }
}

public class SingletonJobFactory : IJobFactory
{
    private readonly IServiceProvider _serviceProvider;

    public SingletonJobFactory(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob)_serviceProvider.GetService(bundle.JobDetail.JobType);
    }

    public void ReturnJob(IJob job)
    {
        // do nothing
    }
}

public class QuartzHostedService : IHostedService
{
    private readonly ISchedulerFactory _schedulerFactory;
    private readonly IJobFactory _jobFactory;
    private readonly IEnumerable<JobSchedule> _jobSchedules;

    public QuartzHostedService(
        ISchedulerFactory schedulerFactory, 
        IJobFactory jobFactory, 
        IEnumerable<JobSchedule> jobSchedules)
    {
        _schedulerFactory = schedulerFactory;
        _jobFactory = jobFactory;
        _jobSchedules = jobSchedules;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        var scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
        scheduler.JobFactory = _jobFactory;

        foreach (var jobSchedule in _jobSchedules)
        {
            var jobDetail = JobBuilder.Create(jobSchedule.JobType).Build();

            var trigger = TriggerBuilder.Create()
                .WithCronSchedule(jobSchedule.CronExpression)
                .Build();

            await scheduler.ScheduleJob(jobDetail, trigger, cancellationToken);
        }

        await scheduler.Start(cancellationToken);
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
        var scheduler = await _schedulerFactory.GetScheduler(cancellationToken);
        await scheduler.Shutdown(cancellationToken);
    }
}
  1. 启动和停止Scheduler
    在Main函数中启动调度程序:
public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();
    await host.RunAsync();
}

参考文档

  1. 官方网站:
    https://www.quartz-scheduler.net/
  2. 官方文档:
    https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html

标签:Quartz,Scheduler,作业,scheduler,Net,任务调度,public
From: https://blog.csdn.net/houbincarson/article/details/144334063

相关文章

  • Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (服务器端)
    录Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四NIOSelector详解Netty源码分析之零磨刀不误砍柴工源码分......
  • Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (客户端)
    永顺 2016-10-26阅读 20 分钟41 目录Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四N......
  • Netty 源码分析之 二 贯穿Netty 的大动脉 ── ChannelPipeline (一)
    目录源码之下无秘密──做最好的Netty源码分析教程Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四NIOSelector......
  • Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(二)
    Netty的IO处理循环在Netty中,一个EventLoop需要负责两个工作,第一个是作为IO线程,负责相应的IO操作;第二个是作为任务线程,执行taskQueue中的任务. 接下来我们先从IO操纵方面入手,看一下TCP数据是如何从JavaNIOSocket传递到我们的handler中的.Net......
  • Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(一)
    目录源码之下无秘密──做最好的Netty源码分析教程Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四NIOSelector......
  • whisper v3 finetune 中文乱码问题的解决方案
    最近学习了一下whisper的微调,主要是参考了github上的夜雨飘零大神项目。但是在操作中遇到了微调中文的时候出现了乱码的情况。以下是我这边对于微调过程中中文出现乱码情况的解决方案。出现情况如下图所示:系统环境NAME="CentOSLinux"VERSION="7(Core)"ID="centos"ID_LIKE......
  • 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名)
    https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系统是基于.netcore/WPF开发的一款在线客服软件,宗旨是: 开放、开源、共享。努力打造.net社区的一款优秀开源产品。背景我在业余时间开发的这个客服系统,有一个问题始终让我饱受困扰,360以及各种国产......
  • .NET CORE Central Package Management (CPM) 整理
    前言CentralPackageManagement是netcore统一包管理工具,在微服务项目中,大量的项目可能会引用不同的dll版本。比如最常见的Newtonsoft.Json,有些是11,有些是最新12,后续不能进行维护在微服务项目中,后续的版本升级,大量的项目需要单独修改,有了统一管理工具,只需要维护一个地方即......
  • Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍
    Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍一、摘要二、Microi吾码介绍2.1功能介绍2.2团队介绍2.3上线项目案例三、Microi吾码表单引擎是什么?四、Microi吾码表单引擎功能4.1模块引擎-由表单引擎驱动4.2流程引擎-由表单引擎驱动4.3接口引擎-由......
  • EtherNetIP转Profinet网关模块profinet通讯罗克韦尔变频器接入西门子PLC的配置案例
     在现代工业自动化领域,不同品牌设备之间的通信兼容性问题一直是企业面临的挑战之一。某智能工厂为了优化生产流程,提高设备的协同工作效率,决定对其生产线上的控制系统进行升级改造。该生产线中,AB罗克韦尔PowerFlex变频器作为关键的驱动设备,负责控制电机的转速和运行状态,采用的是......