@ -23,7 +23,8 @@ public class GetPhotoDelayExecutor {
// 延时队列, 存放CameraDelayTask任务
// 延时队列, 存放CameraDelayTask任务
public static Map < String , DelayQueue < CameraDelayTask > > cameraDelayTaskMap = new ConcurrentHashMap < > ( ) ;
public static Map < String , DelayQueue < CameraDelayTask > > cameraDelayTaskMap = new ConcurrentHashMap < > ( ) ;
// 线程池,用于执行延时任务
// 线程池,用于执行延时任务
private static ExecutorService exec = Executors . newFixedThreadPool ( 10 ) ;
public static DelayQueue < CameraDelayTask > delayTasks = new DelayQueue < > ( ) ;
private static ExecutorService exec = Executors . newFixedThreadPool ( 15 ) ;
/ * *
/ * *
* 向 延 时 队 列 中 添 加 一 个 拍 照 延 时 任 务 。
* 向 延 时 队 列 中 添 加 一 个 拍 照 延 时 任 务 。
@ -32,7 +33,7 @@ public class GetPhotoDelayExecutor {
* @param getPhotoCommand 获 取 照 片 的 命 令
* @param getPhotoCommand 获 取 照 片 的 命 令
* @param time 任 务 延 时 时 间
* @param time 任 务 延 时 时 间
* /
* /
public static void addCameraDelayTask ( String cameraPlcId , String getPhotoCommand , long time ) {
public static void addCameraDelayTask ( String cameraPlcId , String getPhotoCommand , long time ,TransmissionPojo transmissionPojo ) {
if ( cameraDelayTaskMap . get ( cameraPlcId ) = = null | | cameraDelayTaskMap . get ( cameraPlcId ) . size ( ) = = 0 ) {
if ( cameraDelayTaskMap . get ( cameraPlcId ) = = null | | cameraDelayTaskMap . get ( cameraPlcId ) . size ( ) = = 0 ) {
if ( ClientChanel . get ( cameraPlcId ) ! = null ) {
if ( ClientChanel . get ( cameraPlcId ) ! = null ) {
@ -43,7 +44,7 @@ public class GetPhotoDelayExecutor {
log . info ( "队列中无数据,未找到通信" + cameraPlcId ) ;
log . info ( "队列中无数据,未找到通信" + cameraPlcId ) ;
}
}
}
}
CameraDelayTask cameraDelayTask = new CameraDelayTask ( cameraPlcId , getPhotoCommand , time );
CameraDelayTask cameraDelayTask = new CameraDelayTask ( cameraPlcId , getPhotoCommand , time ,transmissionPojo );
if ( cameraDelayTaskMap . get ( cameraPlcId ) ! = null ) {
if ( cameraDelayTaskMap . get ( cameraPlcId ) ! = null ) {
cameraDelayTaskMap . get ( cameraPlcId ) . add ( cameraDelayTask ) ;
cameraDelayTaskMap . get ( cameraPlcId ) . add ( cameraDelayTask ) ;
@ -51,27 +52,56 @@ public class GetPhotoDelayExecutor {
cameraDelayTaskMap . put ( cameraPlcId , new DelayQueue < > ( ) ) ;
cameraDelayTaskMap . put ( cameraPlcId , new DelayQueue < > ( ) ) ;
cameraDelayTaskMap . get ( cameraPlcId ) . add ( cameraDelayTask ) ;
cameraDelayTaskMap . get ( cameraPlcId ) . add ( cameraDelayTask ) ;
}
}
delayTasks . add ( cameraDelayTask ) ;
}
}
/ * *
/ * *
* 根 据 命 令 和 相 机 PLC 编 号 从 延 时 队 列 中 移 除 任 务 。
* 根 据 命 令 和 相 机 PLC 编 号 从 延 时 队 列 中 移 除 任 务 。
*
*
* @param getPhotoCommand 获 取 巷 道 编 号
* @param cameraPlcId 命 令 行
* @param cameraPlcId 命 令 行
* /
* /
public static CameraDelayTask remove ( String cameraPlcId , String getPhotoCommand ) {
public static CameraDelayTask remove ( String cameraPlcId , TransmissionPojo transmissionPojo ) {
cameraPlcId = cameraPlcId . intern ( ) ;
synchronized ( cameraPlcId ) {
synchronized ( cameraPlcId ) {
// 将延时队列中的任务转换为数组,便于遍历和移除
// 将延时队列中的任务转换为数组,便于遍历和移除
Object [ ] objects = cameraDelayTaskMap . get ( cameraPlcId ) . toArray ( ) ;
Object [ ] objects = cameraDelayTaskMap . get ( cameraPlcId ) . toArray ( ) ;
if ( objects . length > 0 ) {
if ( objects . length > 0 ) {
CameraDelayTask cameraDelayTask = ( CameraDelayTask ) objects [ 0 ] ;
for ( Object object : objects ) {
if ( cameraDelayTask ! = null ) {
CameraDelayTask cameraDelayTask = ( CameraDelayTask ) object ;
cameraDelayTaskMap . get ( cameraPlcId ) . remove ( cameraDelayTask ) ;
if ( cameraDelayTask ! = null
return cameraDelayTask ;
& & cameraDelayTask . getTransmissionPojo ( ) . getTaskId ( ) . equals ( transmissionPojo . getTaskId ( ) )
& & cameraDelayTask . getTransmissionPojo ( ) . getCheckId ( ) . equals ( transmissionPojo . getCheckId ( ) )
& & cameraDelayTask . getTransmissionPojo ( ) . getDirection ( ) . equals ( transmissionPojo . getDirection ( ) ) ) {
cameraDelayTaskMap . get ( cameraPlcId ) . remove ( cameraDelayTask ) ;
return cameraDelayTask ;
}
}
}
}
return null ;
}
public static CameraDelayTask removeTask ( String cameraPlcId , TransmissionPojo transmissionPojo ) {
synchronized ( cameraPlcId ) {
// 将延时队列中的任务转换为数组,便于遍历和移除
Object [ ] objects = delayTasks . toArray ( ) ;
if ( objects . length > 0 ) {
for ( Object object : objects ) {
CameraDelayTask cameraDelayTask = ( CameraDelayTask ) object ;
if ( cameraDelayTask ! = null
& & cameraDelayTask . getTransmissionPojo ( ) . getTaskId ( ) . equals ( transmissionPojo . getTaskId ( ) )
& & cameraDelayTask . getTransmissionPojo ( ) . getCheckId ( ) . equals ( transmissionPojo . getCheckId ( ) )
& & cameraDelayTask . getTransmissionPojo ( ) . getDirection ( ) . equals ( transmissionPojo . getDirection ( ) ) ) {
delayTasks . remove ( cameraDelayTask ) ;
return cameraDelayTask ;
}
}
}
}
}
}
}
return null ;
return null ;
@ -100,6 +130,7 @@ public class GetPhotoDelayExecutor {
exec . execute ( new GetPhotoDelayExecutor . Consumer ( street ) ) ;
exec . execute ( new GetPhotoDelayExecutor . Consumer ( street ) ) ;
}
}
exec . execute ( new GetPhotoDelayExecutor . TaskConsumer ( ) ) ;
}
}
/ * *
/ * *
@ -120,8 +151,40 @@ public class GetPhotoDelayExecutor {
// 从Spring上下文中获取PlcService实例
// 从Spring上下文中获取PlcService实例
PlcService plcService = SpringContextUtil . getBean ( PlcService . class ) ;
PlcService plcService = SpringContextUtil . getBean ( PlcService . class ) ;
// 从延时队列中获取并移除一个任务
// 从延时队列中获取并移除一个任务
if ( cameraDelayTaskMap . get ( street . getPlcId ( ) ) ! = null ) {
if ( cameraDelayTaskMap . get ( street . getPlcId ( ) ) ! = null ) {
CameraDelayTask cameraDelayTask = cameraDelayTaskMap . get ( street . getPlcId ( ) ) . take ( ) ;
CameraDelayTask cameraDelayTask = cameraDelayTaskMap . get ( street . getPlcId ( ) ) . 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);
// // 将信息发送给上位机
// if (!transmissionPojo.getTaskId().equals("0"))
// KsecNettyClient.write(ksecInfo);
// }
}
} catch ( InterruptedException e ) {
e . printStackTrace ( ) ;
}
}
}
}
private static class TaskConsumer implements Runnable {
/ * *
* 无 限 循 环 , 不 断 从 延 时 队 列 中 取 出 任 务 并 执 行 。
* /
@Override
public void run ( ) {
while ( true ) {
try {
// 从Spring上下文中获取PlcService实例
PlcService plcService = SpringContextUtil . getBean ( PlcService . class ) ;
// 从延时队列中获取并移除一个任务
CameraDelayTask cameraDelayTask = delayTasks . take ( ) ;
if ( cameraDelayTask ! = null ) {
if ( cameraDelayTask ! = null ) {
// 构造传输对象,并将任务命令等信息设置进去
// 构造传输对象,并将任务命令等信息设置进去
TransmissionPojo transmissionPojo = new TransmissionPojo ( cameraDelayTask . getCommand ( ) ) ;
TransmissionPojo transmissionPojo = new TransmissionPojo ( cameraDelayTask . getCommand ( ) ) ;
@ -134,7 +197,6 @@ public class GetPhotoDelayExecutor {
if ( ! transmissionPojo . getTaskId ( ) . equals ( "0" ) )
if ( ! transmissionPojo . getTaskId ( ) . equals ( "0" ) )
KsecNettyClient . write ( ksecInfo ) ;
KsecNettyClient . write ( ksecInfo ) ;
}
}
}
} catch ( InterruptedException e ) {
} catch ( InterruptedException e ) {
e . printStackTrace ( ) ;
e . printStackTrace ( ) ;
}
}
@ -142,5 +204,4 @@ public class GetPhotoDelayExecutor {
}
}
}
}
}
}