美文网首页技术之栈
Quartz使用心得

Quartz使用心得

作者: 魏小厨 | 来源:发表于2017-02-16 19:12 被阅读0次

    Quartz是一个第三方任务调度的框架,可以定时,间隔特定天数,还可以在某个月的某一些天的某个时间点执行相应的任务。

    功能非常强大。下面是我使用的一些新的

    Quartz API 关键的几个接口

    Scheduler:跟任务调度相关的最主要的API接口。

    Job:你期望任务调度执行的组件定义(调度器执行的内容),都必须实现该接口。

    JobDetail:用来定义Job的实例。

    Trigger:定义一个指定的Job何时被执行的组件,也叫触发器。

    JobBuilder:用来定义或创建JobDetail的实例,JobDetail限定了只能是Job的实例。

    TriggerBuilder:用来定义或创建触发器的实例。

    使用笔记

             ISchedulerFactory sf = new StdSchedulerFactory();
             IScheduler sched = sf.GetScheduler();
             IJobDetail job = JobBuilder.Create<Test>()
               .WithIdentity("job1", "group1")
               .Build();
             ITrigger trigger = TriggerBuilder.Create()
                                .WithIdentity("trigger1", "group1")
                                .StartAt(DateBuilder.DateOf(23, 30, 0))
                                .WithCalendarIntervalSchedule(x => x.WithIntervalInDays(3))
                                .EndAt(DateBuilder.DateOf(22, 0, 0))
                                .Build();
            sched.ScheduleJob(job, trigger);
            sched.Start();
            -----Test是要执行的任务类,一定要集成IJob---------
            Public class Test:IJob
            {
                  public void Execute(JobExecutionContext context)
                  {
                    Console.WriteLine("Test");
                  }
            }
    
    1. 创建StdSchedulerFactory实例
    2. 创建Scheduler实例
    3. 创建JobBuilder,其中Test为你要执行的类,一定要继承IJob接口
    4. 创建TriggerBuilder

    StartAt是执行的时间点

    WithCalendarIntervalSchedule 是其中的一个Scheduler。还有其他的类型

    • WithCalendarIntervalSchedule
    • WithSimpleSchedule
    • WithDailyTimeIntervalSchedule
    • WithCronSchedule

    Test需要传入参数

    改造如下

    IJobDetail job = JobBuilder.Create<Test>()
        .WithIdentity("myJob", "group1") 
        .UsingJobData("param1", "Hello World!")
        .UsingJobData("param2", 3.141f)
        .Build();
    
    public class Test : IJob
    {
        public void Execute(JobExecutionContext context)
        {
            JobKey key = context.JobDetail.Key;
    
            JobDataMap dataMap = context.JobDetail.JobDataMap;
    
            string jobSays = dataMap.GetString("param1");
            float myFloatValue = dataMap.GetFloat("param2");
    
            Console.WriteLine("Test");
        }
    } 
    

    WithSimpleSchedule 使用注意事项

    如果你只需要你的 job 在某个特定的时刻执行一次, 或者在某一个时刻重复执行几遍, 使用WithSimpleSchedule

        .WithSimpleSchedule(
                x => x.WithIntervalInHours(48).RepeatForever()
            )
    
    1. WithIntervalInHours间隔多少小时,也有间隔分钟和秒的方法
    2. RepeatForever()表示一直执行,另一个方法->WithRepeatCount(10),表示执行10次
    3. StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) StartAt,表示开始执行时间,具体参数可以看里面的重载
    4. EndAt(DateBuilder.DateOf(22, 0, 0)),表示结束时间,同StartAt类似

    WithCalendarIntervalSchedule 使用注意事项

        HolidayCalendar cal = new HolidayCalendar();
        cal.AddExcludedDate(someDate);
    
        sched.AddCalendar("myHolidays", cal, false);
    
        ITrigger t = TriggerBuilder.Create()
            .WithIdentity("myTrigger")
            .ForJob("myJob")
            .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
            .ModifiedByCalendar("myHolidays") // but not on holidays
            .Build();
    
        // .. schedule job with trigger
    
        ITrigger t2 = TriggerBuilder.Create()
            .WithIdentity("myTrigger2")
            .ForJob("myJob2")
            .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
            .ModifiedByCalendar("myHolidays") // but not on holidays
            .Build();
    

    使用时候的一些注意点

    1. StartAt 设置的时间如果比当前时间小的话,程序会立即执行
    2. 如果间隔N天或者某一段时间,建议使用WithCalendarIntervalSchedule
    3. 需要排除节假日的用WithCalendarIntervalSchedule
    4. 具体用什么Schedule可以根据实际的测试来选择

    相关文章

      网友评论

        本文标题:Quartz使用心得

        本文链接:https://www.haomeiwen.com/subject/nlmhwttx.html