在用到若依quartz时,业务的定时间隔不能整除60,例如31、91,181分钟;

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

被折叠的 条评论
为什么被折叠?



