瀏覽代碼

修改 创建工单并发的 bug

suntianwu 3 年之前
父節點
當前提交
9563c953c4

+ 3 - 0
src/main/java/com/care/common/cache/RedisKeyConstant.java

@@ -34,6 +34,9 @@ public class RedisKeyConstant {
     //工单处理,同一工单仅1个人处理
     public static final String DO_ORDER = "SEAT_DO_ORDER:LOCK";
 
+    //生成工单,同一设备同时只能生成一个工单
+    public static final String CREATE_ORDER = "CREATE_ORDER:LOCK";
+
     //设备监测信息
     public static final String DEVICE_MONITOR = "DEVICE:MONITOR";
     public static final int DEVICE_MONITOR_TIME = 60;

+ 22 - 0
src/main/java/com/care/common/cache/RedisUtil.java

@@ -571,6 +571,28 @@ public class RedisUtil {
         }
     }
 
+    /**
+     * 加锁
+     * @param key
+     * @param time
+     * @return
+     */
+    public Boolean tryLock(String key,String requestId,long time) {
+        return redisTemplate.opsForValue().setIfAbsent(key,requestId,time,TimeUnit.SECONDS);
+    }
+
+    /**
+     * 释放锁
+     * @param key
+     * @return
+     */
+    public void releaseLock(String key,String requestId) {
+        String currentValue = (String)redisTemplate.opsForValue().get(key);
+        if (currentValue != null && requestId.equals(currentValue)) {
+            redisTemplate.delete(key);
+        }
+    }
+
     public boolean zSetAdd(String key, Object value, long score) {
         try {
             boolean re =  redisTemplate.opsForZSet().add(key, value, score);

+ 1 - 1
src/main/java/com/care/common/service/CareEventOrderService.java

@@ -21,5 +21,5 @@ public interface CareEventOrderService extends IService<CareEventOrder> {
 
     boolean saveHisOrder(CareEventOrder order,CareEventOrder orderDb);
 
-    boolean saveOrder(CareEventOrder order);
+    void saveOrder(CareEventOrder order);
 }

+ 84 - 67
src/main/java/com/care/common/service/impl/CareEventOrderServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.UUID;
 
 /**
  * 事件定单表(CareEventOrder)表服务实现类
@@ -111,79 +112,95 @@ public class CareEventOrderServiceImpl extends ServiceImpl<CareEventOrderMapper,
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveOrder(CareEventOrder order){
-        this.baseMapper.insert(order);
-        CareEventOrderHandleHis his = new CareEventOrderHandleHis();
-        his.setOrgId(order.getOrgId());
-        his.setStationId(order.getStationId());
-        his.setOrderId(order.getId());
-        his.setHouseId(order.getHouseId());
-        his.setOrderType(order.getOrderType());
-        if (OrderTypeEnum.ZHU_DONG_HU_JIAO.getValue().equals(order.getOrderType()) || OrderTypeEnum.HU_WAI_HU_JIAO.getValue().equals(order.getOrderType())){
-            his.setLogType(LogTypeEnum.OLDER_EVENT.getValue());
-            his.setLogObjectId(order.getOlderId());
-            his.setLogObjectName(order.getOlderName());
-            his.setLogResult(OrderTypeEnum.getCodeToName(order.getOrderType()));
-            his.setRelationTypeDesc(RelationTypeEnum.OLDER.getName());
-        }else{
-            his.setLogType(LogTypeEnum.DEV_EVENT.getValue());
-            his.setLogObjectId(order.getDevId());
-            his.setLogObjectName(order.getDevName());
-            his.setLogResult("发生"+OrderTypeEnum.getCodeToName(order.getOrderType()));
-            his.setRelationTypeDesc(RelationTypeEnum.HOUSE.getName());
-        }
-        his.setCreateTime(order.getCreateTime());
+    public void saveOrder(CareEventOrder order){
+        String key = RedisKeyConstant.CREATE_ORDER + ":" + order.getDevId();
+        String requestId = UUID.randomUUID().toString();
+        boolean result = redisUtil.tryLock(key,requestId,10);
+        try {
+            if (result) {
+                this.baseMapper.insert(order);
+                CareEventOrderHandleHis his = new CareEventOrderHandleHis();
+                his.setOrgId(order.getOrgId());
+                his.setStationId(order.getStationId());
+                his.setOrderId(order.getId());
+                his.setHouseId(order.getHouseId());
+                his.setOrderType(order.getOrderType());
+                if (OrderTypeEnum.ZHU_DONG_HU_JIAO.getValue().equals(order.getOrderType()) || OrderTypeEnum.HU_WAI_HU_JIAO.getValue().equals(order.getOrderType())) {
+                    his.setLogType(LogTypeEnum.OLDER_EVENT.getValue());
+                    his.setLogObjectId(order.getOlderId());
+                    his.setLogObjectName(order.getOlderName());
+                    his.setLogResult(OrderTypeEnum.getCodeToName(order.getOrderType()));
+                    his.setRelationTypeDesc(RelationTypeEnum.OLDER.getName());
+                } else {
+                    his.setLogType(LogTypeEnum.DEV_EVENT.getValue());
+                    his.setLogObjectId(order.getDevId());
+                    his.setLogObjectName(order.getDevName());
+                    his.setLogResult("发生" + OrderTypeEnum.getCodeToName(order.getOrderType()));
+                    his.setRelationTypeDesc(RelationTypeEnum.HOUSE.getName());
+                }
+                his.setCreateTime(order.getCreateTime());
 
-        addOlderToOrderOlder(order);
-        List<CareEventOrderChamb> chambList =  addChamberlainToOrder(order);
-        List<CareEventOrderContactStatus> contacts = addContactToOrderContact(order);
-        Object switchSms = redisUtil.get(RedisKeyConstant.SWITCH_SMS);
-        if (switchSms != null){
-            //给联系人发送短信
-            CareHouse house = this.careHouseService.getById(order.getHouseId());
-            if (CollUtil.isNotEmpty(contacts)){
+                addOlderToOrderOlder(order);
+                List<CareEventOrderChamb> chambList = addChamberlainToOrder(order);
+                List<CareEventOrderContactStatus> contacts = addContactToOrderContact(order);
+                Object switchSms = redisUtil.get(RedisKeyConstant.SWITCH_SMS);
+                if (switchSms != null) {
+                    //给联系人发送短信
+                    CareHouse house = this.careHouseService.getById(order.getHouseId());
+                    if (CollUtil.isNotEmpty(contacts)) {
 
-                contacts.forEach(item ->{
-                    boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(),item.getContactPhone(),house.getName());
-                    if (smsResult){
-                        CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
-                        his2.setOrgId(item.getOrgId());
-                        his2.setStationId(item.getStationId());
-                        his2.setOrderId(item.getOrderId());
-                        his2.setLogType(LogTypeEnum.SMS.getValue());
-                        his2.setLogObjectId(item.getContactId());
-                        his2.setLogObjectName(item.getContactName());
-                        his2.setLogResult("短信通知");
-                        his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
-                        his2.setCreateTime(DateUtil.date());
-                        his2.setRelationTypeDesc(item.getRelationTypeDesc());
-                        this.careEventOrderHandleHisService.save(his2);
+                        contacts.forEach(item -> {
+                            boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(), item.getContactPhone(), house.getName());
+                            if (smsResult) {
+                                CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
+                                his2.setOrgId(item.getOrgId());
+                                his2.setStationId(item.getStationId());
+                                his2.setOrderId(item.getOrderId());
+                                his2.setLogType(LogTypeEnum.SMS.getValue());
+                                his2.setLogObjectId(item.getContactId());
+                                his2.setLogObjectName(item.getContactName());
+                                his2.setLogResult("短信通知");
+                                his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
+                                his2.setCreateTime(DateUtil.date());
+                                his2.setRelationTypeDesc(item.getRelationTypeDesc());
+                                this.careEventOrderHandleHisService.save(his2);
+                            }
+                        });
                     }
-                });
-            }
-            //给管家发短信
-            if (CollUtil.isNotEmpty(chambList)){
-                chambList.forEach(item ->{
-                    boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(),item.getPhone(),house.getName());
-                    if (smsResult){
-                        CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
-                        his2.setOrgId(item.getOrgId());
-                        his2.setStationId(item.getStationId());
-                        his2.setOrderId(item.getOrderId());
-                        his2.setLogType(LogTypeEnum.SMS.getValue());
-                        his2.setLogObjectId(item.getChambId());
-                        his2.setLogObjectName(item.getChambName());
-                        his2.setLogResult("短信通知");
-                        his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
-                        his2.setCreateTime(DateUtil.date());
-                        his2.setRelationTypeDesc("管家");
-                        this.careEventOrderHandleHisService.save(his2);
+                    //给管家发短信
+                    if (CollUtil.isNotEmpty(chambList)) {
+                        chambList.forEach(item -> {
+                            boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(), item.getPhone(), house.getName());
+                            if (smsResult) {
+                                CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
+                                his2.setOrgId(item.getOrgId());
+                                his2.setStationId(item.getStationId());
+                                his2.setOrderId(item.getOrderId());
+                                his2.setLogType(LogTypeEnum.SMS.getValue());
+                                his2.setLogObjectId(item.getChambId());
+                                his2.setLogObjectName(item.getChambName());
+                                his2.setLogResult("短信通知");
+                                his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
+                                his2.setCreateTime(DateUtil.date());
+                                his2.setRelationTypeDesc("管家");
+                                this.careEventOrderHandleHisService.save(his2);
+                            }
+                        });
                     }
-                });
+                }
+                this.careEventOrderHandleHisService.save(his);
+            } else {
+                try {
+                    Thread.sleep(10000);
+                    saveOrder(order);
+                } catch (Exception e){
+                    e.printStackTrace();
+                }
+
             }
+        } finally {
+            redisUtil.releaseLock(key,requestId);
         }
-        this.careEventOrderHandleHisService.save(his);
-        return true;
     }
 
 

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

@@ -151,7 +151,7 @@ public class MqttMsgRedisService {
             this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
         }  else { //无未完成的告警事件
             //生成新的工单
-            careEventOrderService.saveOrder(order);
+            new Thread(() -> this.careEventOrderService.saveOrder(order)).start();
             //通知页面
             this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
             this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");

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

@@ -201,7 +201,8 @@ public class MqttMsgService {
                         this.careMqttMsgService.save(careMqttMsg);
 
                         //生成新的工单
-                        careEventOrderService.saveOrder(order);
+                        new Thread(() -> this.careEventOrderService.saveOrder(order)).start();
+
                         //通知页面
                         this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
                         this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");

+ 8 - 12
src/main/java/com/care/mqtt/tool/MqttDataConnector.java

@@ -210,19 +210,15 @@ public class MqttDataConnector {
             xbMqttDataConnector.createIotDataSource(configParams);
             MqttMessageListener mqttMessageListener=new MqttMessageListener();
             xbMqttDataConnector.setReSubscribe("5JPD/monitor/a1/event", mqttMessageListener);
-
+            mqttMessageListener=new MqttMessageListener();
+            xbMqttDataConnector.setReSubscribe("5JPD/monitor/a2/event", mqttMessageListener);
+            int cnt = 0;
+            int cnt2 = 100;
             while (true){
-                xbMqttDataConnector.publish("5JPD/monitor/a1/event","{\n" +
-                        " \"type\": \"FallDown\",\n" +
-                        " \"msg\": {\n" +
-                        "  \"ts\": 1,\n" +
-                        "  \"tid\": 2,\n" +
-                        "  \"conf\": 3,\n" +
-                        "  \"x\": 1.2,\n" +
-                        "  \"y\": 0.3,\n" +
-                        "  \"z\": 3.4\n" +
-                        " }\n" +
-                        "}");
+                cnt++;
+                cnt2++;
+                xbMqttDataConnector.publish("5JPD/monitor/a1/event",""+cnt);
+                xbMqttDataConnector.publish("5JPD/monitor/a2/event",""+cnt2);
                 Thread.sleep(5000);
                 xbMqttDataConnector.destroy();
             }