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

在用到若依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);
        }
    }

版权声明:本文为Mr____zhao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。