zoukankan      html  css  js  c++  java
  • ASP.NET Core使用Quartz定时调度

    在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度

    一、Quartz使用步骤

    1. 创建调度器scheduler,并开启
    2. 创建Job作业
    3. 创建tigger触发器
    4. 把作业和触发器放入调度器中

    二、Quartz的API

    • IScheduler - 与 scheduler 进行交互的主要接口
    • IJob - 你希望被 scheduler 执行的组件的接口
    • IJobDetail - 用于定义 Jobs 实例
    • ITrigger - 定义将会在scheduler上执行的 job 上的组件
    • JobBuilder - 用于定义或建立(define/build) JobDetail 实例,JobDetail定义了Jobs实例
    • TriggerBuilder - 用于定义或建立 Trigger 实例

    三、使用Quartz

    1、在使用Quartz之前需添加引用,在程序包管理控制台中执行命令安装依赖包

    Install-Package Quartz -Version 3.0.7

    2、创建调度类QuartzPro

    using Quartz;
    using Quartz.Impl;
    using System.Collections.Specialized;
    using System.Threading.Tasks;
    
    namespace Test123
    {
        public class QuartzPro
        {
            private IScheduler scheduler;
            // 创建调度任务的入口
            public async Task Start()
            {
                await StartJob();
            }
            // 创建调度任务的公共调用中心
            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 * * * * ? ");
                //调度时间生成地址 http://cron.qqe2.com
            }
            // 停止调度
            public void Stop()
            {
                scheduler.Shutdown();
                scheduler = null;
            }
            // 创建运行的调度器
            public async Task CreateJob<T>(string name, string group, string cronTime) where T : IJob
            {
                //创建一个作业
                var job = JobBuilder.Create<T>()
                    .WithIdentity("name" + name, "group" + group)
                    .Build();
                //创建一个触发器
                var tigger = (ICronTrigger)TriggerBuilder.Create()
                    .WithIdentity("name" + name, "group" + group)
                    .StartNow()
                    .WithCronSchedule(cronTime)
                    .Build();
                //把作业和触发器放入调度器中
                await scheduler.ScheduleJob(job, tigger);
            }
        }
    }

    3、创建业务逻辑类StartLogInfoJob

    using Quartz;
    using System.Threading.Tasks;
    
    namespace Test123
    {
        public class StartLogInfoJob : IJob
        {
            public async Task Execute(IJobExecutionContext context)
            {
                await Start();
            }
            public async Task Start()
            {
                LogHelp.LogTxt("调度打印Info");
            }
        }
    }

    4、创建打印日志类LogHelp

    using System;
    using System.IO;
    using System.Text;
    
    namespace Test123
    {
        public class LogHelp
        {
            public static void LogTxt(string info)
            {
                string FilePath = Environment.CurrentDirectory + "/LogTxt.txt";
                StringBuilder msg = new StringBuilder();
                msg.Append("*************************************** 
    ");
                msg.AppendFormat(" 打印时间: {0} 
    ", DateTime.Now);
                msg.AppendFormat(" 打印内容: {0} 
    ", info);
                msg.Append("***************************************");
                try
                {
                    if (File.Exists(FilePath))
                    {
                        using (StreamWriter tw = File.AppendText(FilePath))
                        {
                            tw.WriteLine(msg.ToString());
                        }
                    }
                    else
                    {
                        TextWriter tw = new StreamWriter(FilePath);
                        tw.WriteLine(msg.ToString());
                        tw.Flush();
                        tw.Close();
                        tw = null;
                    }
                }
                catch (Exception exx)
                {
                    Console.ReadKey();
                }
            }
        }
    }
    

    5、重写控制台应用程序的Program文件

    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using QuartzText;
    using System;
    using System.Linq;
    
    namespace Test123
    {
        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 QuartzPro().Start().GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    throw;
                }
            }
        }
    }

    日志每隔三秒打印一次

    End!

  • 相关阅读:
    批量数据导入数据库方法
    Remoting简单实践
    js面向对象继承
    Linq实现t-Sql的各种连接
    数据库树状结构的关系表的删除方案
    记录一次SQL查询语句
    mvc请求过程总结
    T-sql表表达式
    各个浏览器的兼容问题及样式兼容处理(不定期补充)
    vue.js 键盘enter事件的使用
  • 原文地址:https://www.cnblogs.com/gygg/p/11851409.html
Copyright © 2011-2022 走看看