Commit 7576b766 authored by wanghao's avatar wanghao

1测试上电断电操作

parent 0ca06286
...@@ -84,39 +84,46 @@ public class DeviceTaskScheduler { ...@@ -84,39 +84,46 @@ public class DeviceTaskScheduler {
* 创建71小时后执行任务 * 创建71小时后执行任务
*/ */
private void createFinalExecutionJob(Long fStoreyId,String fPowerOutageIp,Integer fPowerOutagePort) throws SchedulerException { private void createFinalExecutionJob(Long fStoreyId,String fPowerOutageIp,Integer fPowerOutagePort) throws SchedulerException {
// 1. 构建任务唯一标识(JobKey = jobId + 任务组名)
String jobId = "FINAL_" + fStoreyId; String jobId = "FINAL_" + fStoreyId;
JobKey jobKey = new JobKey(jobId, JOB_GROUP); JobKey jobKey = new JobKey(jobId, JOB_GROUP);
// 构建触发器唯一标识(TriggerKey = jobId + "_TRIGGER" + 触发器组名)
TriggerKey triggerKey = new TriggerKey(jobId + "_TRIGGER", TRIGGER_GROUP); TriggerKey triggerKey = new TriggerKey(jobId + "_TRIGGER", TRIGGER_GROUP);
// 2. 准备JobDetail(与原有逻辑一致,仅初始化不提交)
String fStoreyIdStr = fStoreyId.toString();
String fPowerOutagePortStr = fPowerOutagePort.toString();
JobDetail job = JobBuilder.newJob(FinalExecutionJob.class) JobDetail job = JobBuilder.newJob(FinalExecutionJob.class)
.withIdentity(jobKey) // 直接用构建好的JobKey .withIdentity(jobKey)
.usingJobData("fStoreyId", fStoreyIdStr) .usingJobData("fStoreyId", fStoreyId.toString())
.usingJobData("fPowerOutageIp", fPowerOutageIp) .usingJobData("fPowerOutageIp", fPowerOutageIp)
.usingJobData("fPowerOutagePort", fPowerOutagePortStr) .usingJobData("fPowerOutagePort", fPowerOutagePort.toString())
.storeDurably() // 保留原有持久化配置 .storeDurably()
.build(); .build();
// 3. 准备新触发器(定时一次执行,测试用10分钟后,后续可改回71小时) // 修复触发器配置:明确使用一次性触发器
Date executeTime = Date.from(Instant.now().plus(10, ChronoUnit.MINUTES)); // 测试用10分钟,正式环境改71 Date executeTime = Date.from(Instant.now().plus(10, ChronoUnit.MINUTES));
Trigger newTrigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey) // 用构建好的TriggerKey SimpleTrigger newTrigger = TriggerBuilder.newTrigger()
.startAt(executeTime) // 指定执行时间(一次触发) .withIdentity(triggerKey)
.startAt(executeTime)
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withMisfireHandlingInstructionFireNow()) // 添加错过执行的处理策略
.build(); .build();
// 4. 分场景处理:存在则更新,不存在则创建 // 修复更新逻辑:先删除再添加,避免冲突
if (scheduler.checkExists(jobKey)) { if (scheduler.checkExists(jobKey)) {
// 任务已存在:更新触发器(重新指定执行时间) // 删除旧触发器,避免冲突
Date updatedTime = scheduler.rescheduleJob(triggerKey, newTrigger); if (scheduler.checkExists(triggerKey)) {
log.info("71小时后执行任务[{}]已存在,成功更新触发器,新执行时间:{}", jobId, updatedTime); scheduler.unscheduleJob(triggerKey);
}
scheduler.scheduleJob(newTrigger);
log.info("71小时后执行任务[{}]已存在,成功更新触发器,新执行时间:{}", jobId, executeTime);
} else { } else {
// 任务不存在:创建JobDetail和触发器
scheduler.scheduleJob(job, newTrigger); scheduler.scheduleJob(job, newTrigger);
log.info("71小时后执行任务[{}]不存在,成功创建任务及触发器,执行时间:{}", jobId, executeTime); log.info("71小时后执行任务[{}]不存在,成功创建任务及触发器,执行时间:{}", jobId, executeTime);
} }
// 验证触发器状态
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger != null) {
log.info("最终任务触发器[{}]下次执行时间: {}", triggerKey, trigger.getNextFireTime());
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment