定时任务Quartz开发技巧

本文以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));
    }
}

该方法执行后,会根据已存在的任务数据,创建一个新的触发器,并在当前线程触发执行,也就是在该方法执行的线程下,直接去调用一次定时任务逻辑。

所以我们可以借助这个方法,通过以下步骤,调试新开发的任务逻辑:

  1. 完成任务类的编码
  2. 创建一个该类的定时任务,注意把开始时间往后调,别创建出来立即执行了
  3. 进入DEBUG,通过上述API,在自己本地环境出发逻辑进行调试

注意:如果本地配置了开头说的那个 禁止应用触发定时任务执行,这个API创建完触发器之后,本地是不会执行的,而会放入数据库被其他开启执行的应用节点抢占执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值