
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); Maptasks = 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 工厂,实现了对多个定时任务的动态管理和扩展。