SpringBoot 中使用 Quartz 创建定时任务

文章目录

  • 一、使用示例
  • 二、运行原理


一、使用示例

自定义 job:

@Slf4j
public class MyJob extends QuartzJobBean {
    
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        log.info("MyJob start...");
        long start = System.currentTimeMillis();

        MyService myService = (MyService) context.getMergedJobDataMap().get("myService");
        
        try {
            myService.func();
        } catch (Exception e) {
            log.error("MyJob error: ", e);
        }

        long end = System.currentTimeMillis();
        log.info("MyJob end in {} ms", end - start);
    }
}

配置 detail、trigger 和 schedule:

@Configuration
public class QuartzConfig {
    
    @Setter(onMethod_ = {@Autowired})
    private MyService myService;

    @Bean
    public JobDetailFactoryBean myJobDetail() {
        JobDetailFactoryBean detail = new JobDetailFactoryBean();
        detail.setJobClass(MyJob.class);
        detail.setDurability(true);
        Map<String, Object> jobData = new HashMap<>();
        jobData.put("myService", myService);
        detail.setJobDataAsMap(jobData);
        return detail;
    }

    @Bean
    public CronTriggerFactoryBean myJobTriggerBean() {
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
        trigger.setJobDetail(Objects.requireNonNull(myJobDetail().getObject()));
        trigger.setCronExpression("*/5 * * * * ?");  // 每 5 秒钟执行一次
        return trigger;
    }
    
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setTriggers(myJobTriggerBean().getObject());
        return schedulerFactoryBean;
    }
}

二、运行原理

SchedulerFactoryBean 重写了 Lifecyclestart() 方法,该方法会在 Spring 容器启动时自动执行,从而启动定时任务。

此外,JobDetailFactoryBeanCronTriggerFactoryBean 均实现了 FactoryBean 和 InitializingBean,它们会在执行 afterPropertiesSet() 时初始化并 set 对应的 JobDetailCronTrigger,并在调用 getObject() 时返回。

SpringBoot 中使用 Quartz 创建定时任务_第1张图片

SpringBoot 中使用 Quartz 创建定时任务_第2张图片

SpringBoot 中使用 Quartz 创建定时任务_第3张图片


参考:

https://juejin.cn/post/6844903954615107597
https://juejin.cn/post/7086353052222881829

你可能感兴趣的:(Java,spring,boot,后端,java)