diff --git a/src/main/java/cn/lihongjie/coal/loginUser/dto/CreateLoginUserDto.java b/src/main/java/cn/lihongjie/coal/loginUser/dto/CreateLoginUserDto.java index fe4726fd..28540ead 100644 --- a/src/main/java/cn/lihongjie/coal/loginUser/dto/CreateLoginUserDto.java +++ b/src/main/java/cn/lihongjie/coal/loginUser/dto/CreateLoginUserDto.java @@ -17,5 +17,6 @@ public class CreateLoginUserDto extends CommonDto { private String captcha; private Integer timeout; private LocalDateTime loginTime; + private LocalDateTime lastActiveTime; private LocalDateTime expireTime; } diff --git a/src/main/java/cn/lihongjie/coal/loginUser/dto/LoginUserDto.java b/src/main/java/cn/lihongjie/coal/loginUser/dto/LoginUserDto.java index 7e65d741..317c86e0 100644 --- a/src/main/java/cn/lihongjie/coal/loginUser/dto/LoginUserDto.java +++ b/src/main/java/cn/lihongjie/coal/loginUser/dto/LoginUserDto.java @@ -19,5 +19,6 @@ public class LoginUserDto extends CommonDto { private Integer timeout; private LocalDateTime loginTime; + private LocalDateTime lastActiveTime; private LocalDateTime expireTime; } diff --git a/src/main/java/cn/lihongjie/coal/loginUser/dto/UpdateLoginUserDto.java b/src/main/java/cn/lihongjie/coal/loginUser/dto/UpdateLoginUserDto.java index 8effc105..5adb90f0 100644 --- a/src/main/java/cn/lihongjie/coal/loginUser/dto/UpdateLoginUserDto.java +++ b/src/main/java/cn/lihongjie/coal/loginUser/dto/UpdateLoginUserDto.java @@ -18,5 +18,6 @@ public class UpdateLoginUserDto extends CommonDto { private Integer timeout; private LocalDateTime loginTime; + private LocalDateTime lastActiveTime; private LocalDateTime expireTime; } diff --git a/src/main/java/cn/lihongjie/coal/loginUser/entity/LoginUserEntity.java b/src/main/java/cn/lihongjie/coal/loginUser/entity/LoginUserEntity.java index 22ae1a0c..440728db 100644 --- a/src/main/java/cn/lihongjie/coal/loginUser/entity/LoginUserEntity.java +++ b/src/main/java/cn/lihongjie/coal/loginUser/entity/LoginUserEntity.java @@ -23,5 +23,6 @@ public class LoginUserEntity extends CommonEntity { private Integer timeout; private LocalDateTime loginTime; + private LocalDateTime lastActiveTime; private LocalDateTime expireTime; } diff --git a/src/main/java/cn/lihongjie/coal/loginUser/repository/LoginUserRepository.java b/src/main/java/cn/lihongjie/coal/loginUser/repository/LoginUserRepository.java index e54804aa..96612c31 100644 --- a/src/main/java/cn/lihongjie/coal/loginUser/repository/LoginUserRepository.java +++ b/src/main/java/cn/lihongjie/coal/loginUser/repository/LoginUserRepository.java @@ -14,6 +14,13 @@ import java.util.List; @Repository public interface LoginUserRepository extends BaseRepository { + @Transactional + @Modifying + @Query( + "update LoginUserEntity l set l.lastActiveTime = ?1 where l.id = ?2 and l.lastActiveTime < ?3") + int updateLastActiveTimeByIdAndLastActiveTimeLessThan( + LocalDateTime lastActiveTime, String id, LocalDateTime lastActiveTime1); + @Transactional @Modifying @Query("update LoginUserEntity l set l.expireTime = ?1 where l.id = ?2") diff --git a/src/main/java/cn/lihongjie/coal/loginUser/service/LoginUserService.java b/src/main/java/cn/lihongjie/coal/loginUser/service/LoginUserService.java index e0da6486..eef874ed 100644 --- a/src/main/java/cn/lihongjie/coal/loginUser/service/LoginUserService.java +++ b/src/main/java/cn/lihongjie/coal/loginUser/service/LoginUserService.java @@ -17,6 +17,8 @@ import cn.lihongjie.coal.session.SessionService; import cn.lihongjie.coal.sysconfig.service.SysConfigService; import cn.lihongjie.coal.user.service.UserService; +import com.google.common.collect.Maps; + import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; @@ -38,7 +40,9 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -57,12 +61,15 @@ public class LoginUserService extends BaseService lastActivateTime = Maps.newConcurrentMap(); + @PostConstruct public void init() { executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(this::deleteExpireSession, 1, 1, TimeUnit.MINUTES); + executorService.scheduleAtFixedRate(this::syncLastActivateTime, 1, 1, TimeUnit.MINUTES); } @SneakyThrows @@ -160,8 +167,26 @@ public class LoginUserService extends BaseService copy = new HashMap<>(lastActivateTime); + + lastActivateTime.clear(); + + + for (Map.Entry entry : copy.entrySet()) { + + repository.updateLastActiveTimeByIdAndLastActiveTimeLessThan( + entry.getValue(), entry.getKey(), entry.getValue()); + log.info("更新会话最后活跃时间: {} to {}", entry.getKey(), entry.getValue()); + } + + } + public void touch(LoginUserDto loginDto) { + lastActivateTime.put(loginDto.getId(), LocalDateTime.now()); + Integer timeout = loginDto.getTimeout(); LocalDateTime expireTime = loginDto.getExpireTime();