zoukankan      html  css  js  c++  java
  • 【C#】【Demo】 Quartz.Net任务调度框架demo

    using Quartz;
    using Quartz.Impl;
    using System;
    using System.Threading.Tasks;
    
    namespace T.QuartzHelper
    {
        /// <summary>
        /// Quartz任务调度工具类
        /// 参考https://www.cnblogs.com/best/p/7658573.html
        /// 想避免iis回收,可以写成winfrom放在服务器上,windows任务一直判断程序被关闭就打开执行。
        /// </summary>
        public class QuartzUtil
        {
    
            #region 3.2、创建调度器
            /// <summary>
            /// 调度器
            /// </summary>
            private IScheduler scheduler {get; set; }
            //调度器工厂
            private ISchedulerFactory factory { get; set; }
            public QuartzUtil()
            {
                factory = new StdSchedulerFactory();
                scheduler = factory.GetScheduler().Result ;
                scheduler.Start();
            }
            #endregion
    
            /// <summary>
            /// 3.3、创建一个任务对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            public IJobDetail GetIJobDetail<T>(string name, string group) where T : IJob
            {
                IJobDetail job = JobBuilder.Create<T>().WithIdentity(name, group).Build();
                return job;
            }
    
            #region 3.4、创建一个触发器
            /// <summary>
            /// 3.4、创建一个触发器
            /// 计时循环
            /// </summary>
            /// <param name="name"></param>
            /// <param name="group"></param>
            /// <param name="cronExpression">"0/5 * * * * ?"=5秒执行一次</param>
            /// <returns></returns>
            public ITrigger GetTrigger(string name, string group, string cronExpression= "0/5 * * * * ?") 
            {
                return GetTrigger(name, group,null, cronExpression: cronExpression);
            }
    
            /// <summary>
            /// 3.4、创建一个触发器
            /// 定时执行一次
            /// </summary>
            /// <param name="name"></param>
            /// <param name="group"></param>
            /// <param name="runTime">开始执行时间</param>
            /// <returns></returns>
            public ITrigger GetTrigger(string name, string group, DateTimeOffset runTime)
            {
                return GetTrigger(name, group, runTime,null);
            }
    
            /// <summary>
            /// 3.4、创建一个触发器
            /// </summary>
            /// <param name="name"></param>
            /// <param name="group"></param>
            /// <param name="runTime">定时执行时间</param>
            /// <param name="cronExpression">循环执行,"0/5 * * * * ?"=5秒执行一次,更多cron expressions语法:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html
            /// 由7段构成:秒 分 时 日 月 星期 年(可选)
            ///"-" :表示范围 MON-WED表示星期一到星期三
            ///"," :表示列举 MON, WEB表示星期一和星期三
            ///"*" :表是“每”,每月,每天,每周,每年等
            ///"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
            ///"?" :只能出现在日,星期段里面,表示不指定具体的值
            ///"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
            ///"W" :表示工作日,距离给定值最近的工作日
            ///"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)
            ///如果Minutes的数值是 '0/15' ,表示从0开始每15分钟执行
            ///如果Minutes的数值是 '3/20' ,表示从3开始每20分钟执行,也就是‘3/23/43’
            /// </param>
            /// <returns></returns>
            public ITrigger GetTrigger(string name, string group, DateTimeOffset? runTime, string cronExpression = null)
            {
                if (runTime == null && string.IsNullOrWhiteSpace(cronExpression))
                {
                    return null;
                }
    
                var tri = TriggerBuilder.Create()
                .WithIdentity(name, group);
                if (runTime != null) 
                {
                    tri = tri.StartAt(runTime.Value);
                }
                if (!string.IsNullOrWhiteSpace(cronExpression)) 
                {
                    tri = tri.WithCronSchedule(cronExpression);
                }
    
                return tri.Build();
            }
            #endregion
    
            /// <summary>
            /// 3.5、将任务与触发器添加到调度器中并执行
            /// </summary>
            /// <param name="job"></param>
            /// <param name="trigger"></param>
            public void ScheduleJob(IJobDetail job, ITrigger trigger,bool start=true)
            {
                //4、将任务与触发器添加到调度器中
                scheduler.ScheduleJob(job, trigger);
    
                if (start) 
                {
                    //5、开始执行
                    scheduler.Start();
                }
            }
    
            /// <summary>
            /// 3.6、应用关闭时结束任务
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void Shutdown()
            {
                //在应用程序关闭时运行的代码
                if (scheduler != null)
                {
                    scheduler.Shutdown(true);
                }
            } 
        }
    
        /// <summary>
        /// 3.1、定义要执行的任务
        /// </summary>
        public class JobTest1 : IJob
        {
            public Task Execute(IJobExecutionContext context)
            {
                var task = new Task(() =>
                {
                    Console.WriteLine(DateTime.Now + Environment.NewLine);
                    ////向txt写入当前时间并换行
                    //System.IO.File.AppendAllText(@"C:TxtQuartz.txt", DateTime.Now + Environment.NewLine);
                });
                task.Start();
    
                return task;
            }
        }
    
        /// <summary>
        /// 测试调用
        /// </summary>
        public class Test1
        {
            static QuartzUtil qt = new QuartzUtil();
    
            public void Test1Start()
            {
                //qt.ScheduleJob(qt.GetIJobDetail<JobTest1>("job1", "group1")
                //    , qt.GetTrigger("job1", "group1", new DateTimeOffset(new DateTime(2020, 9, 28, 16, 19, 00))));
    
                qt.ScheduleJob(qt.GetIJobDetail<JobTest1>("job1", "group1")
                    , qt.GetTrigger("job1", "group1", "0/5 * * * * ?"));
            }
    
            public void End()
            {
                qt.Shutdown();
            }
        }
    }
  • 相关阅读:
    SGU 499 Greatest Greatest Common Divisor
    pku 3468 A Simple Problem with Integers
    pku2226 Muddy Fields
    pku3041 Asteroids
    java基础string操作
    PowerDesigner(7)转载
    java基础2
    PowerDesigner(6)转载
    java基础3
    java基础(1)
  • 原文地址:https://www.cnblogs.com/lanofsky/p/13745578.html
Copyright © 2011-2022 走看看