• Quartz.net任务调度


    一、Quartz.net简介

      Quartz.net是一个开源的任务调度框架,很多定时任务、调度任务都可以用这个框架,如定时日志等。

    二、Quartz.net用途

    • 定时给女朋友发送消息
    • 女朋友生日的时候定时提醒
    • 购物定时打折任务

    三、Quartz.net实例

    • 安装

         Quartz.net的安装通过 NuGet包管理 安装,打开 NuGet包管理,搜索Quartz.net,点击安装。

     也可以在nuget控制台输入:Install-Package Quartz实现安装。

    • 实现

    继承IJob接口,实现Execute方法,以下是一个简单的定时写日志的实现

    public class WriteLogJob : IJob
        {
            /// <summary>
            /// 实现接口
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            public Task Execute(IJobExecutionContext context)
            {
                Task task = null;
                try
                {
                    string fileName = "quartzLog.txt";
                    using (StreamWriter writer = new StreamWriter(fileName, true))
                    {
                        task = writer.WriteAsync($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\r\n");
                    }
                }
                catch (Exception)
                {
    
                }
    
                return task;
            }
        }

    • 配置和自定义管理IScheduler
     public class QuartzHelper
        {
            static readonly IScheduler scheduler;
            static QuartzHelper()
            {
                try
                {
                    var properties = new NameValueCollection();
                    //1.设置线程池
                    properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
                    //2.设置线程池最大数量
                    properties["quartz.threadPool.threadCount"] = "5";
                    //3.设置作业中每个线程的优先级
                    properties["quartz.threadPool.threadPriority"] = System.Threading.ThreadPriority.Normal.ToString();
                    //4.远程输出配置
                    properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
                    properties["quartz.scheduler.exporter.port"] = "5555";
                    properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
                    properties["quartz.scheduler.exporter.channelType"] = "tcp";
    
    
    
                    //properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
                    ////设置线程池的最大线程数量
                    //properties["quartz.threadPool.threadCount"] = "5";
                    ////设置作业中每个线程的优先级
                    //properties["quartz.threadPool.threadPriority"] = System.Threading.ThreadPriority.Normal.ToString();
    
                    //// 远程输出配置
                    //properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
                    //properties["quartz.scheduler.exporter.port"] = "555";  //配置端口号
                    //properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
                    //properties["quartz.scheduler.exporter.channelType"] = "tcp"; //协议类型
    
    
                    //5.创建一个工程
                    var schedulerFactory = new StdSchedulerFactory(properties);
                    //6.启动
                    scheduler = schedulerFactory.GetScheduler().Result;
                    //7.      一、开启调度
                    scheduler.Start();
    
                }
                catch (Exception ex)
                {
    
                }
            }
            /// <summary>
            /// 时间间隔执行任务
            /// </summary>
            /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
            /// <param name="seconds">时间间隔(单位:秒)</param>
            public static async Task<bool> ExecuteInterval<T>(int seconds) where T : IJob
            {
                try
                {
                    //2、创建工作任务
                    IJobDetail job = JobBuilder.Create<T>().Build();
                    // 3、创建触发器
                    ITrigger trigger = TriggerBuilder.Create().StartNow().
                        WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds)
                                            //x.WithIntervalInMinutes(1)
                                            .RepeatForever())
                                            .Build();
                    //4、将任务加入到任务池
                    await scheduler.ScheduleJob(job, trigger);
                    return true;
                }
                catch (Exception ex)
                {
    
                    return false;
                }
            }
    
            /// <summary>
            /// 指定时间执行任务
            /// </summary>
            /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
            /// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
            public static async Task<bool> ExecuteByCron<T>(string cronExpression) where T : IJob
            {
                try
                {
                    //2、创建工作任务
                    IJobDetail job = JobBuilder.Create<T>().Build();
                    //3、创建触发器
                    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
       .StartNow()
       .WithCronSchedule(cronExpression)
       .Build();
                    //4、将任务加入到任务池
                    await scheduler.ScheduleJob(job, trigger);
                    return true;
                }
                catch (Exception ex)
                {
    
                    return false;
                }
            }
        }
    • 采用时间表达式来定时执行
      string cronExpression = "0/5 0/1 11 * * ? ";  //=>11点没五秒执行一次调度任务
              
       QuartzHelper.ExecuteByCron<WriteLogJob>(cronExpression).Wait();
    • 定时执行
    QuartzHelper.ExecuteInterval<WriteLogJob>(2).Wait();

    以上便是Quartz简单使用方法。

  • 相关阅读:
    springboot多环境配置
    张欢老师的java学习路线图
    ai换脸教程
    状态机
    springboot集成mbatisplus+shardingjdbc+读写分离
    Groovy 和springboot集成
    Map+函数式接口解决 ifelse
    12个好玩的电脑屏保,你最喜欢哪个
    boss直聘在网页上直接回复消息
    跨域问题怎么解决
  • 原文地址:https://www.cnblogs.com/Koalin/p/11684869.html
Copyright © 2020-2023  润新知