Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >有关Quartz.NET,与一线码农大佬对个线?

有关Quartz.NET,与一线码农大佬对个线?

作者头像
有态度的马甲
发布于 2020-12-18 03:32:32
发布于 2020-12-18 03:32:32
68500
代码可运行
举报
文章被收录于专栏:精益码农精益码农
运行总次数:0
代码可运行
跟[一线码农大佬]翻译的某技术文对个线

最近看到一线码农大佬翻译的《如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度》, 行文思路:

  1. 安装Quartz.NET
  2. Quartz.NET 中的Job,triggers 和 Schedulers
  3. 创建 Scheduler
  4. 开启和停止 scheduler
  5. 创建 job 工厂
  6. 创建 JobMetadata 存储你的 job 元数据

不可否认,一线大佬的翻译文还是相当精准的, 但个人认为这篇文章的底稿有点硬输出,并没有以一个流畅、直观的编码思路来讲述[如何在ASP.NET Core中使用Quartz.NET 执行定时任务]。

尤其是下面这段:

想起我之前也写了《ASP.NET Core+Quartz.Net实现web定时任务》, 文章以一个简单的定时任务讲述了Quartz.NET在ASP.NET Core中的应用思路,遇河架桥,遇山开路。

这里我要解释一下上图中:为什么要自定义一个Job工厂?

先看下官方JobFactory的作用:

大意是说:

如果某触发器被触发,该触发器关联的Job将被调度器上配置的JobFactory初始化;

Quartz.NET默认的SimpleJobFactory工厂类,是利用反射+无参构造函数构造出Job实例。

翻源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//----------------选自Quartz.Simpl.SimpleJobFactory类-------------
using System;
using Quartz.Logging;
using Quartz.Spi;
using Quartz.Util;
namespace Quartz.Simpl
{
    /// <summary> 
    /// The default JobFactory used by Quartz - simply calls 
    /// <see cref="ObjectUtils.InstantiateType{T}" /> on the job class.
    /// </summary>
    /// <seealso cref="IJobFactory" />
    /// <seealso cref="PropertySettingJobFactory" />
    /// <author>James House</author>
    /// <author>Marko Lahma (.NET)</author>
    public class SimpleJobFactory : IJobFactory
    {
        private static readonly ILog log = LogProvider.GetLogger(typeof (SimpleJobFactory));

        /// <summary>
        /// Called by the scheduler at the time of the trigger firing, in order to
        /// produce a <see cref="IJob" /> instance on which to call Execute.
        /// </summary>
        /// <remarks>
        /// It should be extremely rare for this method to throw an exception -
        /// basically only the case where there is no way at all to instantiate
        /// and prepare the Job for execution.  When the exception is thrown, the
        /// Scheduler will move all triggers associated with the Job into the
        /// <see cref="TriggerState.Error" /> state, which will require human
        /// intervention (e.g. an application restart after fixing whatever
        /// configuration problem led to the issue with instantiating the Job).
        /// </remarks>
        /// <param name="bundle">The TriggerFiredBundle from which the <see cref="IJobDetail" />
        ///   and other info relating to the trigger firing can be obtained.</param>
        /// <param name="scheduler"></param>
        /// <returns>the newly instantiated Job</returns>
        /// <throws>  SchedulerException if there is a problem instantiating the Job. </throws>
        public virtual IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            IJobDetail jobDetail = bundle.JobDetail;
            Type jobType = jobDetail.JobType;
            try
            {
                if (log.IsDebugEnabled())
                {
                    log.Debug($"Producing instance of Job '{jobDetail.Key}', class={jobType.FullName}");
                }

                return ObjectUtils.InstantiateType<IJob>(jobType);
            }
            catch (Exception e)
            {
                SchedulerException se = new SchedulerException($"Problem instantiating class '{jobDetail.JobType.FullName}'", e);
                throw se;
            }
        }

        /// <summary>
        /// Allows the job factory to destroy/cleanup the job if needed. 
        /// No-op when using SimpleJobFactory.
        /// </summary>
        public virtual void ReturnJob(IJob job)
        {
            var disposable = job as IDisposable;
            disposable?.Dispose();
        }
    }
}

//------------------节选自Quartz.Util.ObjectUtils类-------------------------
 public static T InstantiateType<T>(Type type)
{
     if (type == null)
     {
          throw new ArgumentNullException(nameof(type), "Cannot instantiate null");
     }
     ConstructorInfo ci = type.GetConstructor(Type.EmptyTypes);
     if (ci == null)
     {
          throw new ArgumentException("Cannot instantiate type which has no empty constructor", type.Name);
     }
     return (T) ci.Invoke(new object[0]);
}

但是很多情况下我们定义的Job很可能依赖第三方服务,就比如一线大佬文中NotificationJob依赖了ILogger<NotificationJob> 服务。

这样默认的SimpleJobFactory不能满足实例化要求, 考虑将Job任务作为依赖注入组件,加入依赖注入容器

关键思路:

IScheduler 开放了JobFactory 属性,便于你应用自定义的Job工厂; 在自定义Job工厂中,使用ASP.NET Core依赖注入容器IServiceProvider解析出特定的Job。

JobFactories may be of use to those wishing to have their application produce IJob instances via some special mechanism, such as to give the opportunity for dependency injection

这才有一线码农大佬原文 [创建Job工厂类]动作的由来, 知其然更知其所以然,如有勘误,欢迎留言赐教。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core+Quartz.Net实现web定时任务
作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本。
有态度的马甲
2020/04/16
2.8K0
ASP.NET Core+Quartz.Net实现web定时任务
在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
在这篇文章中,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业。这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态。接下来我将演示如何创建一个简单的 IJob,一个自定义的 IJobFactory和一个在应用程序运行时就开始运行的QuartzHostedService。我还将介绍一些需要注意的问题,即在单例类中使用作用域服务。
依乐祝
2020/04/09
3K0
在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
【壹起学】1:Uwl.Admin开源框架基于QuartzNet的实现
Quartz.NET官网地址:https://www.quartz-scheduler.net/
老张的哲学
2022/04/11
9120
【壹起学】1:Uwl.Admin开源框架基于QuartzNet的实现
Quartz.net官方开发指南 第八课:SchedulerListeners
SchedulerListeners同TriggerListeners及JobListeners非常相似,SchedulerListeners只接收与特定trigger 或job无关的Scheduler自身事件通知。 Scheduler相关的事件包括:增加job或者trigger,移除Job或者trigger, scheduler内部发生的错误,scheduler将被关闭的通知,以及其他。 Quartz.ISchedulerListener 接口 /// <summary> /// The
张善友
2018/01/19
6150
【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务
在我的上一篇文章中,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计划运行后台任务。不幸的是,由于Quartz.NET API的工作方式,在Quartz作业中使用Scoped依赖项注入服务有些麻烦。说明下这篇文章部分采用机翻。
依乐祝
2020/04/23
1.9K0
Net作业调度(一) -Quartz.Net入门
背景 很多时候,项目需要在不同时刻,执行一个或很多个不同的作业。 Windows执行计划这时并不能很好的满足需求了,迫切需要一个更为强大,方便管理,集群部署的作业调度框架。 介绍 Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net 是Quartz的C#移植版本。 它一些很好的特性: 1:支持集群,作业分组,作业远程管理。  2:自定义精细的时间触发器,使用简单,作业和触发分离。 3:数据库支持,可以寄宿Windows服务,WebSite,winform等。 实战 Q
蘑菇先生
2018/05/21
1.7K0
Quartz.net官方开发指南 第七课 : TriggerListeners和JobListeners
监听器是在scheduler事件发生时能够执行动作的对象。可以看出,TriggerListeners接收与triggers相关的事件,而JobListeners则接收与Job相关的事件。 Trigger相关的事件包括:trigger触发、trigger未触发,以及trigger完成(由trigger触发的任务被完成)。 /// <summary> /// The interface to be implemented by classes that want to be informed when a
张善友
2018/01/19
5500
Quartz.net官方开发指南 第一课:使用Quartz.net
使用scheduler之前应首先实例化它。使用SchedulerFactory可以完成scheduler的实例化。用户可直接地实例化这个工厂类并且直接使用工厂的实例(例如下面的例子)。 一旦一个scheduler被实例化,它就可以被启动(start),并且处于驻留模式,直到被关闭(shutdown)。注意,一旦scheduler被关闭(shutdown),则它不能再重新启动,除非重新实例化它。除非scheduler 被启动或者不处于暂停状态,否则触发器不会被触发(任务也不能被执行)。 下面是一个代码片断
张善友
2018/01/19
6910
Quartz.net官方开发指南 第三课:更多关于Jobs和JobDetails
如你所见,Job相当容易实现。这里只是介绍有关Jobs本质, IJob接口的Execute(..)方法以及JobDetails中需要理解的内容。 在所实现的类成为真正的“Job”时,期望任务所具有的各种属性需要通知给Quartz。通过JobDetail类可以完成这个工作,这个类在前面的章节中曾简短提及过。现在,我们花一些时间来讨论Quartz中Jobs的本质和Job实例的生命周期。首先让我们回顾一下第一课中所看到的代码片断: // define the job and tie it to our Hel
张善友
2018/01/19
8700
详细讲解Quartz.NET
     前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API,演示它的机制,例如作业、触发器、作业仓库。      Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活
张善友
2018/01/30
1.9K0
免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
彭泽0902
2018/01/04
2.5K0
C# Quartz.NET实现动态改变作业调度周期
Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大
跟着阿笨一起玩NET
2020/05/06
3.9K0
Quartz.NET的使用(附源码)
  虽然Quartz.NET被园子里的大神们写烂了,自己还是整理了一篇,结尾会附上源码地址。
陈珙
2018/09/12
2.5K0
Quartz.NET的使用(附源码)
Quartz.net官方开发指南 第二课:Jobs And Triggers
正如前面所提到的那样,通过实现IJob接口来使你的.NET组件可以很简单地被scheduler执行。下面是IJob接口: namespace Quartz {      /// <summary>       /// The interface to be implemented by classes which represent a 'job' to be      /// performed.      /// </summary>      /// <remarks>      //
张善友
2018/01/19
7170
在.NET Core 中使用Quartz.NET
Quartz.NET是功能齐全的开源作业调度系统,可用于最小的应用程序到大型企业系统。
全球技术精选
2021/02/19
1.3K0
在.NET Core 中使用Quartz.NET
基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
在之前的文章《推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler》和《简单、轻量、功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇》中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件。今天再给大家介绍一款关于定时任务调度执行的组件–Quartz.Net,Quartz.Net是Java版Quartz的.NET实现。 相对FluentScheduler实现定时调度任务的使用简
Rector
2018/02/01
3.8K0
基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
Quartz.Net使用教程
在项目的开发过程中,难免会遇见后需要后台处理的任务,例如定时发送邮件通知、后台处理耗时的数据处理等,这个时候你就需要Quartz.Net了。
AI.NET 极客圈
2019/09/09
2.6K0
Quartz.Net使用教程
Quartz.NET 任务调度框架的demo实例
GoodTime
2023/10/31
4580
.NET使用 Quartz.NET 动态生成多个任务的实现
在代码中创建调度器(Scheduler)和触发器(Trigger)来配置和管理任务。
郑子铭
2024/12/24
2370
.NET使用 Quartz.NET 动态生成多个任务的实现
Quartz.NET实现作业调度
张果
2018/01/04
1.9K0
Quartz.NET实现作业调度
相关推荐
ASP.NET Core+Quartz.Net实现web定时任务
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验