Quellcode durchsuchen

fix CannotAcquireLockException

18339543638 vor 3 Jahren
Ursprung
Commit
6dca2c4dee
1 geänderte Dateien mit 23 neuen und 9 gelöschten Zeilen
  1. 23 9
      nb-im/src/main/java/com/nb/im/listener/MonitorStatusListener.java

+ 23 - 9
nb-im/src/main/java/com/nb/im/listener/MonitorStatusListener.java

@@ -1,6 +1,8 @@
 package com.nb.im.listener;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.enums.ImStatusEnum;
@@ -13,12 +15,15 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
 import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author lifang
@@ -51,6 +56,7 @@ public class MonitorStatusListener {
 
     @EventListener
     @Async
+    @Transactional(propagation= Propagation.SUPPORTS)
     public void monitorReset(ClinicRestartEvent event){
         synchronized (event.getPatientId()){
             log.info("临床重启事件监听,{}", JSONUtil.toJsonStr(event));
@@ -58,15 +64,23 @@ public class MonitorStatusListener {
             //两小时前的时间
             LocalDateTime dateTime = LocalDateTime.now().plus(-2, ChronoUnit.HOURS);
             Date date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
-            //临床结束未满两小时的进行处理
-            roomService.update(new UpdateWrapper<ImRoomEntity>()
-                    .lambda()
-                    .eq(ImRoomEntity::getPatientId,patientId)
-                    .in(ImRoomEntity::getStatus, ImStatusEnum.WAITING,ImStatusEnum.SUCCESS)
-                    .eq(ImRoomEntity::getMonitorFinished,true)
-                    .gt(ImRoomEntity::getMonitorFinishedTime,date)
-                    .set(ImRoomEntity::getMonitorFinished,false)
-            );
+            List<ImRoomEntity> rooms = roomService.list(new LambdaQueryWrapper<ImRoomEntity>()
+                    .eq(ImRoomEntity::getPatientId, patientId)
+                    .in(ImRoomEntity::getStatus, ImStatusEnum.WAITING, ImStatusEnum.SUCCESS)
+                    .eq(ImRoomEntity::getMonitorFinished, true)
+                    .gt(ImRoomEntity::getMonitorFinishedTime, date));
+            if(CollectionUtil.isNotEmpty(rooms)){
+                //临床结束未满两小时的进行处理
+                roomService.updateBatchById( rooms
+                                                .stream()
+                                                .map(room->{
+                                                    ImRoomEntity roomEntity = new ImRoomEntity();
+                                                    roomEntity.setId(room.getId());
+                                                    roomEntity.setMonitorFinished(false);
+                                                    return roomEntity;
+                                                })
+                                                .collect(Collectors.toList()));
+            }
         }
     }
 }