From 490fa4d84723f170fb04dd4ee1d50b08af6e7a8e Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <daniel.gerhardt@mni.thm.de> Date: Fri, 8 Mar 2013 19:59:36 +0100 Subject: [PATCH] Added method to count active users by using the existing Maps in UserService. Added a scheduled method to delete inactive users from user2sessionLegacy Map. --- .../de/thm/arsnova/services/IUserService.java | 2 ++ .../de/thm/arsnova/services/UserService.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/de/thm/arsnova/services/IUserService.java b/src/main/java/de/thm/arsnova/services/IUserService.java index 73581535..1231bf9c 100644 --- a/src/main/java/de/thm/arsnova/services/IUserService.java +++ b/src/main/java/de/thm/arsnova/services/IUserService.java @@ -48,4 +48,6 @@ public interface IUserService { void addUserToSessionBySocketId(UUID socketId, String keyword); void removeUserFromSessionBySocketId(UUID socketId); + + int getUsersInSessionCount(String keyword); } diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java index b2e0dcdb..550ac086 100644 --- a/src/main/java/de/thm/arsnova/services/UserService.java +++ b/src/main/java/de/thm/arsnova/services/UserService.java @@ -23,6 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.cas.authentication.CasAuthenticationToken; @@ -33,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional; import com.github.leleuj.ss.oauth.client.authentication.OAuthAuthenticationToken; +import de.thm.arsnova.dao.IDatabaseDao; import de.thm.arsnova.entities.User; import de.thm.arsnova.exceptions.UnauthorizedException; @@ -48,6 +51,28 @@ public class UserService implements IUserService, InitializingBean, DisposableBe /* used for HTTP polling online check solution (legacy) */ private static final ConcurrentHashMap<User, String> user2sessionLegacy = new ConcurrentHashMap<User, String>(); + @Autowired + private IDatabaseDao databaseDao; + + private static final int DEFAULT_SCHEDULER_DELAY_MS = 60000; + + private static final int MAX_USER_INACTIVE_SECONDS = 120; + + @Scheduled(fixedDelay = DEFAULT_SCHEDULER_DELAY_MS) + public final void removeInactiveUsersFromLegacyMap() { + List<String> usernames = databaseDao.getInactiveUsers(MAX_USER_INACTIVE_SECONDS); + LOGGER.info( + "Inactive users count: {}, user2sessionLegacy count: {}", + usernames.size(), user2sessionLegacy.size() + ); + for (Entry<User, String> e : user2sessionLegacy.entrySet()) { + if (usernames.contains(e.getKey().getUsername())) { + LOGGER.debug("Removing user {} from user2sessionLegacy", e.getKey()); + user2sessionLegacy.remove(e.getKey()); + } + } + } + @Override public User getCurrentUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -134,6 +159,11 @@ public class UserService implements IUserService, InitializingBean, DisposableBe return result; } + @Override + public int getUsersInSessionCount(String keyword) { + return getUsersInSession(keyword).size(); + } + @Override @Transactional(isolation = Isolation.READ_COMMITTED) public void addCurrentUserToSessionMap(String keyword) { -- GitLab