• 任务调度框架-Quartz.Net


    使用Quartz.Net依赖于以下3个组件:Common.Logging.dll、Common.Logging.Core.dll、Quartz.dll

    简单封装

     1 using Quartz;
     2 using Quartz.Impl;
     3 using System;
     4 using System.Collections.Generic;
     5 using System.Linq;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 
     9 namespace Test
    10 {
    11     public class SchedulerHelper
    12     {
    13         /// <summary>
    14         /// 任务调度器实例
    15         /// </summary>
    16         public static IScheduler scheduler { get; }
    17         static SchedulerHelper()
    18         {
    19             //实例化任务调度器对象
    20             scheduler = StdSchedulerFactory.GetDefaultScheduler();
    21         }
    22 
    23         /// <summary>
    24         /// 添加任务
    25         /// </summary>
    26         /// <typeparam name="T">IJob类型</typeparam>
    27         /// <param name="jobIdentity">job唯一标识</param>
    28         /// <param name="triggerIdentity">trigger唯一标识</param>
    29         /// <param name="cronExpression">cron表达式</param>
    30         /// <param name="jobGroup">任务所属分组[可选]</param>
    31         /// <param name="triggerGroup">触发器所属分组[可选]</param>
    32         public static void AddScheduleJob<T>(string jobIdentity, string triggerIdentity, string cronExpression, string jobGroup = "", string triggerGroup = "")
    33             where T : IJob
    34         {
    35             var jobBuilder = JobBuilder.Create<T>();
    36             if (string.IsNullOrEmpty(jobGroup))
    37                 jobBuilder.WithIdentity(jobIdentity);
    38             else
    39                 jobBuilder.WithIdentity(jobIdentity, jobGroup);
    40 
    41             var currentJob = jobBuilder.Build();
    42 
    43             var triggerBuilder = TriggerBuilder.Create();
    44             if (string.IsNullOrEmpty(triggerGroup))
    45                 triggerBuilder.WithIdentity(triggerIdentity);
    46             else
    47                 triggerBuilder.WithIdentity(triggerIdentity, triggerGroup);
    48 
    49             var currentTrigger = triggerBuilder
    50                                 .StartNow()
    51                                 .WithCronSchedule(cronExpression)
    52                                 .Build();
    53 
    54             //把作业,触发器加入调度器。
    55             scheduler.ScheduleJob(currentJob, currentTrigger);
    56         }
    57 
    58         public static void Start()
    59         {
    60             if (scheduler == null)
    61                 throw new ArgumentNullException("scheduler", "任务调度器实例对象不能为null");
    62             if (!scheduler.IsStarted)
    63                 scheduler.Start();
    64         }
    65 
    66         public static void ShutDown()
    67         {
    68             if (scheduler == null)
    69                 throw new ArgumentNullException("scheduler", "任务调度器实例对象不能为null");
    70             if (!scheduler.IsShutdown)
    71                 scheduler.Shutdown();
    72         }
    73     }
    74 }

    客户端

    using NLog;
    using Quartz;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        public class WriteLogJob : IJob
        {
            ILogger log = LogManager.GetLogger("admin");
            public void Execute(IJobExecutionContext context)
            {
                try
                {
                    log.Error(string.Format("当前时间为:{0}", DateTime.Now));
                }
                catch (Exception x) { }
            }
        }
    }
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Configuration;
     4 using System.Linq;
     5 using System.Text;
     6 
     7 namespace Test
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             SchedulerHelper.AddScheduleJob<WriteLogJob>("WriteLogJob", "WriteLogTrigger", "0/5 * * * * ?");
    14 
    15             SchedulerHelper.Start();
    16 
    17             Console.ReadLine();
    18         }
    19     }
    20 }

    Quartz的cron表达式

    官文文档:cron表达式介绍

    由7段构成:秒 分 时 日 月 星期 年(可选)
    "-" :表示范围  MON-WED表示星期一到星期三
    "," :表示列举 MON,WEB表示星期一和星期三
    "*" :表是“每”,每月,每天,每周,每年等
    "/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
    "?" :只能出现在日,星期段里面,表示不指定具体的值
    "L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
    "W" :表示工作日,距离给定值最近的工作日
    "#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)

    常用cron表达式示例

    // 0/5 * * * * ?            每5秒钟执行一次
    // 0 0/5 * * * ?            每5分钟执行一次
    // 10 0/5 * * * ?           每5分钟,在第10秒钟执行一次
    // 0 30 10-13 ? * WED,FRI   每周的周三、周五,时针为10-13,分钟刻度为30的时候执行一次
    // 0 0/30 8-9 5,20 * ?      每个月的第5、第20天,时针为8到9,分钟刻度为从0开始,每过30分钟执行一次

    官方实例

    ExpressionMeaning
    0 0 12 * * ? Fire at 12pm (noon) every day
    0 15 10 ? * * Fire at 10:15am every day
    0 15 10 * * ? Fire at 10:15am every day
    0 15 10 * * ? * Fire at 10:15am every day
    0 15 10 * * ? 2005 Fire at 10:15am every day during the year 2005
    0 * 14 * * ? Fire every minute starting at 2pm and ending at 2:59pm, every day
    0 0/5 14 * * ? Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day
    0 0/5 14,18 * * ? Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day
    0 0-5 14 * * ? Fire every minute starting at 2pm and ending at 2:05pm, every day
    0 10,44 14 ? 3 WED Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.
    0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday
    0 15 10 15 * ? Fire at 10:15am on the 15th day of every month
    0 15 10 L * ? Fire at 10:15am on the last day of every month
    0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
    0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
    0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
    0 15 10 ? * 6L 2002-2005 Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005
    0 15 10 ? * 6#3 Fire at 10:15am on the third Friday of every month
    0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
    0 11 11 11 11 ? Fire every November 11th at 11:11am.
  • 相关阅读:
    mysql 使用 insert ignore into和unique实现不插入重复数据功能
    mysql 判断指定条件数据存不存在,不存在则插入
    Unity3D之如何将包大小减少到极致
    Unity3D–Texture图片空间和内存占用分析
    使用Unity3D的50个技巧:Unity3D最佳实践!
    Unity中的Path对应各平台中的Path
    unity 在移动平台中,文件操作路径详解
    unity Mathf 数学运算汇总
    解决ngui在3d场景中 点透的情况
    【整理】unity3d优化总结篇
  • 原文地址:https://www.cnblogs.com/Jabben_Yi/p/5751307.html
Copyright © 2020-2023  润新知