基于Spring Boot实现的Quartz分布式任务调度系统
随着微服务架构的普及,定时任务调度已成为企业应用不可或缺的组件。本文详细介绍如何基于Spring Boot和Quartz实现高可用、分布式的任务调度系统。
一、Quartz框架简介
Quartz是一个功能丰富的开源任务调度库,支持灵活的调度方式和持久化存储。其核心概念包括:
- Job: 定义要执行的任务
- Trigger: 控制任务执行的时间和频率
- Scheduler: 负责调度和管理任务
二、技术架构设计
本文实现的调度系统采用以下架构:
应用层 → 调度服务层 → Quartz框架 → 数据库持久层
核心组件包括:
- 配置类:提供Quartz与Spring的集成
- 任务工厂:处理Job实例的依赖注入
- 调度服务:封装Quartz API
- 任务实现类:包含业务逻辑
三、配置类实现
@Configuration
public class QuartzConfiguration {
@Value("${scheduler.quartz.threadCount:50}")
private Integer threadCount;
@Autowired private DataSource dataSource;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
factory.setQuartzProperties(quartzProperties());
factory.setAutoStartup(true);
return factory;
}
private Properties quartzProperties() {
Properties prop = new Properties();
// 集群配置
prop.put("org.quartz.jobStore.isClustered", "true");
// 线程池配置
prop.put("org.quartz.threadPool.threadCount", threadCount.toString());
return prop;
}
}
四、Job工厂实现
处理Job实例创建及依赖注入:
@Component
public class QuartzJobFactory extends AdaptableJobFactory {
@Autowired private AutowireCapableBeanFactory beanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
beanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
五、调度服务实现
封装Quartz API,提供简化的任务调度接口:
@Component
public class QuartzScheduler {
@Autowired private Scheduler scheduler;
// 使用Cron表达式调度任务
public JobKey scheduleCronTrigger(JobKey jobKey, String cronExpression, Class jobClass) {
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(jobKey)
.requestRecovery()
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobKey.getName(), jobKey.getGroup())
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.startNow()
.build();
scheduler.scheduleJob(jobDetail, trigger);
return jobDetail.getKey();
}
// 简单触发器调度任务
public JobKey scheduleSimpleTrigger(JobKey jobKey, Date startAt, Class jobClass) {
// 实现逻辑
}
}
六、任务实现示例
@Slf4j
public class DataProcessJob implements Job {
@Autowired private DataService dataService;
@Autowired private QuartzScheduler quartzScheduler;
@Override
public void execute(JobExecutionContext context) {
try {
// 处理多租户场景
InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
// 执行业务逻辑
dataService.process();
log.info("数据处理任务执行完成");
// 重新调度任务
Date nextTime = new Date(System.currentTimeMillis() + 10_000);
quartzScheduler.rescheduleSimpleTrigger(
new JobKey("DataProcess", "DataGroup"),
context.getTrigger().getKey(),
nextTime);
} finally {
// 恢复租户过滤
InterceptorIgnoreHelper.clearIgnoreStrategy();
}
}
}
七、数据库表设计
Quartz需要11张表支持其运行,主要包括:
- QRTZ_JOB_DETAILS: 存储Job详情
- QRTZ_TRIGGERS: 存储触发器信息
- QRTZ_SCHEDULER_STATE: 存储调度器状态,用于集群支持
初始化SQL如下(仅展示部分):
CREATE TABLE QRTZ_JOB_DETAILS (
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
);
八、系统初始化
@Component
public class SystemInitializer implements ApplicationRunner {
@Autowired private QuartzScheduler quartzScheduler;
@Value("${data.process.job.enable:true}")
private boolean dataProcessJobEnabled;
@Override
public void run(ApplicationArguments args) {
if (dataProcessJobEnabled) {
JobKey jobKey = new JobKey("DataProcess", "DataGroup");
quartzScheduler.scheduleSimpleTrigger(jobKey, null, DataProcessJob.class);
}
}
}