房间-云信-批量更新房间在线人数

This commit is contained in:
khalil
2024-06-17 13:47:18 +08:00
parent 773acd5dd7
commit be467e32fe
5 changed files with 122 additions and 3 deletions

View File

@@ -135,6 +135,22 @@ public class ErBanNetEaseService extends BaseService {
return gsonDefine.fromJson(result, RoomRet.class);
}
/**
* 查询聊天室信息
*/
public BatchRoomRet getBatchRoomMessage(List<Long> roomIdList) {
String url = NetEaseConstant.basicUrl + NetEaseConstant.RoomUrl.getBatch;
NetEaseBaseClient netEaseBaseClient = new NetEaseBaseClient(NetEaseConfig.neteaseAppKey, NetEaseConfig.neteaseAppSecret, url);
Map<String, Object> param = Maps.newHashMap();
param.put("roomids", roomIdList.stream().map(Object::toString).toArray(String[]::new));
param.put("needOnlineUserCount", true);
String result = netEaseBaseClient.buildHttpPostParam(param).executePost();
log.info("getBatchRoomMessage result: {}", result);
return gsonDefine.fromJson(result, BatchRoomRet.class);
}
/**
* 创建聊天室
*

View File

@@ -0,0 +1,55 @@
package com.accompany.common.netease.neteaseacc.result;
import lombok.Data;
import java.util.List;
@Data
public class BatchRoomRet extends BaseNetEaseRet {
/**
{
"noExistRooms": [ //不存在的聊天室id列表
6001
],
"succRooms": [
{
"roomid": 6002,
"valid": true,
"announcement": "hi,this is announcement",
"muted": false,
"name": "6002 chatroom",
"broadcasturl": "",
"onlineusercount": 0,
"ext": "6002 ext",
"creator": "zhangsan",
"queuelevel": 0,
"ionotify": true // 聊天室进出通知是否开启
}
],
"failRooms": [ //失败的聊天室id,有可能是查的时候有500错误
6003
],
"code": 200
}
*/
private List<Long> noExistRooms;
private List<Long> failRooms;
private List<RoomInfo> succRooms;
@Data
public static class RoomInfo {
private Long roomid;
private Boolean vaild;
private String announcement;
private Boolean muted;
private String name;
private String broadcasturl;
private Integer onlineusercount;
private String ext;
private String creator;
private Integer queuelevel;
private Boolean ionotify;
}
}

View File

@@ -56,6 +56,7 @@ public class NetEaseConstant {
public static class RoomUrl {
public static String create = "/chatroom/create.action";
public static String get = "/chatroom/get.action";
public static String getBatch = "/chatroom/getBatch.action";
public static String update = "/chatroom/update.action";
public static String sendMsg = "/chatroom/sendMsg.action";
public static String toggleCloseStat = "/chatroom/toggleCloseStat.action";

View File

@@ -1906,6 +1906,50 @@ public class RoomService extends BaseService {
}
}
/**
* 刷新房间在线人数
*/
public void scanRoomOnline(List<RoomVo> roomVoList) {
Map<Long, RoomVo> roomVoMap = roomVoList.stream().collect(Collectors.toMap(RoomVo::getRoomId, roomVo -> roomVo));
List<Long> roomIdList = roomVoList.stream().filter(RoomVo::getValid).map(RoomVo::getRoomId).distinct().collect(Collectors.toList());
BatchRoomRet batchRoomRet = erBanNetEaseService.getBatchRoomMessage(roomIdList);
for (BatchRoomRet.RoomInfo roomInfo: batchRoomRet.getSuccRooms()){
RoomVo roomVo = roomVoMap.get(roomInfo.getRoomid());
if (null == roomVo){
continue;
}
int personNum = roomInfo.getOnlineusercount();
RunningRoomVo runningRoomVo = new RunningRoomVo();
if (personNum > 0) {
// 牌照房需要过滤机器人
if (roomVo.getIsPermitRoom() == 1) {
if (roomCleanService.hasRealUserInRoom(roomVo.getRoomId())) {
runningRoomVo.setCount(0);
} else {
// 开房状态时每扫描一次若在线人数为0计数器加1
runningRoomVo.setCount(roomVo.getCount() + 1);
}
} else {
runningRoomVo.setCount(0);
}
} else {
// 开房状态时每扫描一次若在线人数为0计数器加1
runningRoomVo.setCount(roomVo.getCount() + 1);
}
runningRoomVo.setRoomId(roomVo.getRoomId());
runningRoomVo.setUid(roomVo.getUid());
runningRoomVo.setOnlineNum(personNum);
String runningRoomStr = GsonUtil.getDefGson().toJson(runningRoomVo);
jedisService.hwrite(RedisKey.room_running.getKey(), roomVo.getUid().toString(), runningRoomStr);
updateRoomOnlineNumMysql(roomVo.getUid(), personNum);
// 更新房间缓存
saveRoomCacheByUid(roomVo.getUid());
}
}
/**
* 获取房间在线人数
*

View File

@@ -3,6 +3,8 @@ package com.accompany.scheduler.task;
import com.accompany.business.service.room.RoomService;
import com.accompany.business.vo.RoomVo;
import com.accompany.scheduler.base.BaseTask;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
@@ -30,12 +32,13 @@ public class RefreshPersonTask extends BaseTask {
public void execute(){
log.info("定时任务:刷新人数正在执行。");
List<RoomVo> roomList = roomService.getHomeRunningRoomList();
for (RoomVo roomVo : roomList) {
List<List<RoomVo>> partitionList = Lists.partition(roomList, 20);
for (List<RoomVo> list: partitionList){
bizExecutor.execute(()->{
try {
roomService.scanRoomOnline(roomVo);
roomService.scanRoomOnline(list);
} catch (Exception e) {
log.error("更新房间人数失败, roomVo:{}", gson.toJson(roomVo), e);
log.error("更新房间人数失败, list:{}", JSON.toJSONString(list), e);
}
});
}