若依quartz定时任务添加SimpleTrigger(解决超过60分钟的定时)

该博客介绍了在Quartz中如何使用SimpleTrigger来处理非整数分钟间隔的定时任务,如31、91、181分钟。由于Cron表达式无法满足需求,作者选择了SimpleTrigger并调整了哑火策略。在创建任务时,注意了任务冲突可能导致只有一个任务执行的问题,并提供了创建和管理Simple定时任务的代码示例。

在用到若依quartz时,业务的定时间隔不能整除60,例如31、91,181分钟;
31分钟
用Cron的表达式实现31分钟的运行时间并不是每次都间隔31分钟;

Cron表达式的另一种实现逻辑就是用Cron的确切日期30 14 18 23 9 ? 指定每次执行的具体时间,在task执行时重新新建定时任务,刷新下次的执行时间,这种方法需要频繁交互数据库,所以改用的SimpleTrigger。
注意:测试的时候有两个任务,但是每次只能执行其中一个,有可能是同事也在跑你的定时任务,导致自己这边console中只能看到一个!!!

   /**
     * 创建Simple定时任务
     */
    public static void createSimpleScheduleJob(Scheduler scheduler, SysJob job, int time) throws SchedulerException, TaskException
    {
        Class<? extends Job> jobClass = getQuartzJobClass(job);
        // 构建job信息
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();


        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build();

        // 表达式调度构建器
        SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInMinutes(time)//重复间隔
                .repeatForever(); //一直重复
        simpleScheduleBuilder = handleCronScheduleMisfirePolicy(job, simpleScheduleBuilder);

        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
                .startAt(DateUtils.addMinute(new Date(), time))//第一次执行的时间
                .withSchedule(simpleScheduleBuilder).build();

        // 放入参数,运行时的方法可以获取
        jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job);

        // 判断是否存在
        if (scheduler.checkExists(getJobKey(jobId, jobGroup))) {
            // 防止创建时存在数据问题 先移除,然后在执行创建操作
            scheduler.deleteJob(getJobKey(jobId, jobGroup));
        }

        scheduler.scheduleJob(jobDetail, simpleTrigger);

        // 暂停任务
        if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) {
            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
        }

    }

添加SimpleScheduleBuilder 的哑火策略(我暂时只用到其中3个)

    /**
     * 设置定时任务策略
     */
    public static SimpleScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, SimpleScheduleBuilder cb)
            throws TaskException
    {
        switch (job.getMisfirePolicy())
        {
            case ScheduleConstants.MISFIRE_DEFAULT:
                return cb;
            case ScheduleConstants.MISFIRE_IGNORE_MISFIRES:
                return cb.withMisfireHandlingInstructionIgnoreMisfires();
            case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED:
                return cb.withMisfireHandlingInstructionFireNow();
            case ScheduleConstants.MISFIRE_DO_NOTHING:
                return cb.withMisfireHandlingInstructionNowWithExistingCount();
            default:
                throw new TaskException("The task misfire policy '" + job.getMisfirePolicy()
                        + "' cannot be used in cron schedule tasks", TaskException.Code.CONFIG_ERROR);
        }
    }
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值