diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 55c2e4d..550104c 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -733,6 +733,7 @@ public class PlcService { Thread.sleep(50L); if (lock.tryLock()) { //队列中没有任务,发送取图指令 + //只采用队列,队列中有数据则自动发送 if (GetPhotoDelayExecutor.cameraDelayTasks.size() == 0 && ClientChanel.get(dataInfo.getSRMNumber()) != null) { ClientChanel.get(street.getPlcId()).writeAndFlush(transmissionPojo.toString(TransmissionType.GPS)); } diff --git a/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java b/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java index fe7864d..aab1719 100644 --- a/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java +++ b/web/src/main/java/com/zhehekeji/web/service/client/GetPhotoDelayExecutor.java @@ -10,63 +10,95 @@ import com.zhehekeji.web.service.ksec.KsecNettyClient; import java.util.Map; import java.util.concurrent.*; - +/** + * GetPhotoDelayExecutor类用于管理照片获取的延时任务。 + */ public class GetPhotoDelayExecutor { + // 延时队列,存放CameraDelayTask任务 public static DelayQueue cameraDelayTasks = new DelayQueue<>(); + // 线程池,用于执行延时任务 private static ExecutorService exec = Executors.newFixedThreadPool(1); + /** + * 向延时队列中添加一个拍照延时任务。 + * + * @param cameraPlcId 相机的PLC编号 + * @param getPhotoCommand 获取照片的命令 + * @param time 任务延时时间 + */ public static void addCameraDelayTask(String cameraPlcId, String getPhotoCommand, long time) { CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraPlcId, getPhotoCommand, time); cameraDelayTasks.add(cameraDelayTask); } + /** + * 根据命令和相机PLC编号从延时队列中移除任务。 + * + * @param getPhotoCommand 获取巷道编号 + * @param cameraPlcId 命令行 + */ public static void remove(String getPhotoCommand, String cameraPlcId) { cameraPlcId = cameraPlcId.intern(); synchronized (cameraPlcId) { + // 将延时队列中的任务转换为数组,便于遍历和移除 Object[] cameraDelayTask = cameraDelayTasks.toArray(); for (Object cameraDelayTask1 : cameraDelayTask) { CameraDelayTask cameraDelayTask2 = (CameraDelayTask) cameraDelayTask1; - if (cameraDelayTask2.getCommand().equals(getPhotoCommand)) { + if (cameraDelayTask2.getCameraPlcId().equals(getPhotoCommand)) { cameraDelayTasks.remove(cameraDelayTask2); } } } } - + /** + * 获取延时队列中最早的任务,并将其从队列中移除。 + * + * @param cameraPlcId 相机的PLC编号,该参数未被使用 + * @return 返回最早的任务,如果队列为空则返回null + */ public static CameraDelayTask getNext(String cameraPlcId) { Object[] cameraDelayTask = cameraDelayTasks.toArray(); if (cameraDelayTask.length > 0) { CameraDelayTask cameraDelayTask2 = (CameraDelayTask) cameraDelayTask[0]; - remove(cameraDelayTask2.getCommand(), cameraPlcId); return cameraDelayTask2; } return null; } + /** + * 启动延时任务的执行器。 + */ public static void runExecutor() { exec.execute(new GetPhotoDelayExecutor.Consumer()); } + /** + * Consumer内部类,实现Runnable接口,用于消费延时队列中的任务。 + */ private static class Consumer implements Runnable { - - - + /** + * 无限循环,不断从延时队列中取出任务并执行。 + */ @Override public void run() { while (true) { try { + // 从Spring上下文中获取PlcService实例 PlcService plcService = SpringContextUtil.getBean(PlcService.class); + // 从延时队列中获取并移除一个任务 CameraDelayTask cameraDelayTask = cameraDelayTasks.take(); if(cameraDelayTask != null) { + // 构造传输对象,并将任务命令等信息设置进去 TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand()); - //发送给上位机 + // 调用PLC服务,模拟发送数据到上位机 KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo, "E"); ksecInfo.getData().setTypeNum(transmissionPojo.getCategory()); ksecInfo.getData().setQuantity(transmissionPojo.getCount()); ksecInfo.getData().setCheckRlt(0); + // 将信息发送给上位机 KsecNettyClient.write(ksecInfo); } } catch (InterruptedException e) {