解决死锁初版

This commit is contained in:
bo.wu@finesys.com.cn 2025-06-21 23:33:01 +08:00
parent db35603d0b
commit 892c582abe
14 changed files with 875 additions and 794 deletions

View File

@ -99,7 +99,8 @@ public class ExcelController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("查询上传记录发生异常:{}", convertJsonString(e));
e.printStackTrace();
logger.error("查询上传记录发生异常:{}", e.getMessage());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询上传记录发生异常");
return convertJsonString(response);

View File

@ -135,7 +135,8 @@ public class GoodsController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("更新物料信息发生异常:{}", convertJsonString(e));
e.printStackTrace();
logger.error("更新物料信息发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("更新物料信息发生异常");

View File

@ -114,7 +114,8 @@ public class KateWorkQueryController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("查询DBS发生异常{}", convertJsonString(e));
e.printStackTrace();
logger.error("查询DBS发生异常{}", e.getMessage());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询DBS发生异常");
return convertJsonString(response);

View File

@ -8,6 +8,8 @@ import com.wms.entity.app.monitor.WorkInfoByStand;
import com.wms.entity.table.*;
import com.wms.service.*;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
@ -31,6 +33,7 @@ import static com.wms.utils.StringUtils.convertJsonString;
@RequestMapping(value = "/monitor")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MonitorController {
private final static Logger logger = LoggerFactory.getLogger(MonitorController.class);
private final LocationService locationService;
private final WorkFlowService workFlowService;
private final WorkSummaryService workSummaryService;
@ -68,7 +71,7 @@ public class MonitorController {
response.setEmpty(0);
response.setEmptyUsed(0);
}
System.out.println("结束执行getLocationUseDetail方法:"+(System.currentTimeMillis()-l));
logger.info("结束执行getLocationUseDetail方法:{}",(System.currentTimeMillis()-l));
return convertJsonString(response);
}

View File

@ -169,6 +169,12 @@ public class TaskController {
private final WorkSummaryService workSummaryService;
private final InventoryHistoryService inventoryHistoryService;
// 定义全局锁对象 为了电子标签反馈消息互斥
private static final Object GLOBAL_LOCK = new Object();
// private static final Object GLOBAL_REC_TASK_LOCK = new Object();
// private static final Object GLOBAL_CONFIRM_FINISH_LOCK = new Object();
/**
* 接收入库任务请求
*
@ -304,7 +310,6 @@ public class TaskController {
logger.info("接收到任务反馈:{}ip地址{}", convertJsonString(wcsTaskResultRequest), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity response = new ResponseEntity();
try {
String validateInfo = validateService.validateTaskResult(wcsTaskResultRequest);
if (!Objects.equals(validateInfo, TaskResultValidationEnum.OK.getErrorMessage())) {
logger.error("任务反馈请求验证失败:{}", validateInfo);
@ -313,6 +318,8 @@ public class TaskController {
response.setMessage("任务反馈请求验证失败:" + validateInfo);
return convertJsonString(response);
}
synchronized (GLOBAL_LOCK) {
try {
// 解析任务号
List<Task> feedBackTasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskGroup, wcsTaskResultRequest.getTaskId()));
// 任务状态
@ -611,6 +618,7 @@ public class TaskController {
return convertJsonString(response);
}
}
}
/**
* Wcs请求载具入库
@ -873,6 +881,7 @@ public class TaskController {
public String boxArrive(@RequestBody WcsBoxArriveRequest boxArriveRequest) {
logger.info("接收到Wcs上报箱子到达{}ip地址{}", convertJsonString(boxArriveRequest), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
synchronized (GLOBAL_LOCK) {
try {
// 校验请求参数
String validateInfo = validateService.validateBoxArriveRequest(boxArriveRequest);
@ -931,6 +940,7 @@ public class TaskController {
return convertJsonString(response);
}
}
}
/**
* 根据站台号以及料号获取工作信息给前台界面展示
@ -1357,13 +1367,14 @@ public class TaskController {
public String getETaskFeedBack(@RequestBody WcsETaskFeedbackRequest eTaskFeedbackRequest) {
logger.info("获取电子标签反馈:{}ip地址{}", convertJsonString(eTaskFeedbackRequest), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
if (eTaskFeedbackRequest == null || StringUtils.isEmpty(eTaskFeedbackRequest.getTaskId()) || eTaskFeedbackRequest.getTaskType() == null) {
logger.error("请求参数补全,缺少任务号、任务类型。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("请求参数补全,缺少任务号、任务类型。");
return convertJsonString(response);
}
synchronized (GLOBAL_LOCK) {
try {
if (eTaskFeedbackRequest.getTaskType() == 1) {// 拣选任务
// 查询到对应的库位如果不是亮灯状态不接受反馈
if (!etagLocationService.exists(new LambdaQueryWrapper<ETagLocation>()
@ -1482,8 +1493,8 @@ public class TaskController {
response.setCode(ResponseCode.OK.getCode());
response.setMessage("处理反馈成功");
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("处理反馈异常:{}", convertJsonString(e));
response.setCode(ResponseCode.ERROR.getCode());
@ -1492,6 +1503,8 @@ public class TaskController {
}
}
}
/**
* 确认完成---wms界面触发
*
@ -1505,6 +1518,7 @@ public class TaskController {
public String confirmFinishWork(@RequestBody WorkConfirmRequest workConfirmRequest) {
logger.info("接收到确认当前拣货完成wms界面触发请求{}ip地址{}", convertJsonString(workConfirmRequest), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
synchronized (GLOBAL_LOCK) {
try {
// 获取站台号
String standId = "";
@ -1735,6 +1749,7 @@ public class TaskController {
return convertJsonString(response);
}
}
}
/**
* Wcs请求释放箱子---站台实体按钮触发
@ -2191,6 +2206,7 @@ public class TaskController {
public String requestBack(@RequestBody RequestBackQuery requestBackQuery) {
logger.info("Wcs请求箱子是否回库{}ip地址{}", convertJsonString(requestBackQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
synchronized (GLOBAL_LOCK) {
try {
// 验证数量
if (StringUtils.isEmpty(requestBackQuery.getVehicleId())) {
@ -2280,6 +2296,7 @@ public class TaskController {
return convertJsonString(response);
}
}
}
/**
* 请求打印标签的数据

View File

@ -125,7 +125,8 @@ public class UserController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.info("数据库错误:{}", convertJsonString(e));
e.printStackTrace();
logger.error("数据库错误:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("登录异常");
@ -175,7 +176,8 @@ public class UserController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.info("数据库错误:{}", convertJsonString(e));
e.printStackTrace();
logger.error("数据库错误:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("登录异常");
@ -357,7 +359,8 @@ public class UserController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.info("查询用户列表失败:{}", convertJsonString(e));
e.printStackTrace();
logger.error("查询用户列表失败:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("查询用户列表失败。");

View File

@ -70,7 +70,8 @@ public class WmsLogController {
response.setReturnData(pageDto);
return convertJsonString(response);
} catch (Exception e) {
logger.error("查询日志信息发生异常:{}", convertJsonString(e));
e.printStackTrace();
logger.error("查询日志信息发生异常:{}", e.getMessage());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询日志信息发生异常");
return convertJsonString(response);

View File

@ -339,8 +339,8 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
}
if (outsideVehicle.getRemainNum().compareTo(needNum) > 0) {
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;
outsideVehicle.setRemainNum(outsideVehicle.getRemainNum().subtract(needNum));
needNum = BigDecimal.ZERO;
usedOutsideVehiclesList.add(outsideVehicle);
break;
} else {
@ -348,6 +348,9 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
needNum = needNum.subtract(outsideVehicle.getRemainNum());
outsideVehicle.setRemainNum(BigDecimal.ZERO);
usedOutsideVehiclesList.add(outsideVehicle);
if(needNum.compareTo(BigDecimal.ZERO) == 0){
break;
}
}
}
}
@ -429,13 +432,16 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
// 设备应该处于不可用状态就不生成任务了
continue;
}
if (tempStock.getGoodsRelated().getRemainNum().compareTo(needNum) > 0) {
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;
if (tempStock.getGoodsRelated().getRemainNum().compareTo(needNum) >= 0) {
// 设置剩余数量
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(goodsRelated.getRemainNum().subtract(needNum));
tempStock.setGoodsRelated(goodsRelated);
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;
} else {
// 当前箱子物料剩余数量少于需求数量
needNum = needNum.subtract(tempStock.getGoodsRelated().getRemainNum());
@ -447,8 +453,11 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
waitForOutStockList.add(tempStock);
// 将堆垛机任务数量更新
runningTaskNumToEquipmentMap.put(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
if(needNum.compareTo(BigDecimal.ZERO) == 0){
break;
}
// break;
}
if (!waitForOutStockList.isEmpty()) {
// 创建任务
createVehicleOutTaskAndPickTask(waitForOutStockList, workStation);

View File

@ -15,8 +15,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@ -28,7 +26,6 @@ import java.util.stream.Collectors;
import static com.wms.config.InitLocalConfig.*;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
import static com.wms.utils.WmsUtils.generateId;
/**
@ -84,7 +81,7 @@ public class WorkServiceImplements implements IWorkService {
* @param workStation 工作站台
*/
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@Transactional(rollbackFor = Exception.class)
public void doWork(String workStation) {
try {
// 查找当前站台未开始的工作流
@ -233,7 +230,7 @@ public class WorkServiceImplements implements IWorkService {
goodsToStation.setDistributeStatus(2);
}
}
// 更新已分配数量
// 更新已分配数量 todo
goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum));
}
goodsToStationService.updateBatchById(notFinishedGoodsList);
@ -254,7 +251,8 @@ public class WorkServiceImplements implements IWorkService {
.in(KateOrders::getSupplyArea, smallBoxes)
.eq(KateOrders::getOrderStatus, 1));
} catch (Exception e) {
logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e));
e.printStackTrace();
logger.error("执行站台:{}工作发生异常:{}", workStation, e.getMessage());
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
@ -350,7 +348,10 @@ public class WorkServiceImplements implements IWorkService {
.eq(KateDBS::getWorkOrder, workFlow.getOrderId()));
}
}
workSummaryService.saveBatch(workSummaryList);
//解决workSummary的主键冲突问题 去掉workSummaryListlist中对象WorkFlowId重复的对象
workSummaryList = workSummaryList.stream().collect(Collectors.toMap(WorkSummary::getWorkFlowId, a -> a, (k1, k2) -> k1)).values().stream().collect(Collectors.toList());
workSummaryService.saveOrUpdateBatch(workSummaryList);
// 移除工作流
workFlowService.remove(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation));
@ -358,7 +359,7 @@ public class WorkServiceImplements implements IWorkService {
goodsToStationService.remove(new LambdaQueryWrapper<GoodsToStation>()
.eq(GoodsToStation::getWorkStation, workStation));
} catch (Exception e) {
logger.error("完成站台:{}工作发生异常:{}", workStation, convertJsonString(e));
logger.error("完成站台:{},工作发生异常:{}", workStation, e.getMessage());
result = "完成站台:" + workStation + "工作发生异常!";
}
return result;
@ -444,7 +445,7 @@ public class WorkServiceImplements implements IWorkService {
}
tasksOfTodayMap.put(workConfig.getSmallBox(), toDaysOrders);
}
// 判断是否有今天开工的工单和小工位
// 生成今天开工的工单和小工位
if (!tasksOfTodayMap.isEmpty()) {
for (String smallBoxKey : tasksOfTodayMap.keySet()) {
List<WorkCenterAndOrderDto> currentWorkCenterAndOrderDtoList = tasksOfTodayMap.get(smallBoxKey).stream().sorted(Comparator.comparingInt(WorkCenterAndOrderDto::getDbsSequence)).toList();
@ -653,10 +654,10 @@ public class WorkServiceImplements implements IWorkService {
.in(KateDBS::getWorkOrder, workOrderList)
.eq(KateDBS::getDbsStatus, 0));
}
System.out.println("createTempWorkFlows 成功");
logger.info("createTempWorkFlows 成功");
}
} else {
System.out.println("createTempWorkFlows 为空");
logger.info("createTempWorkFlows 为空");
}
}
@ -768,14 +769,9 @@ public class WorkServiceImplements implements IWorkService {
Map<String, String> smallBoxToBigBoxConfigMap = workStationConfigs.stream().collect(Collectors.toMap(WorkStationConfig::getSmallBox, WorkStationConfig::getBigBox));
for (WorkFlow workFlow : needDistributeWorks) {
if (smallBoxToBigBoxConfigMap.containsKey(workFlow.getWorkCenter())) {
if (workFlowsByBigBoxMap.containsKey(smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter()))) {
String bigBox = smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter());
List<WorkFlow> thisBoxWorkFlows = new ArrayList<>(workFlowsByBigBoxMap.get(bigBox));
thisBoxWorkFlows.add(workFlow);
workFlowsByBigBoxMap.replace(bigBox, thisBoxWorkFlows);
} else {
workFlowsByBigBoxMap.put(smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter()), List.of(workFlow));
}
String bigbox = smallBoxToBigBoxConfigMap.get(workFlow.getWorkCenter());
workFlowsByBigBoxMap.computeIfAbsent(bigbox, k -> new ArrayList<>())
.add(workFlow);
}
}
// 生成每个大盒子的物料种类map
@ -832,13 +828,15 @@ public class WorkServiceImplements implements IWorkService {
Map<String, List<WorkFlow>> notDistributeYetWorksByBoxMap = new HashMap<>();
for (WorkFlow workFlow : thisBoxWorkFlows) {
String boxNo = workFlow.getWorkOrder() + "@" + workFlow.getWorkCenter();
if (notDistributeYetWorksByBoxMap.containsKey(boxNo)) {
List<WorkFlow> thisBoxNotDistributeYetWorks = new ArrayList<>(notDistributeYetWorksByBoxMap.get(boxNo));
thisBoxNotDistributeYetWorks.add(workFlow);
notDistributeYetWorksByBoxMap.replace(boxNo, thisBoxNotDistributeYetWorks);
} else {
notDistributeYetWorksByBoxMap.put(boxNo, List.of(workFlow));
}
notDistributeYetWorksByBoxMap.computeIfAbsent(boxNo, k -> new ArrayList<>())
.add(workFlow);
// if (notDistributeYetWorksByBoxMap.containsKey(boxNo)) {
// List<WorkFlow> thisBoxNotDistributeYetWorks = new ArrayList<>(notDistributeYetWorksByBoxMap.get(boxNo));
// thisBoxNotDistributeYetWorks.add(workFlow);
// notDistributeYetWorksByBoxMap.replace(boxNo, thisBoxNotDistributeYetWorks);
// } else {
// notDistributeYetWorksByBoxMap.put(boxNo, List.of(workFlow));
// }
}
if (notDistributeYetWorksByBoxMap.isEmpty()) {
// 当前大盒子全部分配完毕
@ -865,9 +863,15 @@ public class WorkServiceImplements implements IWorkService {
continue;
}
// 排序后的key
// List<String> sortedKeyString = notDistributeYetWorksByBoxMap.keySet().stream()
// .sorted(Comparator.comparing(o -> workOrderToSequenceMap.get(o.split("@")[0])))
// .sorted(Comparator.comparing(o -> o.split("@")[1]))
// .toList();
List<String> sortedKeyString = notDistributeYetWorksByBoxMap.keySet().stream()
.sorted(Comparator.comparing(o -> workOrderToSequenceMap.get(o.split("@")[0])))
.sorted(Comparator.comparing(o -> o.split("@")[1]))
.sorted(
Comparator.comparing((String o) -> workOrderToSequenceMap.get(o.split("@")[0]))
.thenComparing(o -> o.split("@")[1])
)
.toList();
// 本次生成的电子标签配置
List<ELocationConfig> thisStandELocationConfigs = stationToELocationConfigsMap.getOrDefault(targetStandId, new ArrayList<>());
@ -953,7 +957,8 @@ public class WorkServiceImplements implements IWorkService {
}
logger.info("分配工作完成");
} catch (Exception e) {
logger.error("分配工作发生异常:{}", convertJsonString(e));
e.printStackTrace();
logger.error("分配工作发生异常:{}", e.getMessage());
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}

View File

@ -101,19 +101,49 @@ public class LocationServiceImplements extends ServiceImpl<LocationMapper, Locat
}
// 查找库位
while (!runningTaskNumToEquipmentMap.isEmpty()) {
Integer mostEmptyStackerId = runningTaskNumToEquipmentMap.entrySet().stream()
// Integer mostEmptyStackerId = runningTaskNumToEquipmentMap.entrySet().stream()
// .min(Comparator.comparingInt(Map.Entry::getValue))
// .map(Map.Entry::getKey)
// .orElse(null);
// if (mostEmptyStackerId == null) {
// // 跳出循环
// break;
// }
// getOneLocationByEquipmentId(resultMap, mostEmptyStackerId, vehicleId);
// if (!resultMap.isEmpty()) {
// break;
// }
// runningTaskNumToEquipmentMap.remove(mostEmptyStackerId);
//为了实现堆垛机满载运行回库更改堆垛机任务等于1时的逻辑
// 第一步尝试给已有一个任务的堆垛机再分配一个任务
Optional<Integer> stackerWithOneTask = runningTaskNumToEquipmentMap.entrySet().stream()
.filter(entry -> entry.getValue() == 1)
.map(Map.Entry::getKey)
.findFirst();
Integer selectedStackerId;
if (stackerWithOneTask.isPresent()) {
selectedStackerId = stackerWithOneTask.get();
} else {
// 第二步找当前任务最少的堆垛机
selectedStackerId = runningTaskNumToEquipmentMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse(null);
if (mostEmptyStackerId == null) {
// 跳出循环
}
if (selectedStackerId == null) {
break;
}
getOneLocationByEquipmentId(resultMap, mostEmptyStackerId, vehicleId);
getOneLocationByEquipmentId(resultMap, selectedStackerId, vehicleId);
if (!resultMap.isEmpty()) {
break;
}
runningTaskNumToEquipmentMap.remove(mostEmptyStackerId);
// 分配失败就移除该堆垛机避免死循环
runningTaskNumToEquipmentMap.remove(selectedStackerId);
}
// 选择最近未使用的设备

View File

@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.wms.entity.app.dto.extend.KanbanEntity;
import com.wms.utils.StringUtils;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.util.ArrayList;
@ -14,6 +16,7 @@ import java.util.List;
*/
@Data
public class KanbanExcelVo {
private final static Logger log = LoggerFactory.getLogger(KanbanExcelVo.class);
@ExcelProperty("KANBAN#1")
private String KANBAN1;
@ExcelProperty("KANBAN#2")
@ -137,7 +140,7 @@ public class KanbanExcelVo {
}
} catch (IllegalAccessException e) {
// 捕捉异常
System.out.println("设置看板发生异常:" + e.getMessage());
log.info("设置看板发生异常:{}" , e.getMessage());
}
}
}
@ -160,7 +163,7 @@ public class KanbanExcelVo {
}
} catch (IllegalAccessException e) {
// 捕捉异常
System.out.println("转化看板数据配置时发生异常:" + e.getMessage());
log.info("转化看板数据配置时发生异常:{}" ,e.getMessage());
}
}
}

View File

@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.wms.entity.app.dto.extend.KanbanEntity;
import com.wms.utils.StringUtils;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.math.BigDecimal;
@ -15,6 +17,7 @@ import java.util.List;
*/
@Data
public class KanbanGoodsExcelVo {
private final static Logger logger = LoggerFactory.getLogger(KanbanGoodsExcelVo.class);
/**
* 料号
*/
@ -318,7 +321,7 @@ public class KanbanGoodsExcelVo {
}
} catch (IllegalAccessException e) {
// 捕捉异常
System.out.println("设置看板发生异常:" + e.getMessage());
logger.info("设置看板发生异常:{}" ,e.getMessage());
}
}
}
@ -341,7 +344,7 @@ public class KanbanGoodsExcelVo {
}
} catch (IllegalAccessException e) {
// 捕捉异常
System.out.println("转化看板数据配置时发生异常:" + e.getMessage());
logger.info("转化看板数据配置时发生异常:{}" , e.getMessage());
}
}
}

View File

@ -6,7 +6,7 @@ import org.springframework.stereotype.Component;
/**
* ws服务
*/
@ServerEndpoint(value = "/websocket/{userName}")
@Component
//@ServerEndpoint(value = "/websocket/{userName}")
//@Component
public class WebSocketService {
}

View File

@ -20,7 +20,8 @@
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
@ -38,7 +39,8 @@
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARNING</level>
@ -56,7 +58,8 @@
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
@ -74,7 +77,8 @@
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>