xtjatswc 发表于 2018-12-22 22:19:52

quartz.net的简单用法 -入门

本帖最后由 xtjatswc 于 2018-12-22 22:25 编辑

注意:项目部署在IIS中,那么就要设置应用程序池的回收机制为,永不回收

1.创建一个每隔3秒钟执行一次的计划调度
public class RunMain
    {
      static void Main(string[] args)
      {
            Console.WriteLine(DateTime.Now.ToString("r"));
            //1.首先创建一个作业调度池
            ISchedulerFactory schedf = new StdSchedulerFactory();
            IScheduler sched = schedf.GetScheduler();
            //2.创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create<JobDemo>().Build();         
            //3.创建并配置一个触发器
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x=>x.WithIntervalInSeconds(3).WithRepeatCount(int.MaxValue)).Build();
            //4.加入作业调度池中
            sched.ScheduleJob(job, trigger);
            //5.开始运行
            sched.Start();
            Console.ReadKey();
      }
    }
    public class JobDemo : IJob
    {
      /// <summary>
      /// 这里是作业调度每次定时执行方法
      /// </summary>
      /// <param name="context"></param>
      public void Execute(IJobExecutionContext context)
      {
            Console.WriteLine(DateTime.Now.ToString("r"));
      }
    }
Note:1、记下作业调度创建的顺序。2、上述代码执行结果是,每三秒执行一次JobDemo中的Execute,如果程序不停止,无休无止执行到天荒地老,呵呵,扯下蛋啊。
2.改进(丰富调度计划):上一个作业,我想让他每三秒执行一次,一共执行100次,开始执行时间设定在当前时间,结束时间我设定在2小时后,不过100次执行完没2小时候都不再执行。
public class RunMain
    {
      static void Main(string[] args)
      {
            Console.WriteLine(DateTime.Now.ToString("r"));
            //首先创建一个作业调度池
            ISchedulerFactory schedf = new StdSchedulerFactory();
            IScheduler sched = schedf.GetScheduler();
            //创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create<JobDemo>().Build();
            //NextGivenSecondDate:如果第一个参数为null则表名当前时间往后推迟2秒的时间点。
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 3);
            //创建并配置一个触发器
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)               
                                        .WithSimpleSchedule(x=>x.WithIntervalInSeconds(3).WithRepeatCount(100))
                                        .Build();
            //加入作业调度池中
            sched.ScheduleJob(job, trigger);
            //开始运行
            sched.Start();
            Console.ReadKey();
      }
    }
    public class JobDemo : IJob
    {
      /// <summary>
      /// 这里是作业调度每次定时执行方法
      /// </summary>
      /// <param name="context"></param>
      public void Execute(IJobExecutionContext context)
      {
            Console.WriteLine(DateTime.Now.ToString("r"));
      }
    }
3.继续改进(cron-like使用):前两个作业调度都太简单,如果我想在每小时的第10,20,25,26,33,54分钟,每分钟的第1,10,14秒执行一次。那么上面显然是不能满足的。这是我就把cron-like表达式引入进来,以实现各种时间纬度的调用。
public class RunMain
    {
      static void Main(string[] args)
      {
            Console.WriteLine(DateTime.Now.ToString("r"));
            //首先创建一个作业调度池
            ISchedulerFactory schedf = new StdSchedulerFactory();
            IScheduler sched = schedf.GetScheduler();
            //创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create<JobDemo>().Build();
            //NextGivenSecondDate:如果第一个参数为null则表名当前时间往后推迟2秒的时间点。
            DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
            //创建并配置一个触发器
            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
                                        .WithCronSchedule("1,10,14 10,20,25,26,33,54 * * * ? ")
                                        .Build();
            //加入作业调度池中
            sched.ScheduleJob(job, trigger);
            //开始运行
            sched.Start();
            //挂起2天
            Thread.Sleep(TimeSpan.FromDays(2));
            //2天后关闭作业调度,将不在执行
            sched.Shutdown();
            Console.ReadKey();
      }
    }
    public class JobDemo : IJob
    {
      /// <summary>
      /// 这里是作业调度每次定时执行方法
      /// </summary>
      /// <param name="context"></param>
      public void Execute(IJobExecutionContext context)
      {
            Console.WriteLine(DateTime.Now.ToString("r"));
      }
    }


页: [1]
查看完整版本: quartz.net的简单用法 -入门