Quartz 定时任务调度框架

深碍√TFBOYSˉ_ 2022-12-12 12:24 244阅读 0赞

Quartz 定时任务调度框架

入门案例:

  • 依赖:


    org.quartz-scheduler
    quartz
    2.3.2


    org.quartz-scheduler
    quartz-jobs
    2.3.2
  • Job类:

    package com.blu.job;

    import java.text.SimpleDateFormat;
    import java.util.Date;
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;

    public class HelloJob implements Job{

    1. @Override
    2. public void execute(JobExecutionContext context) throws JobExecutionException {
    3. Date date = new Date();
    4. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    5. String dateString = dateFormat.format(date);
    6. System.out.println("当前时间:"+dateString);
    7. }

    }

  • 测试类:

    package com.blu.test;

    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SimpleScheduleBuilder;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;
    import com.blu.job.HelloJob;

    public class HelloScheduleTest {

    1. public static void main(String[] args) throws Exception {
    2. //调度器(Scheduler),从工厂中获取
    3. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    4. //任务示例(JobDetail)
    5. JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "JobGroup1").build();
    6. //触发器(Trigger)
    7. Trigger trigger = TriggerBuilder.newTrigger()
    8. .withIdentity("trigger1", "TriggerGroup1")
    9. //立即启动触发器
    10. .startNow()
    11. //每5s重复执行一次
    12. .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))
    13. .build();
    14. //让调度器关联任务和触发器
    15. scheduler.scheduleJob(jobDetail,trigger);
    16. scheduler.start();
    17. }

    }

  • 运行效果:每5s打印一次时间

    当前时间:2020-10-06 19:34:09
    当前时间:2020-10-06 19:34:14
    当前时间:2020-10-06 19:34:19
    当前时间:2020-10-06 19:34:24
    当前时间:2020-10-06 19:34:29
    当前时间:2020-10-06 19:34:34
    当前时间:2020-10-06 19:34:39
    当前时间:2020-10-06 19:34:44
    当前时间:2020-10-06 19:34:49
    当前时间:2020-10-06 19:34:54
    当前时间:2020-10-06 19:34:59
    当前时间:2020-10-06 19:35:04


扩展

  • Job类:

    package com.blu.job;

    import java.text.SimpleDateFormat;
    import java.util.Date;

    import org.quartz.Job;
    import org.quartz.JobDataMap;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.quartz.JobKey;
    import org.quartz.Trigger;

    public class HelloJob implements Job{

    1. private String message;
    2. public void setMessage(String message) {
    3. this.message = message;
    4. }
    5. @Override
    6. public void execute(JobExecutionContext context) throws JobExecutionException {
    7. Date date = new Date();
    8. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    9. String dateString = dateFormat.format(date);
    10. //获取JobDetail的内容
    11. JobKey jobKey = context.getJobDetail().getKey();
    12. System.out.println(jobKey.getName());
    13. System.out.println(jobKey.getGroup());
    14. System.out.println(context.getJobDetail().getJobClass().getName());
    15. //从JobDetail对象中获取JobDataMap的数据
    16. JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
    17. String jobDataMessage = jobDataMap.getString("message");
    18. System.out.println(jobDataMessage);
    19. //从Trigger对象中获取JobDataMap的数据
    20. JobDataMap triggerDataMap = context.getTrigger().getJobDataMap();
    21. String triggerDataMessage = triggerDataMap.getString("message");
    22. System.out.println(triggerDataMessage);
    23. //获取Trigger中的内容
    24. Trigger trigger = context.getTrigger();
    25. System.out.println(trigger.getKey().getName());
    26. System.out.println(trigger.getKey().getGroup());
    27. System.out.println(trigger.getKey().getClass());
    28. //初始化job类示例对象时会自动调用setter方法为属性赋值
    29. //当trigger与JobDetail设置了重名属性时,setter方法获取的值就是trigger设置的属性值
    30. System.out.println("通过setter直接获取数据:"+message);
    31. //获取其他内容
    32. System.out.println("当前任务执行时间"+dateFormat.format(context.getFireTime()));
    33. System.out.println("下次任务的执行时间"+dateFormat.format(context.getNextFireTime()));
    34. System.out.println("当前时间:"+dateString);
    35. }

    }

  • 测试类:

    package com.blu.test;

    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SimpleScheduleBuilder;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;

    import com.blu.job.HelloJob;

    public class HelloScheduleTest {

    1. public static void main(String[] args) throws Exception {
    2. //调度器(Scheduler),从工厂中获取
    3. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    4. //任务示例(JobDetail)
    5. JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
    6. .withIdentity("job1", "JobGroup1")
    7. .usingJobData("message","jobDetail传递的值")
    8. .build();

    // System.out.println(jobDetail.getKey().getName());
    // System.out.println(jobDetail.getKey().getGroup());
    // System.out.println(jobDetail.getKey().getClass());

    1. //触发器(Trigger)
    2. Trigger trigger = TriggerBuilder.newTrigger()
    3. .withIdentity("trigger1", "TriggerGroup1")
    4. //立即启动触发器
    5. .startNow()
    6. //每5s重复执行一次
    7. .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))
    8. .usingJobData("message","trigger传递的值")
    9. .build();
    10. //让调度器关联任务和触发器
    11. scheduler.scheduleJob(jobDetail,trigger);
    12. scheduler.start();
    13. }

    }

  • 运行结果

    job1
    JobGroup1
    com.blu.job.HelloJob
    jobDetail传递的值
    trigger传递的值
    trigger1
    TriggerGroup1
    class org.quartz.TriggerKey
    通过setter直接获取数据:trigger传递的值
    当前任务执行时间2020-10-08 13:52:33
    下次任务的执行时间2020-10-08 13:52:38
    当前时间:2020-10-08 13:52:33

    job1
    JobGroup1
    com.blu.job.HelloJob
    jobDetail传递的值
    trigger传递的值
    trigger1
    TriggerGroup1
    class org.quartz.TriggerKey
    通过setter直接获取数据:trigger传递的值
    当前任务执行时间2020-10-08 13:52:38
    下次任务的执行时间2020-10-08 13:52:43
    当前时间:2020-10-08 13:52:38

    job1
    JobGroup1
    com.blu.job.HelloJob
    jobDetail传递的值
    trigger传递的值
    trigger1
    TriggerGroup1
    class org.quartz.TriggerKey
    通过setter直接获取数据:trigger传递的值
    当前任务执行时间2020-10-08 13:52:43
    下次任务的执行时间2020-10-08 13:52:48
    当前时间:2020-10-08 13:52:43


@PersistJobDataAfterExecution 有状态的Job和无状态的Job:

每次执行任务时都会创建一个新的Job实例

默认的无状态Job每次调用时都会创建一个新的JobDataMap

而有状态的Job在多次Job调用期间可以在JobDataMap中存储一些状态信息

  • Job类:

    package com.blu.job;

    import java.text.SimpleDateFormat;
    import java.util.Date;

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;

    @PersistJobDataAfterExecution
    public class HiJob implements Job{

    1. private Integer count;
    2. public void setCount(Integer count) {
    3. this.count = count;
    4. }
    5. @Override
    6. public void execute(JobExecutionContext context) throws JobExecutionException {
    7. Date date = new Date();
    8. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    9. System.out.println("当前时间:"+ dateFormat.format(date));
    10. //累加count,输出count,存入JobDataMap
    11. count++;
    12. System.out.println(count);
    13. context.getJobDetail().getJobDataMap().put("count", count);
    14. }

    }

  • 测试类:

    package com.blu.test;

    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SimpleScheduleBuilder;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;

    import com.blu.job.HiJob;

    public class HiTest {

    1. public static void main(String[] args) throws Exception {
    2. Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    3. JobDetail jobDetail = JobBuilder.newJob(HiJob.class)
    4. .usingJobData("count",0)
    5. .build();
    6. Trigger trigger = TriggerBuilder.newTrigger()
    7. .startNow()
    8. .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))
    9. .build();
    10. scheduler.scheduleJob(jobDetail,trigger);
    11. scheduler.start();
    12. }

    }

不加 @PersistJobDataAfterExecution 注解时是无状态Job,运行效果:

  1. 当前时间:2020-10-09 11:03:53
  2. 1
  3. 当前时间:2020-10-09 11:03:58
  4. 1
  5. 当前时间:2020-10-09 11:04:03
  6. 1
  7. 当前时间:2020-10-09 11:04:08
  8. 1
  9. 当前时间:2020-10-09 11:04:13
  10. 1
  11. 当前时间:2020-10-09 11:04:18
  12. 1

加上 @PersistJobDataAfterExecution 注解后是有状态Job,运行效果:

  1. 当前时间:2020-10-09 11:06:25
  2. 1
  3. 当前时间:2020-10-09 11:06:30
  4. 2
  5. 当前时间:2020-10-09 11:06:35
  6. 3
  7. 当前时间:2020-10-09 11:06:40
  8. 4
  9. 当前时间:2020-10-09 11:06:45
  10. 5
  11. 当前时间:2020-10-09 11:06:50
  12. 6

其他注解:

@DisallowConcurrentExecution

默认的情况下,无论上一次任务是否结束或者完成,只要规定的时间到了,那么下一次就开始。

使用 @DisallowConcurrentExecution 注解可以保证上一次任务成功结束后,下一次任务才能开始

发表评论

表情:
评论列表 (有 0 条评论,244人围观)

还没有评论,来说两句吧...

相关阅读