Переглянути джерело

修改 创建工单并发的 bug

suntianwu 3 роки тому
батько
коміт
b5eec268f1

+ 59 - 42
src/main/java/com/care/mqtt/service/MqttMsgRedisService.java

@@ -4,6 +4,7 @@ package com.care.mqtt.service;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.care.bigscreen.service.BigScreenService;
+import com.care.common.cache.RedisKeyConstant;
 import com.care.common.cache.RedisUtil;
 import com.care.common.constant.Constants;
 import com.care.common.entity.CareDevice;
@@ -21,6 +22,7 @@ import javax.annotation.Resource;
 import java.util.Date;
 import java.util.List;
 import java.util.Set;
+import java.util.UUID;
 
 
 /**
@@ -114,52 +116,67 @@ public class MqttMsgRedisService {
      */
 
     private void exe(CareMqttMsg careMqttMsg){
+        String key = RedisKeyConstant.CREATE_ORDER + ":" + careMqttMsg.getDevId();
+        String requestId = UUID.randomUUID().toString();
+        boolean result = redisUtil.tryLock(key,requestId,10);
+        try {
+            if (result) {
+                String status = careMqttMsg.getStatus();
+                if(!MqttMsgStatusEnum.NO_HANDLE.getValue().equals(status)){ //不是未处理,不执行。
+                    return;
+                }
 
-        String status = careMqttMsg.getStatus();
-        if(!MqttMsgStatusEnum.NO_HANDLE.getValue().equals(status)){ //不是未处理,不执行。
-            return;
-        }
+                CareDevice careDevice = careDeviceService.getById(careMqttMsg.getDevId());
+                CareEventOrder order = mqttMsgService.getNewOrder(careDevice);
+                if(order == null){
+                    careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
+                    careMqttMsg.setModifyTime(new Date());
+                    this.careMqttMsgService.updateById(careMqttMsg);
+                    return;
+                }
+                order.setCreateTime(careMqttMsg.getCreateTime());
+                order.setModifyTime(careMqttMsg.getCreateTime());
+                order.setStatus(OrderStatusEnum.TODO.getValue());
+                if ("FallDown".equals(careMqttMsg.getType())) { //跌到
+                    order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
+                } else if("StayTooLong".equals(careMqttMsg.getType())){ //久滞
+                    order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
+                }
 
-        CareDevice careDevice = careDeviceService.getById(careMqttMsg.getDevId());
-        CareEventOrder order = mqttMsgService.getNewOrder(careDevice);
-        if(order == null){
-            careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
-            careMqttMsg.setModifyTime(new Date());
-            this.careMqttMsgService.updateById(careMqttMsg);
-            return;
-        }
-        order.setCreateTime(careMqttMsg.getCreateTime());
-        order.setModifyTime(careMqttMsg.getCreateTime());
-        order.setStatus(OrderStatusEnum.TODO.getValue());
-        if ("FallDown".equals(careMqttMsg.getType())) { //跌到
-            order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
-        } else if("StayTooLong".equals(careMqttMsg.getType())){ //久滞
-            order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
-        }
+                //判断房屋是否有未完成的告警事件,不区分类型
+                QueryWrapper<CareEventOrder> queryWrapper2 = new QueryWrapper<>();
+                queryWrapper2.lambda().eq(CareEventOrder::getDevId,careDevice.getId()).and(
+                        wrapper-> wrapper.eq(CareEventOrder::getStatus, OrderStatusEnum.TODO.getValue())
+                                .or().eq(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue()));
+
+                CareEventOrder orderDb = careEventOrderService.getOne(queryWrapper2);
+                if(orderDb != null) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
+                    careEventOrderService.saveHisOrder(order,orderDb);
+                    //通知页面
+                    this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderUpdate");
+                    this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
+                }  else { //无未完成的告警事件
+                    //生成新的工单
+                    this.careEventOrderService.saveOrder(order);
+                    //通知页面
+                    this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
+                    this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
+                }
 
-        //判断房屋是否有未完成的告警事件,不区分类型
-        QueryWrapper<CareEventOrder> queryWrapper2 = new QueryWrapper<>();
-        queryWrapper2.lambda().eq(CareEventOrder::getDevId,careDevice.getId()).and(
-                wrapper-> wrapper.eq(CareEventOrder::getStatus, OrderStatusEnum.TODO.getValue())
-                        .or().eq(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue()));
-
-        CareEventOrder orderDb = careEventOrderService.getOne(queryWrapper2);
-        if(orderDb != null) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
-            careEventOrderService.saveHisOrder(order,orderDb);
-            //通知页面
-            this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderUpdate");
-            this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
-        }  else { //无未完成的告警事件
-            //生成新的工单
-            this.careEventOrderService.saveOrder(order);
-            //通知页面
-            this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
-            this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
+                careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
+                careMqttMsg.setModifyTime(new Date());
+                this.careMqttMsgService.updateById(careMqttMsg);
+            } else {
+                try {
+                    Thread.sleep(3000);
+                    exe(careMqttMsg);
+                } catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        } finally {
+            redisUtil.releaseLock(key,requestId);
         }
-
-        careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
-        careMqttMsg.setModifyTime(new Date());
-        this.careMqttMsgService.updateById(careMqttMsg);
     }
 
 }

+ 1 - 1
src/main/java/com/care/mqtt/service/MqttMsgService.java

@@ -129,7 +129,7 @@ public class MqttMsgService {
                 return;
             }
 
-            new Thread(() -> handleOrderEvent(map,type,careDevice,date,careMqttMsg)).start();
+            handleOrderEvent(map,type,careDevice,date,careMqttMsg);
 
         } catch (Exception e){
             e.printStackTrace();