Commit 3127da68 authored by duanruiming's avatar duanruiming

[add] 增加海康实时数据返回实体,增加线程池配置,增加通过路口编号获取实时数据

parent 90e67c0a
package net.wanji.utc.config;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author duanruiming
* @date 2023/02/14 10:17
*/
@Configuration
public class ThreadPoolConfig {
@Value("${threadPoolConfig.threadPoolName}")
private String threadPoolName;
@Value("${threadPoolConfig.coreSize}")
private int coreSize;
@Value("${threadPoolConfig.maxSize}")
private int maxSize;
@Value("${threadPoolConfig.queueCapacity}")
private int queueCapacity;
@Value("${threadPoolConfig.keepAliveTime}")
private int keepAliveTime;
@Value("${threadPoolConfig.allowCoreTimeOut}")
private boolean allowCoreTimeOut;
@Bean
public ThreadPoolTaskExecutor threadPoolExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
ThreadFactory build = new ThreadFactoryBuilder().setNameFormat(threadPoolName).build();
executor.setThreadFactory(build);
executor.setCorePoolSize(coreSize);
executor.setMaxPoolSize(maxSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setAllowCoreThreadTimeOut(allowCoreTimeOut);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
executor.initialize();
return executor;
}
}
package net.wanji.utc.po.hk.request;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/02/14 14:28
*/
@Data
public class HKRequest {
private int pageNo;
private int pageSize;
private Object searchObj;
}
package net.wanji.utc.po.hk.request;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/02/14 14:36
*/
@Data
public class RealTimeStateInfoQueryPO {
private List<String> crossCodes;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/02/14 15:17
*/
@Data
public class ChannelStatePO {
/**
* 通道号(灯组号)
*/
private Integer channelNo;
/**
* 状态:1绿灯;2红灯;3黄灯;4绿闪;5黄闪;6全红(预留);7灭灯;8红闪;9红黄
*/
private Integer state;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/02/14 14:30
*/
@Data
public class HKResponse {
private String code;
private String msg;
private Object data;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/02/14 15:31
*/
@Data
public class PhaseChannelRelationPO {
/**
* 相位号
*/
private Integer phaseNo;
/**
* 通道号(灯组号)
*/
private List<Integer> channels;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/02/14 15:35
*/
@Data
public class PhaseInfoPO {
/**
* 当前相位运行时长 单位s
*/
private Integer runTime;
/**
* 绿闪时间
*/
private Integer greenLight;
/**
* 黄灯时长
*/
private Integer yellow;
/**
* 红灯时长
*/
private Integer red;
/**
* 当前相位倒计时数据 单位s
*/
private Integer countdown;
/**
* 相位号
*/
private Integer phaseNo;
private String phaseName;
/**
* 相位序号
*/
private Integer phaseSequence;
/**
* 相位时长
*/
private Integer phaseLength;
/**
* 机动车状态:0无效;1绿灯;2红灯;3黄灯;4绿闪;5黄闪;6全红;7灭灯;8红闪;9红黄
*/
private Integer vehicleStatus;
/**
* 行人状态:无效;1绿灯;2红灯;3黄灯;4绿闪;5黄闪;6全红;7灭灯;8红闪;9红黄
*/
private Integer pedestrianStatus;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/02/14 16:46
*/
@Data
public class RealTimeStateInfoListPO {
private List<RealTimeStateInfoPO> list;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author duanruiming
* @date 2023/02/14 14:49
*/
@Data
public class RealTimeStateInfoPO {
/**
* 信号机编号
*/
private String crossCode;
/**
* 控制方式:1关灯;2黄闪;3全红;4定周期;5协调绿波;6协调红波;7全感应;8半感应;9协调绿波全感应;10步进控制;12通道锁定
*/
private String controlType;
/**
* 文档说明,实际返回0
*/
private String controlMode;
/**
* 锁定行为
*/
private List<Integer> lockPhases;
private List<ChannelStatePO> channelState;
/**
* 当前周期已运行时间
*/
private Integer curRunTime;
private Integer lockLeft;
private Integer coorclinatedPhaseNo;
private Boolean hasFault;
private Boolean coordinateTrans;
private Boolean downGrade;
/**
* 当前运行方案号
*/
private Integer patternNo;
private String patternName;
/**
* 方案周期 单位s
*/
private Integer cycle;
private LocalDateTime cycleBeginTime;
/**
* 相位差 单位s
*/
private Integer offset;
private List<PhaseChannelRelationPO> phaseChannelRelation;
/**
* 换列表
*/
private List<RingsPO> rings;
}
package net.wanji.utc.po.hk.response;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2023/02/14 15:34
*/
@Data
public class RingsPO {
private Integer ringNo;
private List<PhaseInfoPO> phaseList;
}
...@@ -11,4 +11,5 @@ import java.util.List; ...@@ -11,4 +11,5 @@ import java.util.List;
*/ */
public interface HkLightsStatusService { public interface HkLightsStatusService {
List<LightsStatusVO> getHkLightsStatus(List<BaseCrossInfo> baseCrossInfoList); List<LightsStatusVO> getHkLightsStatus(List<BaseCrossInfo> baseCrossInfoList);
List<LightsStatusVO> getHkLightsStatus(String crossId);
} }
...@@ -20,4 +20,6 @@ public interface SignalStatusService { ...@@ -20,4 +20,6 @@ public interface SignalStatusService {
List<SignalStatusLogPO> runningStatusAlarm(String crossId); List<SignalStatusLogPO> runningStatusAlarm(String crossId);
List<LightsStatusVO> lightStatus(); List<LightsStatusVO> lightStatus();
List<LightsStatusVO> lightStatus(String crossId);
} }
...@@ -47,6 +47,7 @@ public class HkRunningStatusServiceImpl implements HkRunningStatusService { ...@@ -47,6 +47,7 @@ public class HkRunningStatusServiceImpl implements HkRunningStatusService {
null, null, "application/json", null); null, null, "application/json", null);
JSONObject object = JSON.parseObject(strResult); JSONObject object = JSON.parseObject(strResult);
Object o = object.get("code"); Object o = object.get("code");
// 多信号机情况下,跳过返回信息不成功的获取返回消息成功的信号机数据
if (!Objects.equals(o, 0)) { if (!Objects.equals(o, 0)) {
continue; continue;
} }
......
...@@ -23,7 +23,9 @@ import org.springframework.stereotype.Service; ...@@ -23,7 +23,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -84,6 +86,32 @@ public class SignalStatusServiceImpl implements SignalStatusService { ...@@ -84,6 +86,32 @@ public class SignalStatusServiceImpl implements SignalStatusService {
return signalStatusLogPOList; return signalStatusLogPOList;
} }
@Override
public List<LightsStatusVO> lightStatus(String crossId) {
List<LightsStatusVO> lightsStatusVOList = new ArrayList<>();
String manufacturerCode = getManufacturerCode(crossId);
if (Objects.equals(BasicEnum.ManufacturerEnum.HK.getCode(), manufacturerCode)) {
// 海康
lightsStatusVOList.addAll(hkLightsStatusService.getHkLightsStatus(crossId));
} else {
// 默认万集
lightsStatusVOList.addAll(wanJiRunningStatusService.lightsStatus(Arrays.asList(crossId)));
}
return lightsStatusVOList;
}
private String getManufacturerCode(String crossId) {
CrossInfoPO crossInfoPO = crossInfoMapper.selectByPrimaryKey(crossId);
if (Objects.nonNull(crossInfoPO)) {
Integer manufacturerId = crossInfoPO.getManufacturerId();
ManufacturerInfoPO manufacturerInfoPO = manufacturerInfoMapper.selectById(manufacturerId);
if (Objects.nonNull(manufacturerInfoPO)) {
return manufacturerInfoPO.getCode();
}
}
return "WJ";
}
@Override @Override
@Transactional @Transactional
public List<LightsStatusVO> lightStatus() { public List<LightsStatusVO> lightStatus() {
......
...@@ -4,15 +4,23 @@ import com.alibaba.fastjson.JSONObject; ...@@ -4,15 +4,23 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.po.SignalStatusLogPO; import net.wanji.utc.po.SignalStatusLogPO;
import net.wanji.utc.service.runninginfo.HkLightsStatusService;
import net.wanji.utc.service.runninginfo.SignalStatusService; import net.wanji.utc.service.runninginfo.SignalStatusService;
import net.wanji.utc.vo.LightsStatusVO; import net.wanji.utc.vo.LightsStatusVO;
import net.wanji.utc.websocket.RealTimeDataWebSocket; import net.wanji.utc.websocket.RealTimeDataWebSocket;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
...@@ -27,6 +35,13 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -27,6 +35,13 @@ import java.util.concurrent.ConcurrentHashMap;
public class SignalStatusTask { public class SignalStatusTask {
@Autowired @Autowired
SignalStatusService signalStatusService; SignalStatusService signalStatusService;
@Resource(name = "threadPoolExecutor")
ThreadPoolTaskExecutor threadPoolExecutor;
@Resource
private HkLightsStatusService hkLightsStatusService;
private static Map<String, List<LightsStatusVO>> lightStatusCache = new HashMap<>();
// 运行状态、告警,5分钟一次 // 运行状态、告警,5分钟一次
@Scheduled(fixedRate = 1 * 60 * 1000) @Scheduled(fixedRate = 1 * 60 * 1000)
...@@ -34,21 +49,41 @@ public class SignalStatusTask { ...@@ -34,21 +49,41 @@ public class SignalStatusTask {
List<SignalStatusLogPO> signalStatusLogPOS = signalStatusService.runningStatusAlarm(); List<SignalStatusLogPO> signalStatusLogPOS = signalStatusService.runningStatusAlarm();
} }
// 灯态,5秒一次 // 灯态,秒一次
@Scheduled(fixedRate = 1 * 1000) @Scheduled(fixedRate = 1 * 1000)
public void lightStatus() { public void lightStatus() {
try {
ConcurrentHashMap<String, RealTimeDataWebSocket> evenWarnWebSocketMap = RealTimeDataWebSocket.getEvenWarnWebSocketMap(); ConcurrentHashMap<String, RealTimeDataWebSocket> evenWarnWebSocketMap = RealTimeDataWebSocket.getEvenWarnWebSocketMap();
try {
if (!evenWarnWebSocketMap.isEmpty()) { if (!evenWarnWebSocketMap.isEmpty()) {
for (Map.Entry<String, RealTimeDataWebSocket> entry : evenWarnWebSocketMap.entrySet()) { for (Map.Entry<String, RealTimeDataWebSocket> entry : evenWarnWebSocketMap.entrySet()) {
String crossId = entry.getKey(); threadPoolExecutor.execute(() -> {
RealTimeDataWebSocket webSocket = entry.getValue(); String crossId = null;
List<LightsStatusVO> lightsStatusVOS = signalStatusService.lightStatus(); String crossIdStr = entry.getKey();
webSocket.sendInfo(JSONObject.toJSONString(lightsStatusVOS, SerializerFeature.WriteMapNullValue), crossId); if (StringUtils.isNotBlank(crossIdStr)) {
String[] split = crossIdStr.split(",");
crossId = split[0];
}
long start = System.currentTimeMillis();
List<LightsStatusVO> lightsStatusVOS = hkLightsStatusService.getHkLightsStatus("14Q1409IRF0");
long end = System.currentTimeMillis();
System.err.println(crossId + ":线程池名称:" + Thread.currentThread().getName());
System.err.println(crossId + ":海康平台返回灯态数据时间: " + (end - start) / 1000 + "--" + LocalDateTime.now());
RealTimeDataWebSocket webSocket = entry.getValue();
for (LightsStatusVO lightsStatusVO : lightsStatusVOS) {
if (Objects.equals(lightsStatusVO.getCrossId(), crossId)) {
try {
webSocket.sendInfo(JSONObject.toJSONString(lightsStatusVOS, SerializerFeature.WriteMapNullValue), crossIdStr);
} catch (IOException e) {
log.error("RealTimeDataWebSocket发送异常,");
}
}
}
});
} }
} }
} catch (Exception e) { } catch (Exception e) {
log.error("实时推送灯态数据失败", e); log.error("实时推送灯态数据失败", e);
} }
......
...@@ -57,3 +57,12 @@ pagehelper: ...@@ -57,3 +57,12 @@ pagehelper:
helperDialect: mysql helperDialect: mysql
supportMethodsArguments: true supportMethodsArguments: true
params: count=countSql params: count=countSql
#线程池配置
threadPoolConfig:
threadPoolName: threadPoolExecutor
coreSize: 8
maxSize: 16
queueCapacity: 200
keepAliveTime: 6000
allowCoreTimeOut: false
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