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