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

     作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本。

但是很多时候,若使用的是共享主机或者受控主机,这些主机不允许你私自安装exe程序、Windows服务程序。

      码甲会想到在web程序中做定时任务, 目前有两个方向:

①.AspNetCore自带的HostService, 这是一个轻量级的后台服务, 需要搭配timer完成定时任务

②.老牌Quartz.Net组件,支持复杂灵活的Scheduling、支持ADO/RAM Job任务存储、支持集群、支持监听、支持插件。

 此处我们的项目使用稍复杂的Quartz.net实现web定时任务。

 

项目背景

       最近需要做一个计数程序:采用redis计数,设定每小时当日累积数据持久化到关系型数据库sqlite。

       添加Quartz.Net Nuget 依赖包:<PackageReference Include="Quartz" Version="3.0.6" />

①.定义定时任务内容: Job

②.设置触发条件: Trigger

③.将Quartz.Net集成进AspNet Core

 

头脑风暴

       IScheduler类包装了上述背景需要完成的第①②点工作 ,SimpleJobFactory定义了生成指定的Job任务的过程,这个行为是利用反射机制调用无参构造函数构造出的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>        
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信