|  | @@ -225,11 +225,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      public void update(ImLiveBroadcastRoomDto dto) {
 | 
	
		
			
				|  |  | +        Date now = new Date();
 | 
	
		
			
				|  |  | +        if (now.getTime() > dto.getLiveStartTime().getTime()) {
 | 
	
		
			
				|  |  | +            throw new BizException("设置的直播开始时间不能小于当前时间");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          ImLiveBroadcastRoom obj = this.getById(dto.getId());
 | 
	
		
			
				|  |  |          BeanUtils.copyProperties(dto, obj);
 | 
	
		
			
				|  |  |          obj.setRoomConfig(JSONObject.toJSONString(dto.getRoomConfig()));
 | 
	
		
			
				|  |  |          obj.setUpdatedBy(getSysUser().getId());
 | 
	
		
			
				|  |  | -        obj.setUpdatedTime(new Date());
 | 
	
		
			
				|  |  | +        obj.setUpdatedTime(now);
 | 
	
		
			
				|  |  |          log.info("update room  >>>  :{}", JSONObject.toJSONString(obj));
 | 
	
		
			
				|  |  |          this.updateById(obj);
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -326,6 +330,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |          Map<String, Object> param = new HashMap<>();
 | 
	
		
			
				|  |  |          param.put("tenantId", TenantContextHolder.getTenantId());
 | 
	
		
			
				|  |  |          param.put("popularize", 1);
 | 
	
		
			
				|  |  | +        param.put("liveState", 1);
 | 
	
		
			
				|  |  |          List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(param);
 | 
	
		
			
				|  |  |          if (CollectionUtils.isNotEmpty(list)) {
 | 
	
		
			
				|  |  |              return list.get(0);
 | 
	
	
		
			
				|  | @@ -338,11 +343,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |       * 销毁主讲人退出超过30分钟的直播间
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void destroyExpiredLiveRoom() {
 | 
	
		
			
				|  |  | -        //查询已经开始并且没有删除及销毁的直播间
 | 
	
		
			
				|  |  | -        List<ImLiveBroadcastRoom> list = this.list(new WrapperUtil<ImLiveBroadcastRoom>()
 | 
	
		
			
				|  |  | -                .hasEq("live_state_", 1)
 | 
	
		
			
				|  |  | -                .hasEq("room_state_", 0)
 | 
	
		
			
				|  |  | -                .queryWrapper());
 | 
	
		
			
				|  |  | +        //查询状态是 未开始和已开始 的直播间
 | 
	
		
			
				|  |  | +        List<ImLiveBroadcastRoom> list = this.list(Wrappers.<ImLiveBroadcastRoom>lambdaQuery()
 | 
	
		
			
				|  |  | +                .in(ImLiveBroadcastRoom::getLiveState, 0, 1)
 | 
	
		
			
				|  |  | +                .eq(ImLiveBroadcastRoom::getRoomState, 0));
 | 
	
		
			
				|  |  |          if (CollectionUtils.isEmpty(list)) {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -365,35 +369,35 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) {
 | 
	
		
			
				|  |  |          log.error("roomDestroy destroyExpiredLiveRoom >>>> now {} roomInfo : {} expiredMinute:{}", now, JSONObject.toJSONString(room), expiredMinute);
 | 
	
		
			
				|  |  | +        //过期时间 = LiveStartTime + expiredMinute
 | 
	
		
			
				|  |  | +        Date expiredTime = DateUtil.addMinutes(room.getLiveStartTime(), expiredMinute);
 | 
	
		
			
				|  |  | +        //当前时间 小于 过期时间 则不销毁
 | 
	
		
			
				|  |  | +        if (now.getTime() <= expiredTime.getTime()) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          //获取直播间主讲人信息
 | 
	
		
			
				|  |  |          RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
 | 
	
		
			
				|  |  |          if (speakerCache.isExists()) {
 | 
	
		
			
				|  |  |              RoomSpeakerInfo speakerInfo = speakerCache.get();
 | 
	
		
			
				|  |  | -            //过期时间= 房间正式开始时间+expiredMinute 分钟
 | 
	
		
			
				|  |  | -            Date expiredTime = DateUtil.addMinutes(room.getLiveStartTime(), expiredMinute);
 | 
	
		
			
				|  |  | -            //先决条件 当前时间 大于(创建房间时填入的开播时间 + 设置的过期分钟数)
 | 
	
		
			
				|  |  | -            if (now.getTime() >= expiredTime.getTime()) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                //1.主播没有进入房间,则直接销毁房间
 | 
	
		
			
				|  |  | -                if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
 | 
	
		
			
				|  |  | -                    log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
 | 
	
		
			
				|  |  | -                    roomDestroy(room);
 | 
	
		
			
				|  |  | -                    return;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +            //1.主播没有进入房间,则直接销毁房间
 | 
	
		
			
				|  |  | +            if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
 | 
	
		
			
				|  |  | +                log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
 | 
	
		
			
				|  |  | +                roomDestroy(room);
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                //如果主播已经进入了房间 就判断是否退出过房间
 | 
	
		
			
				|  |  | -                if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
 | 
	
		
			
				|  |  | -                    //如果退出过房间 判断退出时间是否大于进入时间
 | 
	
		
			
				|  |  | -                    if (speakerInfo.getExitRoomTime().getTime() > speakerInfo.getJoinRoomTime().getTime()) {
 | 
	
		
			
				|  |  | -                        //如果退出时间大于进入时间,就将退出时间+expiredMinute分钟
 | 
	
		
			
				|  |  | -                        Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
 | 
	
		
			
				|  |  | -                        if (now.getTime() >= exitExpiredTime.getTime()) {
 | 
	
		
			
				|  |  | -                            log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
 | 
	
		
			
				|  |  | -                            roomDestroy(room);
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | +            //2.已知主播已进入了房间 就判断是否退出过房间
 | 
	
		
			
				|  |  | +            if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
 | 
	
		
			
				|  |  | +                //如果退出时间 大于 进入时间,则证明退出后再也没有进入房间
 | 
	
		
			
				|  |  | +                if (speakerInfo.getExitRoomTime().getTime() > speakerInfo.getJoinRoomTime().getTime()) {
 | 
	
		
			
				|  |  | +                    //最终过期时间 =  退出时间+expiredMinute过期时间
 | 
	
		
			
				|  |  | +                    Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
 | 
	
		
			
				|  |  | +                    //现在时间 大于等于 最终过期时间 则证明退出后至少30分钟没进入过房间
 | 
	
		
			
				|  |  | +                    if (now.getTime() >= exitExpiredTime.getTime()) {
 | 
	
		
			
				|  |  | +                        log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
 | 
	
		
			
				|  |  | +                        roomDestroy(room);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -897,6 +901,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }, 2, 1, TimeUnit.MINUTES);
 | 
	
		
			
				|  |  |          if (!b) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                Thread.sleep(200L);
 | 
	
		
			
				|  |  | +            } catch (InterruptedException e) {
 | 
	
		
			
				|  |  | +                log.error("asyncOpsLiveLookTime error: {}", e.getMessage());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              this.asyncOpsLiveLookTime(roomUid, type, now);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -907,7 +916,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void createLiveRoom() {
 | 
	
		
			
				|  |  |          RBucket<Object> createLock = redissonClient.getBucket("IM:LIVE_ROOM_CREATE_LOCK");
 | 
	
		
			
				|  |  | -        if (!createLock.trySet(1,1, TimeUnit.MINUTES)) {
 | 
	
		
			
				|  |  | +        if (!createLock.trySet(1, 1, TimeUnit.MINUTES)) {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          Date now = new Date();
 | 
	
	
		
			
				|  | @@ -1234,7 +1243,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |       * @param unit     时间单位
 | 
	
		
			
				|  |  |       * @return true 锁成功  false 锁失败
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    public boolean runIfLockCanGet(final String lockName, Runnable runnable, final long waitTime, final long timeout, TimeUnit unit) {
 | 
	
		
			
				|  |  | +    private boolean runIfLockCanGet(final String lockName, Runnable runnable, final long waitTime, final long timeout, TimeUnit unit) {
 | 
	
		
			
				|  |  |          RLock lock = redissonClient.getLock(lockName);
 | 
	
		
			
				|  |  |          if (Objects.isNull(lock)) {
 | 
	
		
			
				|  |  |              log.info("runIfLockCanGet lock is null lockName : {}", lockName);
 | 
	
	
		
			
				|  | @@ -1251,7 +1260,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          } catch (Exception e) {
 | 
	
		
			
				|  |  |              log.error("runIfLockCanGet error lockName : {}", lockName, e);
 | 
	
		
			
				|  |  | -            throw new RuntimeException("runIfLockCanGet error lockName :" + lockName, e);
 | 
	
		
			
				|  |  | +            throw new BizException("runIfLockCanGet error lockName :" + lockName, e);
 | 
	
		
			
				|  |  |          } finally {
 | 
	
		
			
				|  |  |              this.unlock(lock);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -1260,7 +1269,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 解锁
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  | -    public void unlock(RLock lock) {
 | 
	
		
			
				|  |  | +    private void unlock(RLock lock) {
 | 
	
		
			
				|  |  |          if (lock.getHoldCount() != 0) {
 | 
	
		
			
				|  |  |              lock.unlock();
 | 
	
		
			
				|  |  |          }
 |