SpringBoot 中使用 Quartz 创建定时任务

发布时间:2024年01月17日


一、使用示例

自定义 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() 时返回。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


参考:

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

文章来源:https://blog.csdn.net/qq_43686863/article/details/135658145
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。