|
@@ -225,11 +225,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public void update(ImLiveBroadcastRoomDto dto) {
|
|
public void update(ImLiveBroadcastRoomDto dto) {
|
|
|
|
+ Date now = new Date();
|
|
|
|
+ if (now.getTime() > dto.getLiveStartTime().getTime()) {
|
|
|
|
+ throw new BizException("设置的直播开始时间不能小于当前时间");
|
|
|
|
+ }
|
|
ImLiveBroadcastRoom obj = this.getById(dto.getId());
|
|
ImLiveBroadcastRoom obj = this.getById(dto.getId());
|
|
BeanUtils.copyProperties(dto, obj);
|
|
BeanUtils.copyProperties(dto, obj);
|
|
obj.setRoomConfig(JSONObject.toJSONString(dto.getRoomConfig()));
|
|
obj.setRoomConfig(JSONObject.toJSONString(dto.getRoomConfig()));
|
|
obj.setUpdatedBy(getSysUser().getId());
|
|
obj.setUpdatedBy(getSysUser().getId());
|
|
- obj.setUpdatedTime(new Date());
|
|
|
|
|
|
+ obj.setUpdatedTime(now);
|
|
log.info("update room >>> :{}", JSONObject.toJSONString(obj));
|
|
log.info("update room >>> :{}", JSONObject.toJSONString(obj));
|
|
this.updateById(obj);
|
|
this.updateById(obj);
|
|
}
|
|
}
|
|
@@ -326,6 +330,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
Map<String, Object> param = new HashMap<>();
|
|
Map<String, Object> param = new HashMap<>();
|
|
param.put("tenantId", TenantContextHolder.getTenantId());
|
|
param.put("tenantId", TenantContextHolder.getTenantId());
|
|
param.put("popularize", 1);
|
|
param.put("popularize", 1);
|
|
|
|
+ param.put("liveState", 1);
|
|
List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(param);
|
|
List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(param);
|
|
if (CollectionUtils.isNotEmpty(list)) {
|
|
if (CollectionUtils.isNotEmpty(list)) {
|
|
return list.get(0);
|
|
return list.get(0);
|
|
@@ -338,11 +343,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
* 销毁主讲人退出超过30分钟的直播间
|
|
* 销毁主讲人退出超过30分钟的直播间
|
|
*/
|
|
*/
|
|
public void destroyExpiredLiveRoom() {
|
|
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)) {
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -365,35 +369,35 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
|
|
|
private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) {
|
|
private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) {
|
|
log.error("roomDestroy destroyExpiredLiveRoom >>>> now {} roomInfo : {} expiredMinute:{}", now, JSONObject.toJSONString(room), 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()));
|
|
RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
|
|
if (speakerCache.isExists()) {
|
|
if (speakerCache.isExists()) {
|
|
RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
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);
|
|
}, 2, 1, TimeUnit.MINUTES);
|
|
if (!b) {
|
|
if (!b) {
|
|
|
|
+ try {
|
|
|
|
+ Thread.sleep(200L);
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
+ log.error("asyncOpsLiveLookTime error: {}", e.getMessage());
|
|
|
|
+ }
|
|
this.asyncOpsLiveLookTime(roomUid, type, now);
|
|
this.asyncOpsLiveLookTime(roomUid, type, now);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -907,7 +916,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
*/
|
|
*/
|
|
public void createLiveRoom() {
|
|
public void createLiveRoom() {
|
|
RBucket<Object> createLock = redissonClient.getBucket("IM:LIVE_ROOM_CREATE_LOCK");
|
|
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;
|
|
return;
|
|
}
|
|
}
|
|
Date now = new Date();
|
|
Date now = new Date();
|
|
@@ -1234,7 +1243,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
* @param unit 时间单位
|
|
* @param unit 时间单位
|
|
* @return true 锁成功 false 锁失败
|
|
* @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);
|
|
RLock lock = redissonClient.getLock(lockName);
|
|
if (Objects.isNull(lock)) {
|
|
if (Objects.isNull(lock)) {
|
|
log.info("runIfLockCanGet lock is null lockName : {}", lockName);
|
|
log.info("runIfLockCanGet lock is null lockName : {}", lockName);
|
|
@@ -1251,7 +1260,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
log.error("runIfLockCanGet error lockName : {}", lockName, 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 {
|
|
} finally {
|
|
this.unlock(lock);
|
|
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) {
|
|
if (lock.getHoldCount() != 0) {
|
|
lock.unlock();
|
|
lock.unlock();
|
|
}
|
|
}
|