Commit 70d5c407 authored by wanghao's avatar wanghao

1测试上电断电操作

parent 9b331001
...@@ -21,6 +21,11 @@ public class DeviceTaskScheduler { ...@@ -21,6 +21,11 @@ public class DeviceTaskScheduler {
private static final Logger log = LoggerFactory.getLogger(DeviceTaskScheduler.class); private static final Logger log = LoggerFactory.getLogger(DeviceTaskScheduler.class);
@Resource @Resource
private Scheduler scheduler; private Scheduler scheduler;
// 任务组名(统一固定,与原有逻辑保持一致)
private static final String JOB_GROUP = "DEVICE_TASKS";
// 触发器组名(统一固定,与原有逻辑保持一致)
private static final String TRIGGER_GROUP = "DEVICE_TRIGGERS";
/** /**
* 创建设备监控任务 * 创建设备监控任务
* @param fStoreyId 设备ID * @param fStoreyId 设备ID
...@@ -38,52 +43,75 @@ public class DeviceTaskScheduler { ...@@ -38,52 +43,75 @@ public class DeviceTaskScheduler {
* 创建每小时通信任务 * 创建每小时通信任务
*/ */
private void createHourlyCommunicationJob(Long fStoreyId) throws SchedulerException { private void createHourlyCommunicationJob(Long fStoreyId) throws SchedulerException {
// 任务标识 = 设备ID + 任务类型 // 1. 构建任务唯一标识(JobKey = jobId + 任务组名)
String jobId = "COMM_" + fStoreyId; String jobId = "COMM_" + fStoreyId;
JobKey jobKey = new JobKey(jobId, JOB_GROUP);
// 构建触发器唯一标识(TriggerKey = jobId + "_TRIGGER" + 触发器组名)
TriggerKey triggerKey = new TriggerKey(jobId + "_TRIGGER", TRIGGER_GROUP);
String fStoreyIdStr = fStoreyId + ""; // 2. 准备JobDetail(与原有逻辑一致,仅初始化不提交)
String fStoreyIdStr = fStoreyId.toString();
JobDetail job = JobBuilder.newJob(DeviceCommunicationJob.class) JobDetail job = JobBuilder.newJob(DeviceCommunicationJob.class)
.withIdentity(jobId, "DEVICE_TASKS") .withIdentity(jobKey) // 直接用构建好的JobKey,避免重复编码
.usingJobData("fStoreyId", fStoreyIdStr) .usingJobData("fStoreyId", fStoreyIdStr)
.storeDurably() .storeDurably() // 保留原有持久化配置
.build(); .build();
// 测试每两分钟 读一次数据 // 3. 准备新触发器(Cron调度,与原有逻辑一致)
Trigger trigger = TriggerBuilder.newTrigger() Trigger newTrigger = TriggerBuilder.newTrigger()
.withIdentity(jobId + "_TRIGGER", "DEVICE_TRIGGERS") .withIdentity(triggerKey) // 用构建好的TriggerKey
// .withSchedule(CronScheduleBuilder.cronSchedule("0 0 * * * ?")) 每小时执行一次 (0分0秒执行) .withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 * * * ?")) // 测试每2分钟执行,后续可改回0 0 * * * ?
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 * * * ?"))
.build(); .build();
scheduler.scheduleJob(job, trigger); // 4. 分场景处理:存在则更新,不存在则创建
if (scheduler.checkExists(jobKey)) {
// 任务已存在:更新触发器(替换旧触发器为新触发器)
Date updatedTime = scheduler.rescheduleJob(triggerKey, newTrigger);
log.info("每小时通信任务[{}]已存在,成功更新触发器,下次执行时间:{}", jobId, updatedTime);
} else {
// 任务不存在:创建JobDetail和触发器
scheduler.scheduleJob(job, newTrigger);
log.info("每小时通信任务[{}]不存在,成功创建任务及触发器", jobId);
}
} }
/** /**
* 创建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);
// 构建触发器唯一标识(TriggerKey = jobId + "_TRIGGER" + 触发器组名)
TriggerKey triggerKey = new TriggerKey(jobId + "_TRIGGER", TRIGGER_GROUP);
// 2. 准备JobDetail(与原有逻辑一致,仅初始化不提交)
String fStoreyIdStr = fStoreyId.toString(); String fStoreyIdStr = fStoreyId.toString();
String fPowerOutagePortStr = fPowerOutagePort.toString(); String fPowerOutagePortStr = fPowerOutagePort.toString();
JobDetail job = JobBuilder.newJob(FinalExecutionJob.class) JobDetail job = JobBuilder.newJob(FinalExecutionJob.class)
.withIdentity(jobId, "DEVICE_TASKS") .withIdentity(jobKey) // 直接用构建好的JobKey
.usingJobData("fStoreyId", fStoreyIdStr) .usingJobData("fStoreyId", fStoreyIdStr)
.usingJobData("fPowerOutageIp", fPowerOutageIp) .usingJobData("fPowerOutageIp", fPowerOutageIp)
.usingJobData("fPowerOutagePort", fPowerOutagePortStr) .usingJobData("fPowerOutagePort", fPowerOutagePortStr)
.storeDurably() .storeDurably() // 保留原有持久化配置
.build(); .build();
// 计算71小时后的时间点 // 3. 准备新触发器(定时一次执行,测试用10分钟后,后续可改回71小时)
// Date executeTime = Date.from(Instant.now().plus(71, ChronoUnit.HOURS)); Date executeTime = Date.from(Instant.now().plus(10, ChronoUnit.MINUTES)); // 测试用10分钟,正式环境改71
// 测试 先用 10分钟 Trigger newTrigger = TriggerBuilder.newTrigger()
Date executeTime = Date.from(Instant.now().plus(10, ChronoUnit.MINUTES)); .withIdentity(triggerKey) // 用构建好的TriggerKey
.startAt(executeTime) // 指定执行时间(一次触发)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobId + "_TRIGGER", "DEVICE_TRIGGERS")
.startAt(executeTime)
.build(); .build();
scheduler.scheduleJob(job, trigger); // 4. 分场景处理:存在则更新,不存在则创建
if (scheduler.checkExists(jobKey)) {
// 任务已存在:更新触发器(重新指定执行时间)
Date updatedTime = scheduler.rescheduleJob(triggerKey, newTrigger);
log.info("71小时后执行任务[{}]已存在,成功更新触发器,新执行时间:{}", jobId, updatedTime);
} else {
// 任务不存在:创建JobDetail和触发器
scheduler.scheduleJob(job, newTrigger);
log.info("71小时后执行任务[{}]不存在,成功创建任务及触发器,执行时间:{}", jobId, executeTime);
}
} }
} }
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