在定时任务中可能存在执行时长不确定的问题,但是如果需要固定间隔,则可以使用@Scheduled(initialDelay = 1000, fixedDelay = 1000 * 30)注解完成。
但是在一个程序中不可能只是一个线程来执行任务,当配置线程池去执行时,此注解就不满足我们的需求了,可以使用如下方式来控制同一时间只允许一个线程去运行部分代码。
/**
* 限定同一时间只允许一个进程进行运行
*/
private AtomicBoolean atomicFlag = new AtomicBoolean(false);
/**
* 每15分钟执行一次
*
* @throws Exception
*/
@Scheduled(cron = "0 0/1 * * * ?")
void task() throws Exception {
//如果他是false,改为true并执行
if (atomicFlag.compareAndSet(false, true)) {
try {
//TODO 执行a
} catch (Exception e) {
log.warn("执行中!");
} finally {
atomicFlag.set(false);
}
} else {
//TODO 执行b
}
}