springboot quartz 同一个jobgroup中job 串行执行
时间: 2024-10-17 21:15:59 浏览: 7
Spring Boot整合Quartz是一个常见的实践,用于安排任务定时执行。在同一个JobGroup下,如果你想要实现job的串行执行,你可以这样做:
1. 首先,在Spring Boot配置文件`application.properties`或`application.yml`中添加对quartz的支持,例如:
```properties
quartz.dataSource.default.driverClassName=...
quartz.dataSource.default.url=...
quartz.jobStore.type=jdbc
```
2. 创建一个`QuartzConfig`类,配置JobDetail、Trigger和SchedulerFactoryBean:
```java
@Configuration
public class QuartzConfig {
@Autowired
private DataSource dataSource;
@Bean(destroyMethod = "shutdown")
public StdSchedulerFactory schedulerFactory() {
SimpleDataSourcePool pool = new SimpleDataSourcePool();
pool.setDataSource(dataSource);
SchedulerFactory factory = new StdSchedulerFactory(pool);
return factory;
}
// 创建JobDetail
@Bean(name = "job1")
public JobDetail job1() {
return JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
}
// 创建Trigger
@Bean(name = "trigger1")
public Trigger trigger1() {
return TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSimpleSchedule(cronSchedule("0 0/5 * * * ?"))
.build();
}
private CronSchedule cronSchedule(String cronExpression) {
return new CronSchedule(cronExpression);
}
}
// 定义MyJob类,这里是串行执行的基础,可以添加你需要的任务逻辑
@Component
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
String jobName = context.getJobDetail().getKey().getName();
System.out.println("Starting job: " + jobName);
// 这里是你需要的业务逻辑,完成后触发下一个job
// ...
if (/*条件判断*/){
context.getScheduler().scheduleJob(job2(), context.getTrigger());
} else {
// 结束当前job,无后续任务
context.getScheduler().complete(context.getMergedJobInstance());
}
}
}
// 为其他job创建类似job1的bean,并设置相同的JobGroup(group1)
// ...
阅读全文