zoukankan      html  css  js  c++  java
  • 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简单使用方法。

  • 相关阅读:
    python模块--time模块
    python模块--如何相互调用自己写的模块
    Animating Views Using Scenes and Transitions
    fragment 切换
    android textview 设置text 字体
    android intent 5.1
    android EditView ime
    animation of android (4)
    animation of android (3)
    animation of android (2)
  • 原文地址:https://www.cnblogs.com/Koalin/p/11684869.html
Copyright © 2011-2022 走看看