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

跟[一线码农大佬]翻译的某技术文对个线

最近看到一线码农大佬翻译的《如何在 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实例。

翻源码:

//----------------选自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工厂类]动作的由来,  知其然更知其所以然,如有勘误,欢迎留言赐教。

Reference: 

ASP.NET Core+Quartz.Net实现web定时任务 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python统计字符串中字母个数字母无视大小写_判断一个字符串中字母的个数(无视大小写)...

其实Java学习中还是笔试中基本都会遇到这样类似的问题&#xff0c;统计一个字符串中a~z的个数&#xff1a;代码如下&#xff1a;public class Wheel {public static void main(String[] args) {// 定义一个字符串String abc "aaaabbbbAAABBBB";// 定义一个整形数组&…

真的,太多人辜负了.NET5!

.NET5发布一个月了&#xff0c;有没有动手试试&#xff1f;Windows服务器Visual Studio SQL Server做跨平台开发&#xff1f;那你真的辜负了这个时代&#xff01;强烈建议尝试下Linux&#xff0c;不仅是程序部署&#xff0c;而是全Linux环境开发、运行、部署.NET 5项目&#x…

数据结构——最小生成树之克鲁斯卡尔算法(Kruskal)

最小生成树算法 prime算法和克鲁斯卡尔算法 克鲁斯卡尔算法 思路 优先队列+并查集 Kuskal算法 【算法简介】:上一篇中的Prime算法是一种“加点式的算法”,而Kuskal算法是一种“加边式的算法”;Kuskal算法与Prime算法都是一种贪心算法,但Kruskal算法对图中存在相同权值的边…

react 版权问题_react使用fetch封装请求的方法-简单易懂

方法有很多种&#xff0c;这里贴一个比较优雅又简单易懂的。用class类写法&#xff0c;new一个实例方法。其中qs是包&#xff0c;类似于url拼接的方法&#xff0c;自行npm安装。我这里fetch使用的是dva的fetch&#xff0c;也可以自行使用自带的fetch &#xff0c;把const fetc…

总结 Visual Studio 2019 发布以来 XAML 工具的改进

不知不觉&#xff0c;Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了。虽然每次更新都林林总总地一大堆新功能和改进&#xff0c;但关于 XAML 的内容总是&#xff0c;always&#xff0c;每次都只有一点点。其实 Xamarin 相关的内容有在使劲地更新&#xff0c;不过和我做…

数据结构——最小生成树之prime算法(与最短路径之迪杰斯特拉算法很像)

最小生成树之prime算法 ***最小生成树:一个连通图的生成树中,所有边的权值加起来最小的生成树;称为最小生成树; 【简介】:Prime算法可在加权连通图里搜索最小生成树。即:所有边的权值之和为最小。 Prime算法是图论中求最小生成树的一种算法,与之类似的算法还有Kruskal算…

linux yum自动挂载_LINUX6安装YUM仓库和实现开机自动挂载

# LINUX6安装YUM仓库和实现开机自动挂载---------------------------------安装环境-------------------------------Redhat6镜像文件&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1DKH6adbrsipM-cTzH-wBgA 百度网盘 密码是hxcbVmware Workstation虚拟机工具&#x…

与您相约.NET Conf China 2020! 新进2位重磅嘉宾

2020年12月19日由.NET众多社区联合组织主办的2020年中国.NET开发者大会将于苏州盛大开幕&#xff0c;明天将发布大会的直播方案&#xff0c;敬请关注。时间&#xff1a;2020/12/19-12/20主题&#xff1a;开源、共享、创新地点&#xff1a;苏州人工智能产业园本次大会以“开源、…

数据结构——最短路径之Dijkstra算法(与最小生成树的prime算法很像,建议一起看)

最短路径之Dijkstra算法 (一)Dijkstra算法 单源最短路径:就是从某一个顶点出发,到图中任意顶点之间的最短路径; 【算法概述】:Dijkstra算法适用于解决单源最短路径的问题。即:从源点到任意指定顶点之间的最短距离的问题;但Dijkstra算法要求所有边的权值非负。看过Pri…

层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...

点击上方“蓝字”&#xff0c;关注我们吧&#xff01;目标检测是计算机视觉领域的一项重要任务, 是 生活中如实例分割[1] , 面部分析[2] , 汽车自动驾驶[3]、视 频分析[4] 等各种视觉应用的先决条件. 近些年, 伴随着深度卷积神经网络的充分发展[5] 以及良好的数据集注释先验工作…

Dapr微服务应用开发系列2:Hello World与SDK初接触

题记&#xff1a;上篇介绍了Dapr的环境配置&#xff0c;这次我们来动手尝试一下Dapr应用的开发Hello WorldDapr应用的Hello World其实和其他的Hello World一样简单&#xff1a;首先用你喜欢的语言和框架创建一个Hello World程序。比如在.NET 5下&#xff0c;就可以简单的这样实…

数据结构——最短路径算法之floyd算法

数据结构——最短路径算法之floyd算法 (一) Flody算法 【前言】:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径。那么,如果我们要求图中任意两个结点之间的最短路径,如何用算法来实现呢?如果用Dijkstra来实现,就需要每次改变源…

详解python运行三种方式_详解python调用cmd命令三种方法

目前我使用到的python中执行cmd的方式有三种使用os.system("cmd")该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况…

一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor

项目简介QuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心&#xff0c;实践应用 Ant Design Blazor 和 FreeSql 两个技术&#xff0c; 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦&#xff0c;对有 Quartz 有需求的小伙伴亦可以开箱即用Code First…

如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数&#xff0c;而如何去查看和设置 JVM 的 XX 参数也是调优的基本功&#xff0c;本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version&#xff0c;获取JDK版本…

ASP VNext 开源服务容错处理库Polly

背景Polly是一个.NET弹性和瞬态故障处理库&#xff0c;允许开发人员以流畅和线程安全的方式表达诸如重试&#xff0c;断路器&#xff0c;超时&#xff0c;隔离头和回退之类的策略。Polly面向.NET Standard 1.1&#xff08;覆盖范围&#xff1a;.NET Core 1.0&#xff0c;Mono&a…

python中定制类_python定制类__str__(实例详解)

在接下来的文章中,让我们明白什么是python中的自定义类。学习什么是python的自定义类,python定制类可以扮演何种角色在python编程。当你看到像__xxx__ __slots__变量或函数名,你应该注意他们。这些在Python中有特殊用途。我们已经知道如何使用__slots__,我们也知道__len__()方法…

如何在 C# 中使用 Exceptionless

背景“Exceptionless”一词的定义是&#xff1a;无例外。Exceptionless可为您的JavaScript&#xff0c;Node&#xff0c;.NET Core&#xff0c;ASP.NET&#xff0c;Web API&#xff0c;WebForms&#xff0c;WPF&#xff0c;控制台和MVC应用程序提供实时错误报告。它将收集到的信…

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言&#xff1a;从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用&#xff0c;我们在进行FPGA外设硬件及软件设计时&#xff0c;如ADC、PHY、DDR3等&#xff0c;通常会涉及到该资源。本节我们介绍以下知识点&#xff1a;SelectIO资源概述及结构SelectIO管脚通用设…

IdentityServer4系列 | 混合模式

一、前言在上一篇关于授权码模式中&#xff0c; 已经介绍了关于授权码的基本内容&#xff0c;认识到这是一个拥有更为安全的机制,但这个仍然存在局限&#xff0c;虽然在文中我们说到通过后端的方式去获取token,这种由web服务器和授权服务器直接通信&#xff0c;不需要经过用户的…