| | |
| | | /** |
| | | * 添加新任务到调度器 |
| | | */ |
| | | public void scheduleMaintenanceTask(MaintenanceTask task){ |
| | | public void scheduleMaintenanceTask(MaintenanceTask task) { |
| | | try { |
| | | JobDetail jobDetail = buildJobDetail(task); |
| | | Trigger trigger = buildJobTrigger(task, jobDetail); |
| | | scheduler.scheduleJob(jobDetail, trigger); |
| | | }catch (SchedulerException e){ |
| | | log.error("SchedulerException scheduleMaintenanceTask ERROR",e); |
| | | } catch (SchedulerException e) { |
| | | log.error("SchedulerException scheduleMaintenanceTask ERROR", e); |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 更新已有任务 |
| | | */ |
| | | public void rescheduleMaintenanceTask(MaintenanceTask task){ |
| | | try{ |
| | | TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId()); |
| | | public void rescheduleMaintenanceTask(MaintenanceTask task) { |
| | | try { |
| | | TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId()); |
| | | JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId()); |
| | | |
| | | // 获取现有触发器并转换为 CronTrigger |
| | | Trigger oldTrigger = scheduler.getTrigger(triggerKey); |
| | | if (!(oldTrigger instanceof CronTrigger)) { |
| | | throw new SchedulerException("Existing trigger is not a CronTrigger"); |
| | | } |
| | | Trigger oldTrigger = scheduler.getTrigger(triggerKey); |
| | | |
| | | // 3. 构建CronTrigger,确保持久化配置 |
| | | CronTrigger newTrigger = TriggerBuilder.newTrigger() |
| | | .withIdentity(triggerKey) // 唯一标识,用于持久化存储 |
| | | .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述 |
| | | .forJob(oldTrigger.getJobKey()) // 关联对应的Job |
| | | .withSchedule(CronScheduleBuilder |
| | | .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整) |
| | | ) |
| | | // 4. 设置开始时间(若为null则立即生效) |
| | | .startAt(task.getNextExecutionTime() != null |
| | | ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) |
| | | : new Date()) |
| | | .build(); |
| | | scheduler.rescheduleJob(triggerKey, newTrigger); |
| | | }catch (SchedulerException e){ |
| | | log.error("SchedulerException rescheduleMaintenanceTask ERROR",e); |
| | | throw new RuntimeException(e); |
| | | } |
| | | if (oldTrigger == null) { |
| | | if (!scheduler.checkExists(jobKey)) { |
| | | JobDetail jobDetail = buildJobDetail(task); |
| | | Trigger newTrigger = buildJobTrigger(task, jobDetail); |
| | | scheduler.scheduleJob(jobDetail, newTrigger); |
| | | } else { |
| | | Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey)); |
| | | scheduler.scheduleJob(newTrigger); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | if (!(oldTrigger instanceof CronTrigger)) { |
| | | scheduler.unscheduleJob(triggerKey); |
| | | if (!scheduler.checkExists(jobKey)) { |
| | | JobDetail jobDetail = buildJobDetail(task); |
| | | Trigger newTrigger = buildJobTrigger(task, jobDetail); |
| | | scheduler.scheduleJob(jobDetail, newTrigger); |
| | | } else { |
| | | Trigger newTrigger = buildJobTrigger(task, scheduler.getJobDetail(jobKey)); |
| | | scheduler.scheduleJob(newTrigger); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | CronTrigger newTrigger = TriggerBuilder.newTrigger() |
| | | .withIdentity(triggerKey) // 唯一标识,用于持久化存储 |
| | | .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述 |
| | | .forJob(oldTrigger.getJobKey()) // 关联对应的Job |
| | | .withSchedule(CronScheduleBuilder |
| | | .cronSchedule(convertToCronExpression(task)) // 错过执行时的策略(根据业务调整) |
| | | ) |
| | | .startAt(task.getNextExecutionTime() != null |
| | | ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) |
| | | : new Date()) |
| | | .build(); |
| | | scheduler.rescheduleJob(triggerKey, newTrigger); |
| | | } catch (SchedulerException e) { |
| | | log.error("SchedulerException rescheduleMaintenanceTask ERROR", e); |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | /** |
| | | * 删除任务 |
| | | */ |
| | | public void unscheduleMaintenanceTask(Long taskId){ |
| | | public void unscheduleMaintenanceTask(Long taskId) { |
| | | try { |
| | | JobKey jobKey = new JobKey("MaintenanceTask_" + taskId); |
| | | scheduler.deleteJob(jobKey); |
| | | }catch (SchedulerException e){ |
| | | log.error("SchedulerException unscheduleMaintenanceTask ERROR",e); |
| | | } catch (SchedulerException e) { |
| | | log.error("SchedulerException unscheduleMaintenanceTask ERROR", e); |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | |
| | | : new Date()) |
| | | .build(); |
| | | } |
| | | |
| | | private String convertToCronExpression(MaintenanceTask task) { |
| | | // 参数校验 |
| | | if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) { |
| | |
| | | // 转换单个星期几名称 |
| | | private String convertSingleDayName(String dayName) { |
| | | switch (dayName.toUpperCase()) { |
| | | case "MON": return "MON"; |
| | | case "TUE": return "TUE"; |
| | | case "WED": return "WED"; |
| | | case "THU": return "THU"; |
| | | case "FRI": return "FRI"; |
| | | case "SAT": return "SAT"; |
| | | case "SUN": return "SUN"; |
| | | default: throw new IllegalArgumentException("无效的星期几: " + dayName); |
| | | case "MON": |
| | | return "MON"; |
| | | case "TUE": |
| | | return "TUE"; |
| | | case "WED": |
| | | return "WED"; |
| | | case "THU": |
| | | return "THU"; |
| | | case "FRI": |
| | | return "FRI"; |
| | | case "SAT": |
| | | return "SAT"; |
| | | case "SUN": |
| | | return "SUN"; |
| | | default: |
| | | throw new IllegalArgumentException("无效的星期几: " + dayName); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |