Commit 6a332201 authored by wanghao's avatar wanghao

1 指令指令完成,但是 没有检测到机械臂完成。

parent 2511f9c5
package com.zehong.system.task;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @author lenovo
* @date 2025/9/25
* @description TODO
*/
@Component
public class DeviceComm501Job extends BaseDeviceCommJob {
@Override
protected int getFixedPort() {
return 501; // 固定端口501
}
@Override
protected List<Integer> getDeviceIds() {
// 端口501对应的设备ID列表
return Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27);
}
}
package com.zehong.system.task;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @author lenovo
* @date 2025/9/25
* @description TODO
*/
@Component
public class DeviceComm502Job extends BaseDeviceCommJob {
@Override
protected int getFixedPort() {
return 502; // 固定端口502
}
@Override
protected List<Integer> getDeviceIds() {
// 端口502对应的设备ID列表
return Arrays.asList(28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54);
}
}
package com.zehong.system.task;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @author lenovo
* @date 2025/9/25
* @description TODO
*/
@Component
public class DeviceComm503Job extends BaseDeviceCommJob{
@Override
protected int getFixedPort() {
return 503; // 固定端口503
}
@Override
protected List<Integer> getDeviceIds() {
// 端口503对应的设备ID列表
return Arrays.asList(55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72);
}
}
......@@ -29,14 +29,6 @@ public class DeviceTaskScheduler {
private static final String JOB_GROUP = "DEVICE_TASKS";
// 触发器组名(统一固定,与原有逻辑保持一致)
private static final String TRIGGER_GROUP = "DEVICE_TRIGGERS";
// 新增:每个设备任务的Quartz线程隔离(避免任务间干扰)
private static final String THREAD_GROUP = "DEVICE_THREAD_GROUP";
// 常量:Cron周期(3分钟)、任务有效期(7天)
private static final String CRON_EXPRESSION = "0 0/5 * * * ?";
private static final int TASK_VALID_DAYS = 7;
@PostConstruct
public void init() throws SchedulerException {
scheduler.getListenerManager().addJobListener(new QuartzJobListener());
......@@ -57,19 +49,10 @@ public class DeviceTaskScheduler {
// 1. 调度器健康检查(确保线程池可用)
checkSchedulerHealth();
// 2. 任务去重(避免重复创建导致资源竞争)
if (isTaskExists("COMM_" + fStoreyId)) {
log.info("通信任务[COMM_{}]已存在,无需重复创建", fStoreyId);
// 检查现有触发器状态,若为ERROR则重建
if (isTriggerError("COMM_" + fStoreyId)) {
log.warn("通信任务[COMM_{}]触发器状态为ERROR,重建触发器", fStoreyId);
createHourlyCommunicationJob(fStoreyId);
}
return;
}
// 3. 创建核心任务
createHourlyCommunicationJob(fStoreyId);
// 1. 创建3个端口专属任务(501:5分钟后,502:10分钟后,503:15分钟后)
createPortSpecificCommJobs(fStoreyId);
createFinalExecutionJob(fStoreyId, fPowerOutageIp, fPowerOutagePort);
checkTaskStatus(fStoreyId);
......@@ -81,6 +64,68 @@ public class DeviceTaskScheduler {
throw new RuntimeException("Quartz任务调度失败", e);
}
}
// -------------------------- 新增:创建3个端口专属任务 --------------------------
/**
* 为3个端口Job创建一次性SimpleTrigger:
* - 501Job:当前时间+5分钟
* - 502Job:当前时间+10分钟
* - 503Job:当前时间+15分钟
*/
private void createPortSpecificCommJobs(Long fStoreyId) throws SchedulerException {
// 1. 端口501:5分钟后执行
createPortCommJob(fStoreyId, 501, DeviceComm501Job.class, 5);
// 2. 端口502:10分钟后执行
createPortCommJob(fStoreyId, 502, DeviceComm502Job.class, 10);
// 3. 端口503:15分钟后执行
createPortCommJob(fStoreyId, 503, DeviceComm503Job.class, 15);
}
/**
* 单个端口Job和Trigger创建(通用方法)
* @param fStoreyId 设备ID
* @param port 端口号
* @param jobClass Job类
* @param delayMin 延迟执行时间(分钟)
*/
private void createPortCommJob(Long fStoreyId, int port, Class<? extends Job> jobClass, int delayMin) throws SchedulerException {
String jobId = "COMM_" + port + "_" + fStoreyId; // JobID:COMM_501_123(端口+设备ID,确保唯一)
String triggerId = "TRIGGER_" + port + "_" + fStoreyId; // TriggerID:TRIGGER_501_123
JobKey jobKey = new JobKey(jobId, JOB_GROUP);
TriggerKey triggerKey = new TriggerKey(triggerId, TRIGGER_GROUP);
// 1. 去重:先删除旧任务/触发器
if (scheduler.checkExists(triggerKey)) {
scheduler.unscheduleJob(triggerKey);
log.info("端口[{}]旧触发器已删除:{}", port, triggerId);
}
if (scheduler.checkExists(jobKey)) {
scheduler.deleteJob(jobKey);
log.info("端口[{}]旧任务已删除:{}", port, jobId);
}
// 2. 创建JobDetail
JobDetail job = JobBuilder.newJob(jobClass)
.withIdentity(jobKey)
.usingJobData("fStoreyId", fStoreyId.toString()) // 传递设备ID
.storeDurably(false)
.build();
// 3. 创建一次性SimpleTrigger(延迟delayMin分钟,仅执行1次)
Date triggerTime = Date.from(Instant.now().plus(delayMin, ChronoUnit.MINUTES));
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey)
.forJob(jobKey)
.startAt(triggerTime) // 延迟执行时间
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withRepeatCount(0) // 仅执行1次
.withMisfireHandlingInstructionFireNow()) // 错过则立即执行
.build();
// 4. 提交调度
Date nextFireTime = scheduler.scheduleJob(job, trigger);
log.info("端口[{}]任务创建成功:jobId={},延迟{}分钟,下次执行:{}",
port, jobId, delayMin, nextFireTime);
}
/**
* 1. 创建每5分钟执行的通信任务(核心优化:简化调度逻辑、调整Misfire策略)
......
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