本文以Quartz-2.3.2为例,集成于SpringBoot,任务数据持久化到数据库中
禁止应用触发定时任务执行
因为开发过程中我们使用的都是同一个数据库,而Quartz的触发原理是由应用循环查询数据库,抢占任务状态去执行,所以会出现自己并没有做定时任务开发,但是别人开发的定时任务会被自己本地抢占执行而报错。
我们可以通过添加以下配置,禁用掉本地应用的任务触发:
flowable.process.async-executor-activate: false
本地开发调试任务逻辑
虽然可以通过配置将应用节点的任务触发关掉,但是多人合作开发时,为了自己调试让别人把任务触发都关掉是不合适的。
Quartz提供了Api,立即触发一次任务的执行,由 org.quartz.Scheduler
提供:
/**
* Trigger the identified <code>{@link org.quartz.JobDetail}</code>
* (execute it now).
*/
void triggerJob(JobKey jobKey) throws SchedulerException;
调用示例:
@Component
@RequiredArgsConstructor
public class QuartzService {
private final Scheduler quartzScheduler;
/**
* 将任务立刻执行一次(实际效果为复制出一条执行一次的简单任务)
*
* @param jobName 任务名称
* @param jobGroup 任务分组
* @throws SchedulerException 调度器信息获取异常
*/
public void executeAtOnce(String jobName, String jobGroup) throws SchedulerException {
quartzScheduler.triggerJob(JobKey.jobKey(jobName, jobGroup));
}
}
该方法执行后,会根据已存在的任务数据,创建一个新的触发器,并在当前线程触发执行,也就是在该方法执行的线程下,直接去调用一次定时任务逻辑。
所以我们可以借助这个方法,通过以下步骤,调试新开发的任务逻辑:
- 完成任务类的编码
- 创建一个该类的定时任务,注意把开始时间往后调,别创建出来立即执行了
- 进入DEBUG,通过上述API,在自己本地环境出发逻辑进行调试
注意:如果本地配置了开头说的那个 禁止应用触发定时任务执行,这个API创建完触发器之后,本地是不会执行的,而会放入数据库被其他开启执行的应用节点抢占执行