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

 更新时间:2019-06-25 03:01:51   作者:佚名   我要评论(0)

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

一、前言运用场景

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

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

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

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

public class Startup
  {

    public Startup(IConfiguration configuration)
    {

      Configuration = configuration;

    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.

    public void ConfigureServices(IServiceCollection services)
    {

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    }

 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }
      else
      {
        app.UseExceptionHandler("/Error");
      }
      app.UseMvc();
    }
  }

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

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

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

private IScheduler scheduler;
    /// <summary>

    /// 创建调度任务的入口

    /// </summary>

    /// <returns></returns>

    public async Task Start()
    {
      await StartJob();
    }

    /// <summary>
    /// 创建调度任务的公共调用中心
    /// </summary>
    /// <returns></returns>
    public async Task StartJob()
    {
      //创建一个工厂
      NameValueCollection param = new NameValueCollection()
      {
        { "testJob","test"}
      };

      StdSchedulerFactory factory = new StdSchedulerFactory(param);
      //创建一个调度器
      scheduler = await factory.GetScheduler();
      //开始调度器
      await scheduler.Start();

      //每三秒打印一个info日志
      await CreateJob<StartLogInfoJob>("_StartLogInfoJob", "_StartLogInfoJob", " 0/3 * * * * ? ");

      //每五秒打印一个debug日志
      await CreateJob<StartLogDebugJob>("_StartLogDebugJob", "_StartLogDebugJob", " 0/5 * * * * ? ");

      //调度器时间生成地址--    http://cron.qqe2.com

    }

    /// <summary>
    /// 停止调度器      
    /// </summary>
    public void Stop()
    {
      scheduler.Shutdown();
       scheduler=null;
    }

    /// <summary>
    /// 创建运行的调度器
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="name"></param>
    /// <param name="group"></param>
    /// <param name="cronTime"></param>
    /// <returns></returns>
    public async Task CreateJob<T>(string name,string group, string cronTime) where T: IJob
    {
      //创建一个作业
      var job = JobBuilder.Create<T>()
        .WithIdentity("name" + name, "gtoup" + group)
        .Build();

      //创建一个触发器
      var tigger = (ICronTrigger)TriggerBuilder.Create()
        .WithIdentity("name" + name, "group" + group)
        .StartNow()
        .WithCronSchedule(cronTime)
        .Build();

      //把作业和触发器放入调度器中
      await scheduler.ScheduleJob(job, tigger);
    }

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

public class StartLogInfoJob:IJob
  {
    public async Task Execute(IJobExecutionContext context)
    {
      await Start();
    }
    public async Task Start()
    {
      LogHelp.Debug("调度打印Debug");
    }
  }

 
public class StartLogDebugJob : IJob
  {
    public async Task Execute(IJobExecutionContext context)
    {
      await Start();
    }
    public async Task Start()
    {
      LogHelp.Info("调度打印Info");
    }
  }

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

class Program
  {
    static void Main(string[] args)
    {
      HandleStart();
      var webHostArgs = args.Where(arg => arg != "--console").ToArray();
      var host = WebHost.CreateDefaultBuilder(webHostArgs)
        .UseStartup<Startup>()
        .UseKestrel(options => {
          options.Limits.MinRequestBodyDataRate = null;
        })
        .Build();
      host.Run();
    }
    static void HandleStart()
    {
      try
      {
        new Scheduler().Start().GetAwaiter().GetResult();
      }
      catch (Exception ex)
      {
        LogHelp.Error(ex);
      }
    }
  }

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

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

三、.Net Cor打印日志文件

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

public class LogHelp
  {
    static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    public static void Debug(string info)
    {
      logger.Debug(info);
    }

    public static void Info(string info)
    {
      logger.Info(info);
    }

    public static void Error(Exception ex, string info = "")
    {
      logger.Error(ex);
    }

}

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

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">

 <targets>
  <target name="defaultlog" xsi:type="File" keepFileOpen="false" encoding="utf-8"
    fileName="${basedir}/logs/${level}/${shortdate}.log"
    layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />
 </targets>

 <rules>
  <logger name="*" minlevel="trace" writeTo="defaultlog" />
 </rules>
</nlog>

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

以上所述是小编给大家介绍的.NET Core使用Quartz执行调度任务进阶详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

  • .net core中Quartz的使用方法
  • .Net Core中使用Quartz.Net实践记录
  • 简单谈谈.NET Core跨平台开发
  • win10下ASP.NET Core部署环境搭建步骤
  • Windows Server 2012 R2 Standard搭建ASP.NET Core环境图文教程
  • asp.net core实现文件上传功能
  • 在ASP.NET Core中实现一个Token base的身份认证实例
  • 谈谈如何在ASP.NET Core中实现CORS跨域
  • 解决asp.net core在输出中文时乱码的问题
  • 详解ASP.NET Core Token认证

相关文章

  • 详解.NET Core使用Quartz执行调度任务进阶

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

    一、前言运用场景 Quartz.Net是一个强大、开源、轻量的作业调度框架,在平时的项目开发当中也会时不时的需要运用到定时调度方面的功能,例如每日凌晨需要统计
    2019-06-25
  • 详解asp.net core重新加载应用配置

    详解asp.net core重新加载应用配置

    asp.net core重新加载应用配置Intro 我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是
    2019-06-25
  • Visual Studio 2015下载和安装图文教程

    Visual Studio 2015下载和安装图文教程

    本文实例为大家分享了Visual Studio 2015下载和安装的具体步骤,供大家参考,具体内容如下 我的电脑系统:Windows 10 64位 下载: 下载网站 选择 ISO(离线安
    2019-06-25
  • .NET Core 迁移躺坑记续集之Win下莫名其妙的超时

    .NET Core 迁移躺坑记续集之Win下莫名其妙的超时

    继上一集里说到遇到的各种问题并且弄了n个解决方案之后,特别是对于问题4的解决方案对于切换了HttpClientFactory 我用了你家netcore 2.1下专门解决之前HttpCl
    2019-06-25
  • 详解使用DotNet CLI创建自定义的WPF项目模板

    详解使用DotNet CLI创建自定义的WPF项目模板

    本文主要介绍了使用DotNet CLI创建自定义的WPF项目模板,分享给大家,具体如下: 描述 当我们安装完 DotNetCore 3.0 版本的 SDK 后,我们就可以创建基于 Dot
    2019-06-25
  • Asp.Net Core Web应用程序—探索

    Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要。 因为,目前微软已经搞
    2019-06-25
  • .NET CORE中使用AutoMapper进行对象映射的方法

    .NET CORE中使用AutoMapper进行对象映射的方法

    简介 AutoMapper uses a fluent configuration API to define an object-object mapping strategy. AutoMapper uses a convention-based matching algorit
    2019-06-25
  • VS2019离线安装方法图文教程

    VS2019离线安装方法图文教程

    本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发、.NET 桌面开发相关的工作负载、MFC 可选组件及帮助查看器。 工作负载(Workload
    2019-06-25
  • 详解.net core日记记录

    详解.net core日记记录

    ASP.NET Core 有内置的log组件,遗憾的是看了微软官方文档,貌似无法直接将日志存于文件或数据库,只能由自己实现或引用第三方日志组件。 以下为Nlog和log4ne
    2019-06-25
  • 详解log4net的使用

    详解log4net的使用

    程序中只需要引用log4net.dll文件即可 配置的引用 log4net.Config.XmlConfigurator.Configure(); 首先添加以上代码。 CS程序:在Main方法中添加; BS程序:
    2019-06-25

最新评论