|
|
|
@ -1,23 +1,29 @@
|
|
|
|
package com.zhehekeji.web.service.client;
|
|
|
|
package com.zhehekeji.web.service.client;
|
|
|
|
|
|
|
|
|
|
|
|
import com.zhehekeji.common.util.SpringContextUtil;
|
|
|
|
import com.zhehekeji.common.util.SpringContextUtil;
|
|
|
|
|
|
|
|
import com.zhehekeji.web.entity.Street;
|
|
|
|
import com.zhehekeji.web.lib.CameraControlModule;
|
|
|
|
import com.zhehekeji.web.lib.CameraControlModule;
|
|
|
|
import com.zhehekeji.web.lib.CameraDelayTask;
|
|
|
|
import com.zhehekeji.web.lib.CameraDelayTask;
|
|
|
|
import com.zhehekeji.web.lib.TaskDelayExecutor;
|
|
|
|
import com.zhehekeji.web.lib.TaskDelayExecutor;
|
|
|
|
import com.zhehekeji.web.service.PlcService;
|
|
|
|
import com.zhehekeji.web.service.PlcService;
|
|
|
|
import com.zhehekeji.web.service.ksec.KsecInfo;
|
|
|
|
import com.zhehekeji.web.service.ksec.KsecInfo;
|
|
|
|
import com.zhehekeji.web.service.ksec.KsecNettyClient;
|
|
|
|
import com.zhehekeji.web.service.ksec.KsecNettyClient;
|
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.concurrent.*;
|
|
|
|
import java.util.concurrent.*;
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* GetPhotoDelayExecutor类用于管理照片获取的延时任务。
|
|
|
|
* GetPhotoDelayExecutor类用于管理照片获取的延时任务。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
public class GetPhotoDelayExecutor {
|
|
|
|
public class GetPhotoDelayExecutor {
|
|
|
|
// 延时队列,存放CameraDelayTask任务
|
|
|
|
// 延时队列,存放CameraDelayTask任务
|
|
|
|
public static DelayQueue<CameraDelayTask> cameraDelayTasks = new DelayQueue<>();
|
|
|
|
public static Map<String, DelayQueue<CameraDelayTask>> cameraDelayTaskMap = new ConcurrentHashMap<>();
|
|
|
|
// 线程池,用于执行延时任务
|
|
|
|
// 线程池,用于执行延时任务
|
|
|
|
private static ExecutorService exec = Executors.newFixedThreadPool(1);
|
|
|
|
private static ExecutorService exec = Executors.newFixedThreadPool(10);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 向延时队列中添加一个拍照延时任务。
|
|
|
|
* 向延时队列中添加一个拍照延时任务。
|
|
|
|
@ -28,8 +34,23 @@ public class GetPhotoDelayExecutor {
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static void addCameraDelayTask(String cameraPlcId, String getPhotoCommand, long time) {
|
|
|
|
public static void addCameraDelayTask(String cameraPlcId, String getPhotoCommand, long time) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(cameraDelayTaskMap.get(cameraPlcId)==null || cameraDelayTaskMap.get(cameraPlcId).size() == 0) {
|
|
|
|
|
|
|
|
if( ClientChanel.get(cameraPlcId) != null){
|
|
|
|
|
|
|
|
log.info("队列中无数据,输出"+getPhotoCommand);
|
|
|
|
|
|
|
|
ClientChanel.get(cameraPlcId).writeAndFlush(getPhotoCommand);
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("队列中无数据,未找到通信"+cameraPlcId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraPlcId, getPhotoCommand, time);
|
|
|
|
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraPlcId, getPhotoCommand, time);
|
|
|
|
cameraDelayTasks.add(cameraDelayTask);
|
|
|
|
if(cameraDelayTaskMap.get(cameraPlcId)!=null){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cameraDelayTaskMap.get(cameraPlcId).add(cameraDelayTask);
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
|
|
|
cameraDelayTaskMap.put(cameraPlcId,new DelayQueue<>());
|
|
|
|
|
|
|
|
cameraDelayTaskMap.get(cameraPlcId).add(cameraDelayTask);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -38,47 +59,57 @@ public class GetPhotoDelayExecutor {
|
|
|
|
* @param getPhotoCommand 获取巷道编号
|
|
|
|
* @param getPhotoCommand 获取巷道编号
|
|
|
|
* @param cameraPlcId 命令行
|
|
|
|
* @param cameraPlcId 命令行
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static void remove(String getPhotoCommand, String cameraPlcId) {
|
|
|
|
public static CameraDelayTask remove(String cameraPlcId, String getPhotoCommand) {
|
|
|
|
cameraPlcId = cameraPlcId.intern();
|
|
|
|
cameraPlcId = cameraPlcId.intern();
|
|
|
|
synchronized (cameraPlcId) {
|
|
|
|
synchronized (cameraPlcId) {
|
|
|
|
// 将延时队列中的任务转换为数组,便于遍历和移除
|
|
|
|
// 将延时队列中的任务转换为数组,便于遍历和移除
|
|
|
|
Object[] cameraDelayTask = cameraDelayTasks.toArray();
|
|
|
|
Object[] objects = cameraDelayTaskMap.get(cameraPlcId).toArray();
|
|
|
|
for (Object cameraDelayTask1 : cameraDelayTask) {
|
|
|
|
if(objects.length > 0) {
|
|
|
|
CameraDelayTask cameraDelayTask2 = (CameraDelayTask) cameraDelayTask1;
|
|
|
|
CameraDelayTask cameraDelayTask = (CameraDelayTask)objects[0];
|
|
|
|
if (cameraDelayTask2.getCameraPlcId().equals(getPhotoCommand)) {
|
|
|
|
|
|
|
|
cameraDelayTasks.remove(cameraDelayTask2);
|
|
|
|
if (cameraDelayTask != null) {
|
|
|
|
|
|
|
|
cameraDelayTaskMap.get(cameraPlcId).remove(cameraDelayTask);
|
|
|
|
|
|
|
|
return cameraDelayTask;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
public static CameraDelayTask nextOne(String cameraPlcId, String getPhotoCommand) {
|
|
|
|
* 获取延时队列中最早的任务,并将其从队列中移除。
|
|
|
|
cameraPlcId = cameraPlcId.intern();
|
|
|
|
*
|
|
|
|
synchronized (cameraPlcId) {
|
|
|
|
* @param cameraPlcId 相机的PLC编号,该参数未被使用
|
|
|
|
// 将延时队列中的任务转换为数组,便于遍历和移除
|
|
|
|
* @return 返回最早的任务,如果队列为空则返回null
|
|
|
|
Object[] objects = cameraDelayTaskMap.get(cameraPlcId).toArray();
|
|
|
|
*/
|
|
|
|
if(objects.length > 0) {
|
|
|
|
public static CameraDelayTask getNext(String cameraPlcId) {
|
|
|
|
CameraDelayTask cameraDelayTask = (CameraDelayTask)objects[0];
|
|
|
|
Object[] cameraDelayTask = cameraDelayTasks.toArray();
|
|
|
|
if (cameraDelayTask != null) {
|
|
|
|
if (cameraDelayTask.length > 0) {
|
|
|
|
return cameraDelayTask;
|
|
|
|
CameraDelayTask cameraDelayTask2 = (CameraDelayTask) cameraDelayTask[0];
|
|
|
|
|
|
|
|
return cameraDelayTask2;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 启动延时任务的执行器。
|
|
|
|
* 启动延时任务的执行器。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static void runExecutor() {
|
|
|
|
public static void runExecutor(List<Street> streets ) {
|
|
|
|
exec.execute(new GetPhotoDelayExecutor.Consumer());
|
|
|
|
for (Street street: streets){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exec.execute(new GetPhotoDelayExecutor.Consumer(street));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Consumer内部类,实现Runnable接口,用于消费延时队列中的任务。
|
|
|
|
* Consumer内部类,实现Runnable接口,用于消费延时队列中的任务。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private static class Consumer implements Runnable {
|
|
|
|
private static class Consumer implements Runnable {
|
|
|
|
|
|
|
|
private Street street;
|
|
|
|
|
|
|
|
Consumer(Street street){
|
|
|
|
|
|
|
|
this.street = street;
|
|
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 无限循环,不断从延时队列中取出任务并执行。
|
|
|
|
* 无限循环,不断从延时队列中取出任务并执行。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ -89,17 +120,20 @@ public class GetPhotoDelayExecutor {
|
|
|
|
// 从Spring上下文中获取PlcService实例
|
|
|
|
// 从Spring上下文中获取PlcService实例
|
|
|
|
PlcService plcService = SpringContextUtil.getBean(PlcService.class);
|
|
|
|
PlcService plcService = SpringContextUtil.getBean(PlcService.class);
|
|
|
|
// 从延时队列中获取并移除一个任务
|
|
|
|
// 从延时队列中获取并移除一个任务
|
|
|
|
CameraDelayTask cameraDelayTask = cameraDelayTasks.take();
|
|
|
|
if(cameraDelayTaskMap.get(street.getPlcId())!= null) {
|
|
|
|
if(cameraDelayTask != null) {
|
|
|
|
CameraDelayTask cameraDelayTask = cameraDelayTaskMap.get(street.getPlcId()).take();
|
|
|
|
// 构造传输对象,并将任务命令等信息设置进去
|
|
|
|
if (cameraDelayTask != null) {
|
|
|
|
TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand());
|
|
|
|
// 构造传输对象,并将任务命令等信息设置进去
|
|
|
|
// 调用PLC服务,模拟发送数据到上位机
|
|
|
|
TransmissionPojo transmissionPojo = new TransmissionPojo(cameraDelayTask.getCommand());
|
|
|
|
KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo, "E");
|
|
|
|
// 调用PLC服务,模拟发送数据到上位机
|
|
|
|
ksecInfo.getData().setTypeNum(transmissionPojo.getCategory());
|
|
|
|
KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo, "E");
|
|
|
|
ksecInfo.getData().setQuantity(transmissionPojo.getCount());
|
|
|
|
ksecInfo.getData().setTypeNum(transmissionPojo.getCategory());
|
|
|
|
ksecInfo.getData().setCheckRlt(0);
|
|
|
|
ksecInfo.getData().setQuantity(transmissionPojo.getCount());
|
|
|
|
// 将信息发送给上位机
|
|
|
|
ksecInfo.getData().setCheckRlt(0);
|
|
|
|
KsecNettyClient.write(ksecInfo);
|
|
|
|
// 将信息发送给上位机
|
|
|
|
|
|
|
|
if (!transmissionPojo.getTaskId().equals("0"))
|
|
|
|
|
|
|
|
KsecNettyClient.write(ksecInfo);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
e.printStackTrace();
|
|
|
|
|