NET Core使用Quartz

一、前言运用场景

Quartz.Net是一个强大、开源、轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的数据,又或者每月初需要统计上月的数据。当然也会出现既要统计日的也统计月的还需要进行其他的操作。那我们改如何来写这样的调度任务呢?

二、实际运用(.Net Core 2.2)

在一个解决方案中创建一个.Net控制台应用程序及一个类库,控制台应用程序用来作为程序的启动点。类库用来作为调度任务的执行程序。

然后我们需要完善一下项目的结构,首先我们得在控制台应用程序中创建一个Startup类,这个类也是任务启动的一个重要条件。

  1. public class Startup
  2. {
  3.  
  4. public Startup(IConfiguration configuration)
  5. {
  6.  
  7. Configuration = configuration;
  8.  
  9. }
  10.  
  11. public IConfiguration Configuration { get; }
  12.  
  13. // This method gets called by the runtime. Use this method to add services to the container.
  14.  
  15. public void ConfigureServices(IServiceCollection services)
  16. {
  17.  
  18. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  19.  
  20. }
  21.  
  22. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  23. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  24. {
  25.  
  26. if (env.IsDevelopment())
  27. {
  28. app.UseDeveloperExceptionPage();
  29. }
  30. else
  31. {
  32. app.UseExceptionHandler("/Error");
  33. }
  34. app.UseMvc();
  35. }
  36. }

  然后项目会报一定的错误,根据错误信息一步一步解决,解决方案:添加NuGet包 Microsoft.AspNetCore

解决错误信息之后意味着目前启动程序还算ok了,接下来我们可以详细讲下Quartz调度任务执行。

因为我们肯定不仅仅执行一个调度任务,实际项目运行中肯定是多个调度任务一起执行的,所以我们思路可以转变一下。在类库创建一个公共启动中心,同时引用NuGet包:Quartz。然后开始创建调度任务的公共核心

  1.     private IScheduler scheduler;
  2. /// <summary>
  3.  
  4. /// 创建调度任务的入口
  5.  
  6. /// </summary>
  7.  
  8. /// <returns></returns>
  9.  
  10. public async Task Start()
  11. {
  12. await StartJob();
  13. }
  14.  
  15. /// <summary>
  16. /// 创建调度任务的公共调用中心
  17. /// </summary>
  18. /// <returns></returns>
  19. public async Task StartJob()
  20. {
  21. //创建一个工厂
  22. NameValueCollection param = new NameValueCollection()
  23. {
  24. { "testJob","test"}
  25. };
  26. StdSchedulerFactory factory = new StdSchedulerFactory(param);
  27. //创建一个调度器
  28. scheduler = await factory.GetScheduler();
  29. //开始调度器
  30. await scheduler.Start();
  31.  
  32. //每三秒打印一个info日志
  33. await CreateJob<StartLogInfoJob>("_StartLogInfoJob", "_StartLogInfoJob", " 0/3 * * * * ? ");
  34.  
  35. //每五秒打印一个debug日志
  36. await CreateJob<StartLogDebugJob>("_StartLogDebugJob", "_StartLogDebugJob", " 0/5 * * * * ? ");
  37. //调度器时间生成地址-- http://cron.qqe2.com
  38.  
  39. }
  40.  
  41. /// <summary>
  42. /// 停止调度器
  43. /// </summary>
  44. public void Stop()
  45. {
  46. scheduler.Shutdown();
  47.        scheduler=null;
  48. }
  49.  
  50. /// <summary>
  51. /// 创建运行的调度器
  52. /// </summary>
  53. /// <typeparam name="T"></typeparam>
  54. /// <param name="name"></param>
  55. /// <param name="group"></param>
  56. /// <param name="cronTime"></param>
  57. /// <returns></returns>
  58. public async Task CreateJob<T>(string name,string group, string cronTime) where T: IJob
  59. {
  60. //创建一个作业
  61. var job = JobBuilder.Create<T>()
  62. .WithIdentity("name" + name, "gtoup" + group)
  63. .Build();
  64. //创建一个触发器
  65. var tigger = (ICronTrigger)TriggerBuilder.Create()
  66. .WithIdentity("name" + name, "group" + group)
  67. .StartNow()
  68. .WithCronSchedule(cronTime)
  69. .Build();
  70.  
  71. //把作业和触发器放入调度器中
  72. await scheduler.ScheduleJob(job, tigger);
  73. }

然后再去创建两个执行业务逻辑的类,分别是StartLogInfoJob和StartLogDebugJob

  1. public class StartLogInfoJob:IJob
  2. {
  3. public async Task Execute(IJobExecutionContext context)
  4. {
  5. await Start();
  6. }
  7. public async Task Start()
  8. {
  9. LogHelp.Debug("调度打印Debug");
  10. }
  11. }
  12.  
  13. public class StartLogDebugJob : IJob
  14. {
  15. public async Task Execute(IJobExecutionContext context)
  16. {
  17. await Start();
  18. }
  19. public async Task Start()
  20. {
  21. LogHelp.Info("调度打印Info");
  22. }
  23. }

到这里就顺利的完成了一个定时调度器来执行任务了,最后我们得把这个Program文件重新写一下,控制台应用程序生成的Program文件不太符合我们需要要求,同时把调度器在这里面启动。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. HandleStart();
  6. var webHostArgs = args.Where(arg => arg != "--console").ToArray();
  7. var host = WebHost.CreateDefaultBuilder(webHostArgs)
  8. .UseStartup<Startup>()
  9. .UseKestrel(options => {
  10. options.Limits.MinRequestBodyDataRate = null;
  11. })
  12. .Build();
  13. host.Run();
  14. }
  15. static void HandleStart()
  16. {
  17. try
  18. {
  19. new Scheduler().Start().GetAwaiter().GetResult();
  20. }
  21. catch (Exception ex)
  22. {
  23. LogHelp.Error(ex);
  24. }
  25. }
  26. }

我们去看文件夹下面Log文件会发现有一个Debug和一个Info

到这里我们的调度就完成了,我们需要使用的时候将打印日志更换成我们日常想要处理的业务逻辑就可以了。刚刚提到打印日志就顺便提一下在.Net Core中如何打印日志吧。

三、.Net Cor打印日志文件

打印日志文件主要是用到了NuGet包:NLog,然后再加上一个NLog.config,首先在项目中安装NLog的包,然后创建一个LogHelper的公共类。

  1. public class LogHelp
  2. {
  3. static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
  4.  
  5. public static void Debug(string info)
  6. {
  7. logger.Debug(info);
  8. }
  9.  
  10. public static void Info(string info)
  11. {
  12. logger.Info(info);
  13. }
  14.  
  15. public static void Error(Exception ex, string info = "")
  16. {
  17. logger.Error(ex);
  18. }
  19.  
  20. }

然后再添加一个NLog.config文件

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
  4. <targets>
  5. <target name="defaultlog" xsi:type="File" keepFileOpen="false" encoding="utf-8"
  6. fileName="${basedir}/logs/${level}/${shortdate}.log"
  7. layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
  8. </targets>
  9.  
  10. <rules>
  11. <logger name="*" minlevel="trace" writeTo="defaultlog" />
  12. </rules>
  13. </nlog>

完成这两个就可以实现日志的打印了。。

NET Core使用Quartz的更多相关文章

  1. .net core+topshelf+quartz创建windows定时任务服务

    .net core+topshelf+quartz创建windows定时任务服务 准备工作 创建.net core 控制台应用程序,这里不做过多介绍 添加TopShelf包:TopShelf: 添加Q ...

  2. .NET Core开源Quartz.Net作业调度框架实战演练

    一.需求背景 人生苦短,我用.NET Core!作为一枚后端.NET开发人员,项目实践常遇到定时Job任务的工作,在Windows平台最容易想到的的思路Windows Service服务应用程序,而在 ...

  3. .NET Core使用Quartz执行调度任务进阶

    一.前言运用场景 Quartz.Net是一个强大.开源.轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的数据,又或者每月初需要统计上月的数 ...

  4. .NET Core使用Quartz执行调度任务进阶(转)

    一.前言运用场景 Quartz.Net是一个强大.开源.轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计前一天的数据,又或者每月初需要统计上月的数 ...

  5. .net core中Quartz的使用

    原来工作中有用到定时任务Quartz,不过是在MVC项目中,现在net core项目中也要用到,就开始改版.中间发现在网上的教程只有执行定时计划的过程,却很少有人写注册的过程,觉得有点略坑.所以写此文 ...

  6. .Net core使用Quartz.Net 实现定时任务

    很多情况下,我们需要完成一些定时执行的功能,用很多定时工具,像:hangfire,TimeJob,以及Quartz.net,不过quartz.net 比较精确一些,功能也比较强大,所以我选择了Quar ...

  7. AspNet Core结合Quartz使用定时任务且通过注入缓存或者配置参数

    一.经常在项目会用到定时任务同步数据或更新缓存等操作,在很久以前我们可能经常会用一个多线程或timer来做定时任务,这样能实现比较简单轻量级的任务:对于任务多且都调用频率不一样的任务,我们都会用到Qu ...

  8. ASP.NET Core使用Quartz定时调度

    在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...

  9. .NET Core中Quartz.NET的依赖注入

    目录 介绍 项目概况 创建配置文件 使用构造函数注入 使用选项模式 结论 介绍 Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务.然而,它的局限性在于,默认情况下,它仅支持 ...

随机推荐

  1. 集群 openfire

    openfire_3.8.2集群配置 测试机4台1.四台机器都安装openfire,随即一台安装mysql,执行openfire_mysql.sql脚本.2.四台机器都配置到同一个mysql机器上(不 ...

  2. windowService中使用多线程

    windowService中使用多线程 代码 using System;using System.Collections.Generic;using System.Linq;using System. ...

  3. EVC入门之二: 在未被加载的DLL中设置断点 (虽然没有遇到这个问题,不过先摘抄下来)

    问题: 这个问题居然也郁闷了我一段时间. 我们假设在EVC里建立了一个project, 里面有SubProject_1(以下简称SB1,嘿嘿), 编译生成一个EXE; SubProject_2(以下简 ...

  4. JQuery添加删除标签

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <script src= ...

  5. liunx命令之:命令链接ftp服务器

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  6. ASM认证与口令文件

    ASM认证 ORACLE ASM 实例没有数据字典,所以连接ASM 实例只能通过如下三种系统权限来进行连接: SYSASM,SYSDBA,SYSOPER. 可以通过如下三种模式来连接ASM 实例:1. ...

  7. JSOI2008星球大战——联通块数量

    题目:https://www.luogu.org/problemnew/show/1197 此题不能按时间顺序进行删点.求连通块数量,而应打破时间的思维,先形成一张没有要删去的点的图,再从后往前逐个加 ...

  8. hadoop之一:概念和整体架构

    什么是hadoop? Apache Hadoop是一款支持数据密集型分布式应用并以Apache 2.0许可协议发布的开源软件框架.它支持在商品硬件构建的大型集群上运行的应用程序.Hadoop是根据Go ...

  9. mina2中的线程池

    一.Mina中的线程池模型 前面介绍了Mina总体的层次结构,那么在Mina里面是怎么使用Java NIO和进行线程调度的呢?这是提高IO处理性能的关键所在.Mina的线程调度原理主要如下图所示: A ...

  10. Component概念

    转自:http://www.cnblogs.com/NEOCSL/archive/2012/05/06/2485227.html 1.总结 Component就是组建的意思,可以在DefaultPro ...