|
@@ -42,7 +42,6 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
import java.util.*;
|
|
|
-import java.util.function.Consumer;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -220,41 +219,50 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
return;
|
|
|
}
|
|
|
Date now = new Date();
|
|
|
+ //查询房间过期时间
|
|
|
+ String expiredMinuteStr = sysConfigDao.findConfigValue("destroy_expired_live_room_minute");
|
|
|
+ if (StringUtils.isEmpty(expiredMinuteStr)) {
|
|
|
+ log.info("roomDestroy>>>> 未查询到配置:destroy_expired_live_room_minute");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ int expiredMinute = Integer.parseInt(expiredMinuteStr);
|
|
|
list.forEach(room -> {
|
|
|
- //过期时间= 房间正式开始时间+30分钟
|
|
|
- Date expiredTime = DateUtil.addMinutes(room.getCreatedTime(), 30);
|
|
|
- // 现在 大于等于 过期时间
|
|
|
- if (now.getTime() >= expiredTime.getTime()) {
|
|
|
- //获取直播间主讲人信息
|
|
|
- RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
|
|
|
- if (speakerCache.isExists()) {
|
|
|
- RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
- //超过30分钟,没有进入房间
|
|
|
- if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
|
|
|
- roomDestroy(room.getId());
|
|
|
- }
|
|
|
- //超过30分钟,但是未开启直播,则销毁
|
|
|
- if (Objects.isNull(speakerInfo.getState())) {
|
|
|
+ try {
|
|
|
+ destroyExpiredLiveRoom(now, room, expiredMinute);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("roomDestroy>>>> failed roomId:{} msg:{}", room.getId(), e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) {
|
|
|
+ //过期时间= 房间正式开始时间+expiredMinute 分钟
|
|
|
+ Date expiredTime = DateUtil.addMinutes(room.getCreatedTime(), expiredMinute);
|
|
|
+ // 现在 大于等于 过期时间
|
|
|
+ if (now.getTime() >= expiredTime.getTime()) {
|
|
|
+ //获取直播间主讲人信息
|
|
|
+ RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
|
|
|
+ if (speakerCache.isExists()) {
|
|
|
+ RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
+ //超过30分钟,没有进入房间
|
|
|
+ if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
|
|
|
+ roomDestroy(room.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ //超过expiredMinute分钟,但是未开启直播,则销毁
|
|
|
+ if (Objects.isNull(speakerInfo.getState())) {
|
|
|
+ roomDestroy(room.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ //现在时间 大于 (退出房间的时间 + expiredMinute 分钟),则销毁
|
|
|
+ if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
|
|
|
+ Date comparedTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
|
|
|
+ if (now.getTime() >= comparedTime.getTime()) {
|
|
|
roomDestroy(room.getId());
|
|
|
}
|
|
|
- //现在 大于 (传入时间+30分钟) 则销毁
|
|
|
- Consumer<Date> consumer = date -> {
|
|
|
- Date comparedTime = DateUtil.addMinutes(date, 30);
|
|
|
- if (now.getTime() >= comparedTime.getTime()) {
|
|
|
- roomDestroy(room.getId());
|
|
|
- }
|
|
|
- };
|
|
|
- //如果直播状态=1(关闭直播),并且现在 大于等于 结束直播时间 +30分钟,则销毁
|
|
|
- if (speakerInfo.getState() == 1) {
|
|
|
- consumer.accept(speakerInfo.getEndLiveTime());
|
|
|
- }
|
|
|
- //现在 大于等于 退出时间 +30分钟,则销毁
|
|
|
- if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
|
|
|
- consumer.accept(speakerInfo.getExitRoomTime());
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -278,7 +286,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
try {
|
|
|
imFeignService.destroyLiveRoom(roomUid);
|
|
|
} catch (Exception e) {
|
|
|
- log.error(e.getMessage(), e.getCause());
|
|
|
+ log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
|
|
|
throw new BizException(e.getMessage());
|
|
|
}
|
|
|
|
|
@@ -300,7 +308,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
message.setFromUserId(speakerId.toString());
|
|
|
message.setToChatroomId(roomUid);
|
|
|
message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
- imFeignService.publishRoomMsg(message);
|
|
|
+ try {
|
|
|
+ imFeignService.publishRoomMsg(message);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("roomDestroy>>>> publishRoomErrorMsg{}", e.getMessage(), e.getCause());
|
|
|
+ }
|
|
|
log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
|
}
|
|
|
|
|
@@ -324,7 +336,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
});
|
|
|
if (CollectionUtils.isNotEmpty(memberList)) {
|
|
|
liveBroadcastRoomMemberService.getDao().insertBatch(memberList);
|
|
|
- totalLookNum = memberList.size();
|
|
|
+ totalLookNum = roomTotalUser.size();
|
|
|
}
|
|
|
//删除用户对应的直播间关系缓存
|
|
|
roomTotalUser.stream()
|
|
@@ -511,7 +523,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
|
|
|
if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0) {
|
|
|
//开始录制视频
|
|
|
- imFeignService.startRecord(roomUid);
|
|
|
+ try {
|
|
|
+ imFeignService.startRecord(roomUid);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("startRecord error: {}", e.getMessage());
|
|
|
+ }
|
|
|
}
|
|
|
//开始直播
|
|
|
roomSpeakerInfo.setState(0);
|
|
@@ -539,7 +555,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0
|
|
|
&& stateFlag) {
|
|
|
//停止录制视频
|
|
|
- imFeignService.stopRecord(roomSpeakerInfo.getRoomUid());
|
|
|
+ try {
|
|
|
+ imFeignService.stopRecord(roomSpeakerInfo.getRoomUid());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("stopRecord error: {}", e.getMessage());
|
|
|
+ }
|
|
|
}
|
|
|
if (stateFlag) {
|
|
|
Date now = new Date();
|