修复用户进房缓存
This commit is contained in:
@@ -4,6 +4,8 @@ import com.accompany.business.event.room.UserOutRoomAfterRecordEvent;
|
||||
import com.accompany.business.event.room.UserOutRoomEvent;
|
||||
import com.accompany.business.message.room.UserOutRoomMessage;
|
||||
import com.accompany.business.param.LeftChatRoomParam;
|
||||
import com.accompany.business.service.user.UserInRoomService;
|
||||
import com.accompany.business.vo.RoomVo;
|
||||
import com.accompany.common.redis.RedisKey;
|
||||
import com.accompany.core.model.Room;
|
||||
import com.accompany.sharding.mapper.UserInOutRoomRecordMapper;
|
||||
@@ -41,7 +43,10 @@ public class UserInOutRoomRecordService extends ServiceImpl<UserInOutRoomRecordM
|
||||
|
||||
private RMap<Long, Long> userInRoomCurrentMap;
|
||||
|
||||
public Long getUserRoomRemainMillsTime(Long uid, Long roomUid, Date startTime, Date endTime){
|
||||
@Autowired
|
||||
private UserInRoomService userInRoomService;
|
||||
|
||||
public Long getUserRoomRemainMillsTime(Long uid, Long roomUid, Date startTime, Date endTime) {
|
||||
return baseMapper.getUserRoomRemainMillsTime(uid, roomUid, startTime, endTime);
|
||||
}
|
||||
|
||||
@@ -49,68 +54,56 @@ public class UserInOutRoomRecordService extends ServiceImpl<UserInOutRoomRecordM
|
||||
@Async
|
||||
public void cacheRecordAndSave(LeftChatRoomParam leftChatRoomParam) {
|
||||
String event = leftChatRoomParam.getEvent();
|
||||
if (!isEntreRoomAction(event) && !isLeaveRoomAction(event)){
|
||||
if (!isEntreRoomAction(event) && !isLeaveRoomAction(event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
String uidStr = leftChatRoomParam.getAccid();
|
||||
Long uid = Long.parseLong(uidStr);
|
||||
Long roomId = leftChatRoomParam.getRoomId();
|
||||
String roomIdStr = String.valueOf(roomId);
|
||||
Room room = roomService.getRoomByRoomId(roomId);
|
||||
Long roomUid = null != room? room.getUid(): null;
|
||||
Long roomUid = null != room ? room.getUid() : null;
|
||||
Long timestamp = leftChatRoomParam.getTimestamp();
|
||||
|
||||
RSet<Long> roomSet = redissonClient.getSet(RedisKey.user_in_out_room_record.getKey(uidStr, roomIdStr));
|
||||
|
||||
if (isEntreRoomAction(event)){
|
||||
if (isEntreRoomAction(event)) {
|
||||
if (null != roomUid) {
|
||||
userInRoomCurrentMap.fastPut(uid, roomUid);
|
||||
userInRoomService.saveUserInRoomCache(uid, roomService.getRoomVoByUid(roomUid));
|
||||
}
|
||||
|
||||
roomSet.add(timestamp);
|
||||
roomSet.expire(12, TimeUnit.HOURS);
|
||||
log.info("[进房间开始计算时间] {} {} {}", uid, roomId, timestamp);
|
||||
|
||||
roomService.ownerInRoom(leftChatRoomParam);
|
||||
} else if (isLeaveRoomAction(event)){
|
||||
} else if (isLeaveRoomAction(event)) {
|
||||
Long entreTimestamp = null;
|
||||
|
||||
RLock lock = redissonClient.getLock(RedisKey.user_in_out_room_lock.getKey(uidStr, roomIdStr));
|
||||
boolean locked = false;
|
||||
try {
|
||||
locked = lock.tryLock(3, TimeUnit.SECONDS);
|
||||
|
||||
Optional<Long> lastInRoom = roomSet.stream().filter(inTime -> timestamp.compareTo(inTime) > 0).max(Comparator.comparingLong(Long::longValue));
|
||||
if (!lastInRoom.isPresent()){
|
||||
if (!lastInRoom.isPresent()) {
|
||||
log.error("[出房间结束计算时间] 获取进房时间异常 {} {} {}", uid, roomId, timestamp);
|
||||
return;
|
||||
}
|
||||
|
||||
entreTimestamp = lastInRoom.get();
|
||||
roomSet.remove(entreTimestamp);
|
||||
|
||||
} catch (InterruptedException e){
|
||||
} catch (InterruptedException e) {
|
||||
log.error("[出房间结束计算时间] 获取进房时间锁超时 {} {} {}", uid, roomId, timestamp, e);
|
||||
} finally {
|
||||
if (locked){
|
||||
if (locked) {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
if (null == entreTimestamp){
|
||||
if (null == entreTimestamp) {
|
||||
return;
|
||||
}
|
||||
|
||||
long remainMillisecond = timestamp - entreTimestamp;
|
||||
log.info("[出房间结束计算时间] {} {} {} {} {}", uid, roomId, entreTimestamp, timestamp, remainMillisecond);
|
||||
|
||||
userInRoomCurrentMap.fastRemove(uid);
|
||||
userInRoomService.removeUserInRoomCache(uid);
|
||||
roomService.ownerOrSeqUserLeftRoom(leftChatRoomParam);
|
||||
|
||||
UserOutRoomMessage userOutRoomMessage = new UserOutRoomMessage(uid, roomUid, entreTimestamp, timestamp, remainMillisecond);
|
||||
applicationContext.publishEvent(new UserOutRoomEvent(userOutRoomMessage));
|
||||
|
||||
//save
|
||||
UserInOutRoomRecord record = new UserInOutRoomRecord();
|
||||
record.setUid(uid);
|
||||
@@ -120,20 +113,19 @@ public class UserInOutRoomRecordService extends ServiceImpl<UserInOutRoomRecordM
|
||||
record.setOutTime(new Date(timestamp));
|
||||
record.setRemainTime(remainMillisecond);
|
||||
save(record);
|
||||
|
||||
applicationContext.publishEvent(new UserOutRoomAfterRecordEvent(userOutRoomMessage));
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isEntreRoomAction(String event){
|
||||
private boolean isEntreRoomAction(String event) {
|
||||
return "IN".equals(event);
|
||||
}
|
||||
|
||||
private boolean isLeaveRoomAction(String event){
|
||||
private boolean isLeaveRoomAction(String event) {
|
||||
return "OUT".equals(event);
|
||||
}
|
||||
|
||||
public Long getUserCurrentRoomUid(Long uid){
|
||||
public Long getUserCurrentRoomUid(Long uid) {
|
||||
return userInRoomCurrentMap.get(uid);
|
||||
}
|
||||
|
||||
|
@@ -101,7 +101,7 @@ public class UserInRoomService {
|
||||
jedisService.hwrite(RedisKey.user_in_room.getKey(), uid.toString(), GsonUtil.getDefGson().toJson(roomVo));
|
||||
}
|
||||
|
||||
private void removeUserInRoomCache(Long uid) {
|
||||
public void removeUserInRoomCache(Long uid) {
|
||||
jedisService.hdel(RedisKey.user_in_room.getKey(), uid.toString());
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user