如何在APScheduler中配置工作日特定时段的间隔任务?
实现指定时段的定时任务方案
不需要结合CronTrigger与IntervalTrigger,用CronTrigger就能精准实现你的需求,以下是两种可行方案:
方案一:多CronTrigger拆分逻辑(推荐,清晰易维护)
直接创建3个CronTrigger,分别对应不同的时间区间,全部绑定到同一个任务Job上:
10:25、10:30、10:35 执行
- Cron表达式:
25,30,35 10 * * 1-5 - 说明:限定周一到周五,仅10点的25、30、35分触发
- Cron表达式:
11:00-17:55 每5分钟执行一次
- Cron表达式:
*/5 11-17 * * 1-5 - 说明:周一到周五,11点至17点的每5分钟触发一次
- Cron表达式:
18:00、18:05……18:35 执行
- Cron表达式:
0,5,10,15,20,25,30,35 18 * * 1-5 - 说明:周一到周五,18点的0至35分每5分钟触发一次
- Cron表达式:
Java + Quartz 代码示例
// 假设已定义你的任务类:YourTaskJob JobDetail job = JobBuilder.newJob(YourTaskJob.class) .withIdentity("yourTaskJob", "taskGroup") .build(); // 第一个Trigger:10点的指定分钟 Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity("trigger10", "taskGroup") .withSchedule(CronScheduleBuilder.cronSchedule("25,30,35 10 * * 1-5")) .forJob(job) .build(); // 第二个Trigger:11-17点每5分钟 Trigger trigger2 = TriggerBuilder.newTrigger() .withIdentity("triggerMidday", "taskGroup") .withSchedule(CronScheduleBuilder.cronSchedule("*/5 11-17 * * 1-5")) .forJob(job) .build(); // 第三个Trigger:18点的指定分钟 Trigger trigger3 = TriggerBuilder.newTrigger() .withIdentity("trigger18", "taskGroup") .withSchedule(CronScheduleBuilder.cronSchedule("0,5,10,15,20,25,30,35 18 * * 1-5")) .forJob(job) .build(); // 注册任务与触发器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); scheduler.scheduleJob(job, Arrays.asList(trigger1, trigger2, trigger3), true);
方案二:单CronTrigger配合排除日历
如果想用单个Trigger,可以先覆盖大时间区间,再用日历排除不需要的时段:
- 基础Cron表达式:
*/5 10-18 * * 1-5(周一到周五10:00-18:59每5分钟触发) - 排除规则:
- 10:00-10:20(即10点的0、5、10、15、20分)
- 18:40-18:59(即18点的40、45、50、55分)
Java + Quartz 代码示例
JobDetail job = JobBuilder.newJob(YourTaskJob.class) .withIdentity("yourTaskJob", "taskGroup") .build(); Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); Calendar baseCal = Calendar.getInstance(); baseCal.set(Calendar.SECOND, 0); baseCal.set(Calendar.MILLISECOND, 0); // 添加10点需排除的分钟 for (int min : new int[]{0,5,10,15,20}) { baseCal.set(Calendar.HOUR_OF_DAY, 10); baseCal.set(Calendar.MINUTE, min); MutableCalendar excludeCal = new MutableCalendar(baseCal); excludeCal.setExclusion(true); scheduler.addCalendar("exclude10_" + min, excludeCal, false, false); } // 添加18点需排除的分钟 for (int min : new int[]{40,45,50,55}) { baseCal.set(Calendar.HOUR_OF_DAY, 18); baseCal.set(Calendar.MINUTE, min); MutableCalendar excludeCal = new MutableCalendar(baseCal); excludeCal.setExclusion(true); scheduler.addCalendar("exclude18_" + min, excludeCal, false, false); } // 创建Trigger并绑定排除日历 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("yourTaskTrigger", "taskGroup") .withSchedule(CronScheduleBuilder.cronSchedule("*/5 10-18 * * 1-5")) .modifiedByCalendar("exclude10_0,exclude10_5,exclude10_10,exclude10_15,exclude10_20,exclude18_40,exclude18_45,exclude18_50,exclude18_55") .forJob(job) .build(); scheduler.scheduleJob(job, trigger); scheduler.start();
内容的提问来源于stack exchange,提问作者Rishabh Gupta
相关产品推荐
相关产品推荐

