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

最近看到一线码农大佬翻译的《如何在 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定时任务

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

  1. 对 精致码农大佬 说的 Task.Run 会存在 内存泄漏 的思考

    一:背景 1. 讲故事 这段时间项目延期,加班比较厉害,博客就稍微停了停,不过还是得持续的技术输出呀!园子里最近挺热闹的,精致码农大佬分享了三篇文章: 为什么要小心使用 Task.Run   [htt ...

  2. 对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相

    一:背景 1. 讲故事 昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为:[C#.NET 拾遗补漏]10:理解 volatile 关键字 (https://www.cnblogs.com/will ...

  3. java 调用dll内存泄露_对 精致码农大佬 说的 Task.Run 会存在 内存泄漏 的思考

    一:背景 1. 讲故事 这段时间项目延期,加班比较厉害,博客就稍微停了停,不过还是得持续的技术输出呀!园子里最近挺热闹的,精致码农大佬分享了三篇文章: 为什么要小心使用 Task.Run   [htt ...

  4. qthread run结束了算销毁吗_对 精致码农大佬 说的 Task.Run 会存在 内存泄漏 的思考...

    一:背景 1. 讲故事 这段时间项目延期,加班比较厉害,博客就稍微停了停,不过还是得持续的技术输出呀! 园子里最近挺热闹的,精致码农大佬分享了三篇文章: 为什么要小心使用 Task.Run [http ...

  5. 从一线码农到阿里技术合伙人 P11的少林扫地僧多隆,人家牛逼是种习惯

    热文导读 | 点击标题阅读 欢迎加入Java和Android架构知识星球 2018年Android中高级面试题含答案 分享一张牛逼的程序员职业路线图给你们! 2014年,阿里巴巴上市前最后一次实质性更 ...

  6. 从一道面试题谈谈一线大厂码农应该具备的基本能力

    作者:Yura Shevchenko 来源:skypixel.com 关于一线码农的面试,我想说 求职面试在绝大部分人来说都是必不可少的,自己作为求职者也参与了不少面试(无论成功或者失败),作为技术面 ...

  7. 码农翻身全年文章精华

    在码农翻身公众号写了一年多, 最大的体会就是:原创真心不易! 每天思考的最大问题就是: 下一篇文章写啥? 在大家的支持和鼓励下,还是坚持了下来,  回头看看走过的路,这一年过得还算充实. 很快就要过年 ...

  8. 码农翻身 各章节链接

    大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大 ...

  9. 码农翻身全年文章精华2016

    在码农翻身公众号写了一年多, 最大的体会就是:原创真心不易! 每天思考的最大问题就是: 下一篇文章写啥? 在大家的支持和鼓励下,还是坚持了下来,  回头看看走过的路,这一年过得还算充实. 很快就要过年 ...

最新文章

  1. 算法-----------猜数字大小
  2. linux 安装分区设置分区大小
  3. salt return mysql_mysql中储存salt返回结果
  4. Trapper: Transformer模型都在此!
  5. Linux常见的一些性能监控命令
  6. 实现DDD领域驱动设计: Part 2
  7. c3074 无法使用带圆括号的_地埋警示带预防挖掘 石油管道警示带保护管道安全...
  8. 白帽子发现美军网站SQL注入漏洞,可获取敏感数据
  9. Spring Cloud与Docker微服务架构实战--阅读笔记
  10. py-R-FCN安装
  11. Ubuntu安装腾达u12驱动
  12. 一文详解Adobe Photoshop 2020安装教程
  13. 怎么批量给文件夹名称加上数字序号前缀?怎么对文件夹名称进行编号排序?
  14. Pinterest和Instagram哪个更好用?姐妹还是天敌...
  15. 《C++ API设计》摘录
  16. 【实习日报】2019年4月下半月 前端开发实习工作日报汇总
  17. php strpos 编码问题,PHP代码审计04之strpos函数使用不当
  18. 棠玥寕在剧组被拍,典雅古装照流出!
  19. Python 税额计算器
  20. MCS-51单片机指令系统--数据传送指令

热门文章

  1. [Java] java中的接口定义
  2. sql面试语句与后台调用js提示语句
  3. 一个不错的游戏 - flash webgame
  4. 电脑pin重置_如果忘记了如何重置Windows PIN
  5. 【20181026T2】**图【最小瓶颈路+非旋Treap+启发式合并】
  6. css3-13 如何改变文本框的轮廓颜色
  7. 《工具癖》Mac与Windows获取文件绝对路径的快捷键
  8. weblogic清除缓存
  9. 使用T-SQL找出执行时间过长的作业
  10. javascript理论篇(详情见地址)