|
@@ -620,13 +620,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) throws Exception {
|
|
|
|
|
|
+ private boolean destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) throws Exception {
|
|
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
|
|
//过期时间 = LiveStartTime + expiredMinute
|
|
Date expiredTime = DateUtil.addMinutes(room.getLiveStartTime(), expiredMinute);
|
|
Date expiredTime = DateUtil.addMinutes(room.getLiveStartTime(), expiredMinute);
|
|
//当前时间 小于 过期时间 则不销毁
|
|
//当前时间 小于 过期时间 则不销毁
|
|
if (now.getTime() <= expiredTime.getTime()) {
|
|
if (now.getTime() <= expiredTime.getTime()) {
|
|
- return;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
//获取直播间主讲人信息
|
|
//获取直播间主讲人信息
|
|
RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString());
|
|
RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(room.getRoomUid(), room.getSpeakerId().toString());
|
|
@@ -637,7 +637,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
if (Objects.nonNull(liveRoomUser) && liveRoomUser.getExist() &&
|
|
if (Objects.nonNull(liveRoomUser) && liveRoomUser.getExist() &&
|
|
"1".equals(liveRoomUser.getStatus()) && StringUtils.equals(liveRoomUser.getStatus(), "1")) {
|
|
"1".equals(liveRoomUser.getStatus()) && StringUtils.equals(liveRoomUser.getStatus(), "1")) {
|
|
log.info("roomDestroy destroyExpiredLiveRoom is online >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
|
|
log.info("roomDestroy destroyExpiredLiveRoom is online >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
|
|
- return;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
//校验房间心跳是否过期没续租
|
|
//校验房间心跳是否过期没续租
|
|
RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, room.getRoomUid()));
|
|
RBucket<Date> lastRoomHeartbeatCache = redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, room.getRoomUid()));
|
|
@@ -649,14 +649,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
//当前时间 小于 房间心跳过期时间 则不销毁
|
|
//当前时间 小于 房间心跳过期时间 则不销毁
|
|
if (now.getTime() <= lastRoomDateExpired.getTime()) {
|
|
if (now.getTime() <= lastRoomDateExpired.getTime()) {
|
|
log.info("roomDestroy destroyExpiredLiveRoom last room heartbeat >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
|
|
log.info("roomDestroy destroyExpiredLiveRoom last room heartbeat >>>> roomId:{} speakerId:{}", room.getId(), speakerInfo.getSpeakerId());
|
|
- return;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//1.主播没有进入房间,则直接销毁房间
|
|
//1.主播没有进入房间,则直接销毁房间
|
|
if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
|
|
if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
|
|
log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
|
|
log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
|
|
- roomDestroy(room);
|
|
|
|
- return;
|
|
|
|
|
|
+ return roomDestroy(room);
|
|
}
|
|
}
|
|
|
|
|
|
//2.已知主播已进入了房间 就判断是否退出过房间
|
|
//2.已知主播已进入了房间 就判断是否退出过房间
|
|
@@ -668,11 +667,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
//现在时间 大于等于 最终过期时间 则证明退出后至少30分钟没进入过房间
|
|
//现在时间 大于等于 最终过期时间 则证明退出后至少30分钟没进入过房间
|
|
if (now.getTime() >= exitExpiredTime.getTime()) {
|
|
if (now.getTime() >= exitExpiredTime.getTime()) {
|
|
log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
|
|
log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
|
|
- roomDestroy(room);
|
|
|
|
|
|
+ return roomDestroy(room);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -682,10 +682,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
* @param roomUid 直播间Uid
|
|
* @param roomUid 直播间Uid
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- public void roomDestroy(String roomUid) {
|
|
|
|
|
|
+ public boolean roomDestroy(String roomUid) {
|
|
ImLiveBroadcastRoom room = this.getOne(Wrappers.<ImLiveBroadcastRoom>lambdaQuery()
|
|
ImLiveBroadcastRoom room = this.getOne(Wrappers.<ImLiveBroadcastRoom>lambdaQuery()
|
|
.eq(ImLiveBroadcastRoom::getRoomUid, roomUid));
|
|
.eq(ImLiveBroadcastRoom::getRoomUid, roomUid));
|
|
- opsRoomDestroy(room);
|
|
|
|
|
|
+ return opsRoomDestroy(room);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -695,14 +695,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
* @param id 直播房间表id
|
|
* @param id 直播房间表id
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- public void roomDestroy(Integer id) {
|
|
|
|
|
|
+ public boolean roomDestroy(Integer id) {
|
|
ImLiveBroadcastRoom room = this.getById(id);
|
|
ImLiveBroadcastRoom room = this.getById(id);
|
|
- opsRoomDestroy(room);
|
|
|
|
|
|
+ return opsRoomDestroy(room);
|
|
}
|
|
}
|
|
|
|
|
|
- private void opsRoomDestroy(ImLiveBroadcastRoom room) {
|
|
|
|
|
|
+ private boolean opsRoomDestroy(ImLiveBroadcastRoom room) {
|
|
if (Objects.isNull(room)) {
|
|
if (Objects.isNull(room)) {
|
|
- return;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
if (room.getLiveState() == 0) {
|
|
if (room.getLiveState() == 0) {
|
|
throw new BizException("直播未开始");
|
|
throw new BizException("直播未开始");
|
|
@@ -711,14 +711,47 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
throw new BizException("直播已经结束,请刷新数据!");
|
|
throw new BizException("直播已经结束,请刷新数据!");
|
|
}
|
|
}
|
|
//销毁房间
|
|
//销毁房间
|
|
- roomDestroy(room);
|
|
|
|
|
|
+ return roomDestroy(room);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void sendForcedOffline(ImLiveBroadcastRoom room) {
|
|
|
|
+
|
|
|
|
+ LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
|
|
+
|
|
|
|
+ LiveRoomMessage message = new LiveRoomMessage();
|
|
|
|
+ message.setIsIncludeSender(1);
|
|
|
|
+ message.setFromUserId(room.getSpeakerId().toString());
|
|
|
|
+ message.setToChatRoomId(room.getRoomUid());
|
|
|
|
+ message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
|
+
|
|
|
|
+ SysUser sysUser = sysUserFeignService.queryUserInfo();
|
|
|
|
+ if (Objects.nonNull(sysUser)) {
|
|
|
|
+
|
|
|
|
+ // 发送用户信息
|
|
|
|
+ LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
|
|
|
|
+ .sendUserId(String.valueOf(room.getSpeakerId()))
|
|
|
|
+ .sendUserName(sysUser.getUsername())
|
|
|
|
+ .avatarUrl(sysUser.getAvatar())
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ message.setContent(LiveRoomMessage.MessageContent.builder().sendUserInfo(messageUser).build());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ pluginService.sendChatRoomMessage(message);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+
|
|
|
|
+ log.error("sendForcedOffline error", e);
|
|
|
|
+ }
|
|
|
|
+ log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
}
|
|
}
|
|
|
|
|
|
- public void roomDestroy(ImLiveBroadcastRoom room) {
|
|
|
|
|
|
+ public boolean roomDestroy(ImLiveBroadcastRoom room) {
|
|
//10秒内同一个房间不能重复销毁-防重复销毁
|
|
//10秒内同一个房间不能重复销毁-防重复销毁
|
|
RBucket<Object> bucket = redissonClient.getBucket("IM:ROOMDESTROY:" + room.getRoomUid());
|
|
RBucket<Object> bucket = redissonClient.getBucket("IM:ROOMDESTROY:" + room.getRoomUid());
|
|
if (!bucket.trySet(1, 10, TimeUnit.SECONDS)) {
|
|
if (!bucket.trySet(1, 10, TimeUnit.SECONDS)) {
|
|
- return;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
log.error("roomDestroy>>>> room : {}", JSONObject.toJSONString(room));
|
|
log.error("roomDestroy>>>> room : {}", JSONObject.toJSONString(room));
|
|
String roomUid = room.getRoomUid();
|
|
String roomUid = room.getRoomUid();
|
|
@@ -755,28 +788,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
|
|
|
//向聊天室发自定义消息踢出所有人
|
|
//向聊天室发自定义消息踢出所有人
|
|
try {
|
|
try {
|
|
- LiveRoomMessage message = new LiveRoomMessage();
|
|
|
|
- message.setIsIncludeSender(1);
|
|
|
|
- message.setFromUserId(speakerId.toString());
|
|
|
|
- message.setToChatRoomId(roomUid);
|
|
|
|
- message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
|
-
|
|
|
|
- SysUser sysUser = sysUserFeignService.queryUserInfo();
|
|
|
|
- if (Objects.nonNull(sysUser)) {
|
|
|
|
-
|
|
|
|
- // 发送用户信息
|
|
|
|
- LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
|
|
|
|
- .sendUserId(String.valueOf(speakerId))
|
|
|
|
- .sendUserName(sysUser.getUsername())
|
|
|
|
- .avatarUrl(sysUser.getAvatar())
|
|
|
|
- .build();
|
|
|
|
-
|
|
|
|
- message.setContent(LiveRoomMessage.MessageContent.builder().sendUserInfo(messageUser).build());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
- pluginService.sendChatRoomMessage(message);
|
|
|
|
- log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
|
|
|
|
+
|
|
|
|
+ sendForcedOffline(room);
|
|
|
|
|
|
//销毁直播间
|
|
//销毁直播间
|
|
pluginService.chatRoomDestroy(roomUid);
|
|
pluginService.chatRoomDestroy(roomUid);
|
|
@@ -806,10 +820,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
}
|
|
}
|
|
|
|
|
|
// imFeignService.destroyLiveRoom(roomUid);
|
|
// imFeignService.destroyLiveRoom(roomUid);
|
|
- log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
|
|
|
|
|
|
+// log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
|
|
log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
private String getStreamId(String roomUid, Integer speakerId) {
|
|
private String getStreamId(String roomUid, Integer speakerId) {
|
|
@@ -2905,34 +2921,41 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
}
|
|
}
|
|
for (ImLiveBroadcastRoom imLiveBroadcastRoom : list) {
|
|
for (ImLiveBroadcastRoom imLiveBroadcastRoom : list) {
|
|
|
|
|
|
- LivePluginService pluginService = livePluginContext.getPluginService(
|
|
|
|
- imLiveBroadcastRoom.getServiceProvider());
|
|
|
|
- try {
|
|
|
|
- if (pluginService == null) {
|
|
|
|
- log.error("查询直播间流失败,未找到对应的插件");
|
|
|
|
- continue;
|
|
|
|
|
|
+ tryDestroyLiveRoom(imLiveBroadcastRoom);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean tryDestroyLiveRoom(ImLiveBroadcastRoom imLiveBroadcastRoom) {
|
|
|
|
+ LivePluginService pluginService = livePluginContext.getPluginService(
|
|
|
|
+ imLiveBroadcastRoom.getServiceProvider());
|
|
|
|
+ try {
|
|
|
|
+ if (pluginService == null) {
|
|
|
|
+ log.error("查询直播间流失败,未找到对应的插件");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (pluginService.pluginName().equals(TencentCloudLivePlugin.PLUGIN_NAME)) {
|
|
|
|
+ TencentWrapper.LiveStreamState liveStreamState = pluginService.liveStreamState(
|
|
|
|
+ getStreamId(imLiveBroadcastRoom.getRoomUid(), imLiveBroadcastRoom.getSpeakerId()));
|
|
|
|
+ if (liveStreamState == null) {
|
|
|
|
+ log.error("查询直播间流失败,返回结果为空");
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
- if (pluginService.pluginName().equals(TencentCloudLivePlugin.PLUGIN_NAME)) {
|
|
|
|
- TencentWrapper.LiveStreamState liveStreamState = pluginService.liveStreamState(
|
|
|
|
- getStreamId(imLiveBroadcastRoom.getRoomUid(), imLiveBroadcastRoom.getSpeakerId()));
|
|
|
|
- if (liveStreamState == null) {
|
|
|
|
- log.error("查询直播间流失败,返回结果为空");
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- log.info("查询直播间流状态:{},roomUid:{}", JSON.toJSONString(liveStreamState), imLiveBroadcastRoom.getRoomUid());
|
|
|
|
- if (!"active".equals(liveStreamState.getStreamState())) {
|
|
|
|
- roomDestroy(imLiveBroadcastRoom.getRoomUid());
|
|
|
|
- }
|
|
|
|
- } else if (pluginService.pluginName().equals(RongCloudLivePlugin.PLUGIN_NAME)) {
|
|
|
|
- // 融云走原有逻辑
|
|
|
|
- destroyExpiredLiveRoom(new Date(), imLiveBroadcastRoom, 0);
|
|
|
|
|
|
+ log.info("查询直播间流状态:{},roomUid:{}", JSON.toJSONString(liveStreamState), imLiveBroadcastRoom.getRoomUid());
|
|
|
|
+ if (!"active".equals(liveStreamState.getStreamState())) {
|
|
|
|
+ return roomDestroy(imLiveBroadcastRoom.getRoomUid());
|
|
}
|
|
}
|
|
- } catch (Exception e) {
|
|
|
|
-
|
|
|
|
- log.error("查询直播间流失败", e);
|
|
|
|
|
|
+ } else if (pluginService.pluginName().equals(RongCloudLivePlugin.PLUGIN_NAME)) {
|
|
|
|
+ // 融云走原有逻辑
|
|
|
|
+ return destroyExpiredLiveRoom(new Date(), imLiveBroadcastRoom, 0);
|
|
}
|
|
}
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
|
|
|
+ log.error("查询直播间流失败", e);
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -3076,6 +3099,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
.update();
|
|
.update();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public ImLiveBroadcastRoom getByRoomUid(String liveRoomId) {
|
|
|
|
+ List<ImLiveBroadcastRoom> list = this.lambdaQuery()
|
|
|
|
+ .eq(ImLiveBroadcastRoom::getRoomUid, liveRoomId)
|
|
|
|
+ .list();
|
|
|
|
+ if (CollectionUtils.isEmpty(list)) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return list.get(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
* 查询直播间所有用户信息
|
|
* 查询直播间所有用户信息
|