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