|
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
|
|
|
+import com.google.common.collect.Lists;
|
|
import com.ym.mec.auth.api.client.SysUserFeignService;
|
|
import com.ym.mec.auth.api.client.SysUserFeignService;
|
|
import com.ym.mec.auth.api.entity.SysUser;
|
|
import com.ym.mec.auth.api.entity.SysUser;
|
|
import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
|
|
import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
|
|
@@ -392,8 +393,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
}
|
|
}
|
|
|
|
|
|
public void roomDestroy(ImLiveBroadcastRoom room) {
|
|
public void roomDestroy(ImLiveBroadcastRoom room) {
|
|
- //销毁房间要先关闭直播
|
|
|
|
- closeLive(room.getRoomUid(),room.getSpeakerId());
|
|
|
|
//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)) {
|
|
@@ -404,7 +403,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
Integer speakerId = room.getSpeakerId();
|
|
Integer speakerId = room.getSpeakerId();
|
|
|
|
|
|
//获取所有直播间缓存数据并写入数据库后并清理缓存
|
|
//获取所有直播间缓存数据并写入数据库后并清理缓存
|
|
- insertAndCleanLiveData(roomUid, speakerId);
|
|
|
|
|
|
+ CompletableFuture.runAsync(() -> insertAndCleanLiveData(roomUid, speakerId));
|
|
log.info("roomDestroy>>>> insertAndCleanLiveData {}", JSONObject.toJSONString(room));
|
|
log.info("roomDestroy>>>> insertAndCleanLiveData {}", JSONObject.toJSONString(room));
|
|
|
|
|
|
//将房间状态改为已销毁
|
|
//将房间状态改为已销毁
|
|
@@ -440,6 +439,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
|
|
|
//获取该直播间所有数据写入数据库-并清理缓存
|
|
//获取该直播间所有数据写入数据库-并清理缓存
|
|
private void insertAndCleanLiveData(String roomUid, Integer speakerId) {
|
|
private void insertAndCleanLiveData(String roomUid, Integer speakerId) {
|
|
|
|
+ Date now = new Date();
|
|
//总观看人数
|
|
//总观看人数
|
|
List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>();
|
|
List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>();
|
|
//获取直播间所有人数据写入 im_live_broadcast_room_member
|
|
//获取直播间所有人数据写入 im_live_broadcast_room_member
|
|
@@ -452,7 +452,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
member.setRoomUid(roomUid);
|
|
member.setRoomUid(roomUid);
|
|
member.setUserId(v.getUserId());
|
|
member.setUserId(v.getUserId());
|
|
member.setJoinTime(v.getFirstJoinTime());
|
|
member.setJoinTime(v.getFirstJoinTime());
|
|
- member.setTotalTime(getLookMinutes(v.getDynamicLookTime(), v.getTotalViewTime()));
|
|
|
|
|
|
+ member.setTotalTime(getLookMinutes(v.getDynamicLookTime(), now, v.getTotalViewTime()));
|
|
memberList.add(member);
|
|
memberList.add(member);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -475,8 +475,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
liveData.setRoomUid(roomUid);
|
|
liveData.setRoomUid(roomUid);
|
|
liveData.setLikeNum(like);
|
|
liveData.setLikeNum(like);
|
|
liveData.setTotalUserNum(CollectionUtils.isNotEmpty(memberList) ? memberList.size() : 0);
|
|
liveData.setTotalUserNum(CollectionUtils.isNotEmpty(memberList) ? memberList.size() : 0);
|
|
- liveData.setUpdatedTime(new Date());
|
|
|
|
- liveData.setLiveTime(getLookMinutes(speakerInfo.getStartLiveTime(), speakerInfo.getTotalLiveTime()));
|
|
|
|
|
|
+ liveData.setUpdatedTime(now);
|
|
|
|
+ liveData.setLiveTime(getLookMinutes(speakerInfo.getStartLiveTime(), now, speakerInfo.getTotalLiveTime()));
|
|
liveBroadcastRoomDataService.save(liveData);
|
|
liveBroadcastRoomDataService.save(liveData);
|
|
//删除房间主讲人数据
|
|
//删除房间主讲人数据
|
|
speakerCache.delete();
|
|
speakerCache.delete();
|
|
@@ -491,7 +491,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
member.setTotalTime(speakerLiveTime);
|
|
member.setTotalTime(speakerLiveTime);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- liveBroadcastRoomMemberService.getDao().insertBatch(memberList);
|
|
|
|
|
|
+ Lists.partition(memberList, 500)
|
|
|
|
+ .forEach(list -> liveBroadcastRoomMemberService.getDao().insertBatch(list));
|
|
//删除用户对应的直播间关系缓存
|
|
//删除用户对应的直播间关系缓存
|
|
memberList.stream()
|
|
memberList.stream()
|
|
.map(ImLiveBroadcastRoomMember::getUserId)
|
|
.map(ImLiveBroadcastRoomMember::getUserId)
|
|
@@ -499,7 +500,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
.forEach(id -> redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, id.toString())).delete());
|
|
.forEach(id -> redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, id.toString())).delete());
|
|
}
|
|
}
|
|
//删除直播间所有用户数据
|
|
//删除直播间所有用户数据
|
|
- roomTotalUserCache.clear();
|
|
|
|
|
|
+ roomTotalUserCache.delete();
|
|
|
|
+ //删除在线用户数据
|
|
|
|
+ getOnlineUserCache(roomUid).delete();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -651,7 +654,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
//记录用户当前房间uid
|
|
//记录用户当前房间uid
|
|
- redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid);
|
|
|
|
|
|
+ redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
|
|
//在线人员列表
|
|
//在线人员列表
|
|
RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
|
|
RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
|
|
//房间累计用户信息-指只要进入到该房间的用户都要记录
|
|
//房间累计用户信息-指只要进入到该房间的用户都要记录
|