Quartz使用心得

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可以根据实际的测试来选择
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • scheduler定时调度系统是大多行业项目都需要的,传统的spring-job模式,个人感觉已经out了,因为存...
    安琪拉_4b7e阅读 7,876评论 4 6
  • 深入解读Quartz任务调度器 1.Quartz简介 1.1.概要 Quartz是OpenSymphony提供的强...
    CatalpaFlat阅读 5,841评论 0 7
  • Quartz 中集群如何工作 一个 Quartz 集群中的每个节点是一个独立的 Quartz 应用,它又管理着其他...
    那脸憔悴阅读 7,699评论 1 52
  • 看了整整一小时的攻略,斐济,纽埃都看过来了,还是在看我一直喜欢的海岛国家,16年马上要过去了,可以来一场旅行了,去...
    名字要长啊啊阅读 1,067评论 0 1
  • 大理 真正面对自己的开始 那里(苍山)让人向往自由 那里(洱海)让人不由期待 多年来,从不敢直视自己内心的想法和感...
    Jayeen艳艳阅读 1,319评论 0 0

友情链接更多精彩内容