超详细 任务调度框架Quartz用法指南( 二 )

  • Job 能通过 JobExecutionContext 对象访问到 Quartz 运行时候的环境以及 Job 本身的明细数据 。
  • 任务实现的 execute() 方法,可以通过 context 参数获取 。
    public interface Job {void execute(JobExecutionContext context)throws JobExecutionException;}在 Builder 建造过程中,可以使用如下方法:
    usingJobData("tiggerDataMap", "测试传参")在 execute 方法中获取:
    context.getTrigger().getJobDataMap().get("tiggerDataMap");context.getJobDetail().getJobDataMap().get("tiggerDataMap");Job 状态参数有状态的 job 可以理解为多次 job调用期间可以持有一些状态信息,这些状态信息存储在 JobDataMap 中 。
    而默认的无状态 job,每次调用时都会创建一个新的 JobDataMap 。
    示例如下:
    //多次调用 Job 的时候,将参数保留在 JobDataMap@PersistJobDataAfterExecutionpublic class JobStatus implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {long count = (long) context.getJobDetail().getJobDataMap().get("count");System.out.println("当前执行,第" + count + "次");context.getJobDetail().getJobDataMap().put("count", ++count);}}JobDetail job = JobBuilder.newJob(JobStatus.class).withIdentity("statusJob", "group1").usingJobData("count", 1L).build();输出结果:
    当前执行,第1次[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.当前执行,第2次当前执行,第3次Trigger定时启动/关闭Trigger 可以设置任务的开始结束时间, Scheduler 会根据参数进行触发 。
    Calendar instance = Calendar.getInstance();Date startTime = instance.getTime();instance.add(Calendar.MINUTE, 1);Date endTime = instance.getTime();// 3.构建Trigger实例Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")// 开始时间.startAt(startTime)// 结束时间.endAt(endTime).build();在 job 中也能拿到对应的时间,并进行业务判断
    public void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("任务执行 。。。");System.out.println(context.getTrigger().getStartTime());System.out.println(context.getTrigger().getEndTime());}运行结果:
    [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.01633149326723任务执行 。。。Sat Oct 02 12:35:26 CST 2021Sat Oct 02 12:36:26 CST 2021[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.SimpleTrigger这是比较简单的一类触发器,用它能实现很多基础的应用 。使用它的主要场景包括:
    • 在指定时间段内,执行一次任务
    最基础的 Trigger 不设置循环,设置开始时间 。
    • 在指定时间段内,循环执行任务
    在 1 基础上加上循环间隔 。可以指定 永远循环、运行指定次数
    TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(30).repeatForever())withRepeatCount(count) 是重复次数,实际运行次数为 count+1
    TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(30).withRepeatCount(5))
    • 立即开始,指定时间结束
    这个,略 。
    CronTriggerCronTrigger 是基于日历的任务调度器,在实际应用中更加常用 。
    虽然很常用,但是知识点都一样,只是可以通过表达式来设置时间而已 。
    使用方式就是绑定调度器时换一下:
    TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))Cron 表达式这里不介绍,贴个图跳过
    超详细 任务调度框架Quartz用法指南

    文章插图
     
    SpringBoot 整合下面集成应用截图来自 Ruoyi 框架:
    超详细 任务调度框架Quartz用法指南

    文章插图
     

    超详细 任务调度框架Quartz用法指南


    推荐阅读