spring boot配置定时任务本人已知的有两种方法,一种是使用注解@Scheduled,使用这个时需要在spring boot的启动类上添加@EnableScheduling注解以及在使用类中添加@Component方能使用,只需要了解corn的表达式便可以配置定时任务执行的时间。
但是如果是配置动态的corn表达式,此方法就不是很合适,这时需要用到quart定时器框架。
Quartz是纯Java实现,而且作为Spring的默认调度框架,由于Quartz的强大的调度功能、灵活的使用方式、还具有分布式集群能力,可以说Quartz出马,可以搞定一切定时任务调度!
本人自己的项目中涉及到定时推送数据任务场景,corn的表达式都需要从数据库读取,所以便采用了quart框架。
@Configuration
public class ShareResAllocaJobConfig implements ApplicationListener<ContextRefreshedEvent>{
@Autowired
private ShareResQuartzScheduler quartzScheduler;
@Autowired
private SharePlanService sharePlanService;
/**
* 初始启动quartz
*/
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
SharePlan sharePlan = new SharePlan();
sharePlan.setShareStatus(-1);
List<SharePlan> sharePlanList = sharePlanService.selectSharePlanByStatus(sharePlan);
if (sharePlanList != null && sharePlanList.size() > 0) {
for (SharePlan sharePlan2 : sharePlanList) {
String executePlan = sharePlan2.getExecutePlan();
if (StringUtils.isNotBlank(sharePlan2.getInDataSourceId()) && StringUtils.isNotBlank(executePlan)) {
executePlan = QuartzCronUtils.translateStringToCronExpression(executePlan);
//查询所有运行中的任务 把任务添加到任务管理器,这里便从数据库中查询动态的corn表达式存入接下来的调度任务对象中
quartzScheduler.addJob(SharePlanJobDetail.class, sharePlan2.getShareId(), Constants.GROUP_NAME, executePlan);
if (sharePlan2.getShareStatus() < 1) {
quartzScheduler.pauseJob(sharePlan2.getShareId(), Constants.GROUP_NAME);//暂停任务
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("任务已