SpringBoot集成Quartz 实现定时任务管理
发布日期:2021-05-06 19:33:34 浏览次数:18 分类:精选文章

本文共 4015 字,大约阅读时间需要 13 分钟。

Quartz 集成方式记录

第一种集成方式

这种方式适用于只有一个任务需要定时执行的情况,无需动态管理任务。

  • 导入依赖

    首先需要添加 Quartz 的依赖,通常选择最新版本的 quartz。注意如果需要日志功能,可能需要排除 slf4j 的依赖。

    org.quartz-scheduler
    quartz
    2.2.3
    org.slf4j
    slf4j-log4j12
  • 配置定时任务

    使用 Spring 的 MethodInvokingJobDetailFactoryBean 配置需要执行的任务。传入一个需要 refresh 方法的对象作为目标对象。

    @Bean(name = "detailFactoryBean_")public MethodInvokingJobDetailFactoryBean detailFactoryBean(AddSendMessageConfig wechatQuartz) {    MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();    bean.setTargetObject(wechatQuartz);    bean.setTargetMethod("refresh");    bean.setConcurrent(false);    return bean;}
  • 配置 cron 触发器

    使用 CronTriggerFactoryBean 配置 cron 表达式,指定执行任务的时间。

    @Bean(name = "cronTriggerBean_")public CronTriggerFactoryBean cronTriggerBean(MethodInvokingJobDetailFactoryBean detailFactoryBean_) throws Exception {    CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();    trigger.setJobDetail(detailFactoryBean_.getObject());    trigger.setCronExpression("0 0 2 * * ?"); // 每天早上2点执行    return trigger;}
  • 配置调度器

    使用 SchedulerFactoryBean 将上述触发器加入调度器中。

    @Beanpublic SchedulerFactoryBean schedulerFactory(CronTriggerFactoryBean cronTriggerBean_) {    SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();    schedulerFactory.setTriggers(cronTriggerBean_.getObject());    return schedulerFactory;}
  • 第二种集成方式

    这种方式适用于需要动态管理多个定时任务的场景。

  • 自定义任务管理器

    定义一个 QuartzManager 类,负责管理多个定时任务。

    @Component@Scope("singleton")public class QuartzManager implements ApplicationContextAware {    private static Scheduler scheduler;    private final String JOB_DEFAULT_GROUP_NAME = "JOB_DEFAULT_GROUP_NAME";    private final String TRIGGER_DEFAULT_GROUP_NAME = "TRIGGER_DEFAULT_GROUP_NAME";    @Autowired    private AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory;    public void start() {        try {            scheduler = StdSchedulerFactory.getInstance().getScheduler();            scheduler.setJobFactory(autowiringSpringBeanJobFactory);            Map
    tasks = applicationContext.getBeansOfType(AbstractTask.class); for (Map.Entry
    entry : tasks.entrySet()) { AbstractTask task = entry.getValue(); if (task.getCronExpression() != null) { addJob(entry.getKey(), task.getClass().getName(), task.getCronExpression(), new HashMap()); } } } catch (SchedulerException e) { logger.error("初始化调度器失败", e); throw new RuntimeException("初始化调度器失败", e); } } // 其他方法(addJob, updateJob, deleteJob)...}
  • 自定义 AutowiringSpringBeanJobFactory

    该类用于在 Quartz 中注入 Spring 的 bean,确保定时任务能够正确获取所需的依赖。

    @Component@DisallowConcurrentExecutionpublic class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {    @Override    public void setApplicationContext(ApplicationContext context) {        beanFactory = context.getAutowireCapableBeanFactory();    }}
  • 定义抽象 Job 类

    创建一个抽象类,实现 Quartz 的 Job 接口,方便子类扩展。

    @Component@DisallowConcurrentExecutionpublic abstract class AbsTractTask implements Job {    protected abstract void executeInternal(JobExecutionContext context) throws ParseException;    @Override    public void execute(JobExecutionContext context) {        try {            executeInternal(context);        } catch (Exception e) {            e.printStackTrace();        }    }    public String getCronExpression() {        return cronExpression;    }}
  • 实现具体 Job 类

    创建继承自 AbsTractTask 的具体任务类,实现 executeInternal 方法的具体逻辑。

    @Component@DisallowConcurrentExecutionpublic class WechatQuartz extends AbsTractTask {    // 其他依赖和字段...    @Override    protected void executeInternal(JobExecutionContext context) {        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();        // 执行具体的定时任务逻辑    }}
  • 这种方式通过自定义任务管理器和 bean 工厂,实现了对多个定时任务的动态管理和扩展。

    上一篇:Java-----实现一个简单的栈结构
    下一篇:Java设计模式----------代理模式

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月18日 03时13分18秒