Commit f91f7e33 authored by duanruiming's avatar duanruiming

[update] 添加异常类,优化异常处理

parent 4e0dce3b
package net.wanji.web.common.exception;
import net.wanji.common.framework.exceptionhandler.GlobalExceptionHandler;
/**
* @author duanruiming
* @date 2023/03/03 14:42
*/
public class ControlServiceException extends GlobalExceptionHandler {
}
......@@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author
*/
@SpringBootApplication(scanBasePackages = {"net.wanji.opt", "net.wanji.databus"})
@SpringBootApplication(scanBasePackages = {"net.wanji.opt", "net.wanji.databus", "net.wanji.common"})
@MapperScan(basePackages = {"net.wanji.opt.dao.mapper", "net.wanji.databus.dao.mapper"})
@EnableTransactionManagement
@EnableScheduling
......
......@@ -6,6 +6,7 @@ import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.enums.WeekEnum;
import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.opt.common.exception.OptServiceException;
import net.wanji.opt.dto.*;
import net.wanji.opt.service.CrossSchedulesService;
import net.wanji.opt.service.CrossSchemeService;
......@@ -88,7 +89,7 @@ public class CrossDirTurnPhaseCache implements CommandLineRunner {
dir = lights.getDir();
if (Objects.isNull(lights.getLaneInfos())) {
log.error("{}-路口, {}-方案,{}-灯组,灯组中车道信息不能为空", crossId, scheme.getId(), lights.getId());
throw new Exception("灯组中车道信息不能为空");
throw new OptServiceException("当前路口:".concat(crossId).concat(", 灯组关联车道信息不能为空"));
}
for (LaneInfoDTO lane : lights.getLaneInfos()) {
// 车道转向转换为转向类型,并去重
......
......@@ -20,4 +20,9 @@ public class OptExceptionHandler extends GlobalExceptionHandler {
public JsonViewObject uniqueExceptionHandler(UniqueException e) {
return JsonViewObject.newInstance().fail(e);
}
@ExceptionHandler(value = OptServiceException.class)
public JsonViewObject OptServiceExceptionHandler(OptServiceException e) {
return JsonViewObject.newInstance().fail(e.getMessage(), "optService服务调用异常");
}
}
\ No newline at end of file
package net.wanji.opt.common.exception;
/**
* @author duanruiming
* @date 2023/03/03 13:47
*/
public class OptServiceException extends RuntimeException {
public OptServiceException() {
super();
}
public OptServiceException(String message) {
super(message);
}
public OptServiceException(String message, Exception e) {
super(message, e);
}
}
\ No newline at end of file
......@@ -4,6 +4,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.service.signalcontrol.FeignProxyService;
import net.wanji.opt.vo.SchemeOptSendVO;
......@@ -29,6 +31,7 @@ public class SignalCommandOptController {
@Autowired
private FeignProxyService feignProxyService;
@AspectLog(description = "诊断优化手动优化方案下发", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "手动优化方案下发", notes = "优化方案下发", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/schemeOptSend",
......@@ -39,6 +42,7 @@ public class SignalCommandOptController {
return jsonViewObject;
}
@AspectLog(description = "诊断优化手动优化方案恢复", operationType = BaseEnum.OperationTypeEnum.UPDATE)
@ApiOperation(value = "手动优化方案恢复", notes = "优化方案恢复", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/schemeOptRestore",
......
......@@ -11,6 +11,7 @@ import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.pojo.vo.SignalStatusVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.opt.cache.CrossDirTurnPhaseCache;
import net.wanji.opt.common.exception.OptServiceException;
import net.wanji.opt.dao.mapper.CrossPhaseMapper;
import net.wanji.opt.dao.mapper.CrossSchemeMapper;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
......@@ -186,7 +187,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
List<CrossTurnDataRealtimeDTO> endcrossTurnDataRealtimeDTOS = turnDataRealtimeMap.get(endCrossId);
if (CollectionUtils.isEmpty(endcrossTurnDataRealtimeDTOS)) {
log.error("溢出路口:{},优化其下游路口:{}时,路口转向数据为空", crossId, ridInfoEntity.getEndCrossId());
throw new Exception();
throw new OptServiceException("实时监控->溢出路口方案优化异常,优化路口转向数据异常");
}
endcrossTurnDataRealtimeDTOS.forEach(item -> item.setPassTime(calPassTime(item)));
// 进行优化下发
......@@ -272,7 +273,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 记录已优化的路口
CROSS_OPT.add(crossId);
} else {
log.error("当前拥堵路口: {}, 实时监控优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId);
log.error("当前拥堵路口: {}, 实时监控->优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId);
}
}
}
......@@ -359,8 +360,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
SchemeSendVO schemeSendVO = getSchemeSendVO(optCrossId, phaseMap, Collections.EMPTY_MAP);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception();
log.error("实时监控->路口优化方案下发远程调用异常!", jsonViewObject);
throw new OptServiceException("实时监控->恢复原始方案调用UTC服务异常");
}
CROSS_OPT.remove(optCrossId);
}
......@@ -430,8 +431,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
//todo test下发成功
jsonViewObject.success();
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception();
log.error("实时监控->路口优化方案下发远程调用异常!", jsonViewObject);
throw new OptServiceException("实时监控->下发优化方案调用UTC服务异常");
}
// 将优化记录插入方案优化记录表
......@@ -490,8 +491,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, crossId, "1", "s");
CrossPhaseDTO crossPhaseDTO = phaseMap.get(key);
if (Objects.isNull(crossPhaseDTO)) {
log.error("当前路口:{}未获取到信号机相位等信息,无法进行方案下发优化", crossId);
throw new Exception();
log.error("当前路口:{}未获取到信号机方案信息,无法进行方案下发优化", crossId);
throw new OptServiceException("当前路口不能获取到运行方案相位信息!");
}
Integer schemeId = crossPhaseDTO.getSchemeId();
......@@ -716,7 +717,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
JsonViewObject jsonViewObject = utcFeignClients.runningStatusAlarm();
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("路口优化获取当前路口控制模式异常!");
throw new Exception();
throw new OptServiceException("路口优化获取当前路口控制模式异常!");
}
List<SignalStatusVO> signalStatusVOS = (List<SignalStatusVO>) jsonViewObject.getContent();
List<SignalStatusVO> resultList = signalStatusVOS.stream().filter(signalStatusVO -> Objects.equals(crossId, signalStatusVO.getCrossId())).collect(Collectors.toList());
......
package net.wanji.opt.service.signalcontrol.impl;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.exception.FeignServiceException;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.entity.develop.servicedevelop.develop.StatusCodeEnum;
import net.wanji.feign.pojo.vo.SchemeSendVO;
......@@ -44,8 +45,8 @@ public class FeignProxyServiceImpl implements FeignProxyService {
BeanUtils.copyProperties(schemeOptSendVO, schemeSendVO);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject);
return jsonViewObject.fail("手动下发优化方案,UTC服务调用异常");
log.error("诊断优化手动下发优化方案,UTC服务调用异常", jsonViewObject);
throw new FeignServiceException("诊断优化手动下发优化方案,UTC服务调用异常");
}
// 将优化记录插入方案优化记录表
......@@ -61,10 +62,10 @@ public class FeignProxyServiceImpl implements FeignProxyService {
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, Collections.EMPTY_MAP);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案恢复远程调用异常!", jsonViewObject);
return jsonViewObject.fail("手动恢复优化方案,UTC服务调用异常");
log.error("诊断优化手动恢复优化方案,UTC服务调用异常!", jsonViewObject);
throw new FeignServiceException("手动恢复优化方案,UTC服务调用异常");
}
return null;
return jsonViewObject.success("手动恢复优化方案成功");
}
/**
......
package net.wanji.common.framework.exception;
/**
* @author duanruiming
* @date 2023/03/03 14:22
*/
public class FeignServiceException extends RuntimeException {
public FeignServiceException(Exception e) {
super(e);
}
public FeignServiceException(String msg, Exception e) {
super(msg, e);
}
public FeignServiceException(String msg) {
super(msg);
}
}
package net.wanji.common.framework.exceptionhandler;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.exception.FeignServiceException;
import net.wanji.common.framework.rest.JsonViewObject;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.validation.FieldError;
......@@ -106,6 +107,20 @@ public class GlobalExceptionHandler {
return JsonViewObject.newInstance().fail("发生参数异常!原因是:" + errorMessage);
}
@ExceptionHandler(value = FeignServiceException.class)
public JsonViewObject feignServiceExceptionHandler(HttpServletRequest req, FeignServiceException e) {
Throwable cause = e.getCause();
String errorMessage;
if (cause != null) {
errorMessage = cause.getMessage();
} else {
StackTraceElement element = e.getStackTrace()[0];
errorMessage = element.getClassName() + " " + element.getLineNumber();
}
log.error("feign远程服务调用异常:", e);
return JsonViewObject.newInstance().fail("feign远程服务调用异常!位置在:" + errorMessage);
}
/**
* 处理其他异常
*/
......
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