| | |
| | | * 更新已有任务 |
| | | */ |
| | | public void rescheduleTimingTask(TimingTask task) throws SchedulerException { |
| | | TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId(), "TIMING_TASK_TRIGGER_GROUP"); |
| | | TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId()); |
| | | |
| | | // 获取现有触发器并转换为 CronTrigger |
| | | Trigger oldTrigger = scheduler.getTrigger(triggerKey); |
| | |
| | | |
| | | private JobDetail buildJobDetail(TimingTask task) { |
| | | // 1. 构建唯一JobKey(基于任务ID,确保重启后能识别) |
| | | JobKey jobKey = new JobKey("timingTask_" + task.getId(), "TIMING_TASK_GROUP"); |
| | | JobKey jobKey = new JobKey("timingTask_" + task.getId()); |
| | | |
| | | // 2. 封装任务数据(仅使用基本类型,确保可序列化) |
| | | JobDataMap jobDataMap = new JobDataMap(); |
| | |
| | | .withIdentity(jobKey) // 唯一标识,用于持久化存储 |
| | | .withDescription(task.getTaskName()) // 任务描述,存入数据库 |
| | | .usingJobData(jobDataMap) // 绑定任务数据 |
| | | .storeDurably() // 即使没有触发器关联也持久化保存 |
| | | .storeDurably(true) // 即使没有触发器关联也持久化保存 |
| | | .requestRecovery(true) // 当调度器崩溃后恢复时,重新执行未完成的任务 |
| | | .build(); |
| | | } |
| | | |
| | | private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) { |
| | | // 1. 构建唯一TriggerKey(基于任务ID) |
| | | TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId(), "TIMING_TASK_TRIGGER_GROUP"); |
| | | TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId()); |
| | | |
| | | // 2. 生成Cron表达式(原逻辑不变) |
| | | String cronExpression = convertToCronExpression(task); |
| | | |
| | | // 3. 构建CronTrigger,确保持久化配置 |
| | | CronTrigger trigger = TriggerBuilder.newTrigger() |
| | | return TriggerBuilder.newTrigger() |
| | | .withIdentity(triggerKey) // 唯一标识,用于持久化存储 |
| | | .withDescription(task.getTaskName() + "_TRIGGER") // 触发器描述 |
| | | .forJob(jobDetail) // 关联对应的Job |
| | |
| | | ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) |
| | | : new Date()) |
| | | .build(); |
| | | return trigger; |
| | | } |
| | | private String convertToCronExpression(TimingTask task) { |
| | | // 参数校验 |