有关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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

一个基于.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版本…

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;不需要经过用户的…

3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...

大家都知道&#xff0c;现在不少的大佬比起用Word、Excel等等这些格式文件&#xff0c;它们更喜欢使用PDF文件。而我们不管是将Word、Excel等文件转换成PDF&#xff0c;还是将PDF转换成其他格式文件&#xff0c;都是一件麻烦事&#xff0c;更别说在手机上操作这一切了。别担心&…

如何使用 C# 中的 Tuple

开局一张图&#xff0c;首先声明的是 Tuple 不是什么新鲜概念&#xff0c;在编程语言 F#&#xff0c;Python 中早就有这个了&#xff0c;Tuple 是一种 有序的&#xff0c;有限不可变的&#xff0c;支持混杂类型的固定个数的 一种数据结构&#xff0c;有些朋友可能就想问了&…

中设置colorbar_【值得收藏】如何画出学术论文中需要的各种精美插图,看这一篇就够了!...

本文整理自知乎问答&#xff0c;仅用于学术分享&#xff0c;著作权归作者所有。如有侵权&#xff0c;请联系后台作删文处理。方法一作者&#xff5c;冯昱尧https://www.zhihu.com/question/21664179/answer/18928725强烈推荐 Python 的绘图模块 matplotlib: python plotting 。…

GraphQL:Descriptor Attributes

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述&#xff0c;使得客户端能够准确地获得它需要的数据&#xff0c;而且没有任何冗余&#xff0c;也让 API 更容易地随着时间推移而演进&#xff0c…

idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上

在IDEA中如何初始化Git&#xff0c;把项目推送到Git上登录Gitee(码云)账号&#xff0c;新建仓库先按如下步骤简单新建一个仓库&#xff1a;创建成功后&#xff0c;会出现下图中所示的原始文件&#xff1a;在IDEA上的Terminal中进行操作注意&#xff1a;可能有些朋友刚打开Termi…

大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍

紧急提醒&#xff1a;还有1天&#xff01;2020.NET开发者大会就要开幕啦&#xff01;你都做好参会准备没有&#xff1f;特殊时期&#xff0c;为方便小伙伴们顺利参会&#xff0c;小编特意整理了这篇大会参会攻略&#xff0c;大到各种日程安排、小到签到、出行、防疫等&#xff…

大曾幽默打油诗_这才是真正的幽默打油诗,逗人一笑,又引人深思!

阅读本文前&#xff0c;请您先点击上面的蓝色字体“点点星光”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注来源&#xff1a;诗词天地大曾 &#xff0c;曾初良&#xff0c;也乐斋主&#xff0c…

编程去除背景绿幕抠图,基于.NET+OpenCVSharp

摘要&#xff1a;本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式&#xff0c;对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatExpr等托管资源释放的方法。本文还介绍了“高效摄像头播放控件”以及和OpenCVSharp的性…

.NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

2.2.1 核心模块--依赖注入什么是依赖注入.NET Core DI 生命周期服务设计服务范围检查ASP.NET Core 依赖注入&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?viewaspnetcore-5.0什么是依赖注入Dependency injection 依赖注入Inv…

vue ref 绑定的事件需要移除吗_Vue易遗忘的基础复习(二)

数据请求Vue-resource请求在Vue2.0之后已经被舍弃2. fetch请求因为传统 Ajax &#xff08;指 XMLHttpRequest&#xff09;存在一些令人头疼的问题&#xff1a;配置和调用方式非常混乱&#xff0c;而且基于事件的异步模型写起来也没有现代的 Promise&#xff0c;generator/yield…

如何在 ASP.NET Core 中使用 API 分析器

ASP.NET Core 2.2 引入了 API 分析器&#xff0c;它有利于提高 API 的文档化&#xff0c;API分析器 可以应用在任何带有 ApiController 特性的 Controller 上&#xff0c;本篇就和大家一起讨论下。安装 API 分析器 如果你使用的是 ASP.NET Core 2.2 的话&#xff0c;用 Visual …

.net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...

substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数例子&#xff1a;strwww.google.com1.count是正数&#xff0c;那么就是从左往右数&#xff0c;第N个分隔符的左边的全部内容SELECT SUBSTRING_INDEX(www.google.com,.,1);结果是&#xff1a;wwwSELEC…