Kaynağa Gözat

设置redis中群组 用户信息 的过期时间为 30分钟

779513719 5 yıl önce
ebeveyn
işleme
1abfa17516

+ 19 - 0
jim-common/src/main/java/org/jim/common/cache/redis/RedisCache.java

@@ -247,6 +247,25 @@ public class RedisCache implements ICache {
 			log.error(e.toString(),e);
 		}
 	}
+
+	/**
+	 * 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
+	 * 在 Redis 中,带有生存时间的 key 被称为『可挥发』(volatile)的。
+	 * @param key key
+	 * @param expire 生命周期,单位为秒
+	 * @return 1: 设置成功 0: 已经超时或key不存在
+	 */
+	public Long expire(final String key, final int expire){
+		if (StringUtils.isBlank(key)) {
+			return null;
+		}
+		try {
+			return JedisTemplate.me().expire(key, expire);
+		} catch (Exception e) {
+			log.error(e.toString(),e);
+		}
+		return null;
+	}
 	
 	public String getCacheName() {
 		return cacheName;

+ 19 - 39
jim-server/src/main/java/org/jim/server/command/handler/CloseReqHandler.java

@@ -57,46 +57,28 @@ public class CloseReqHandler extends AbstractCmdHandler
 			ImSessionContext imSessionContext = (ImSessionContext)channelContext.getAttribute();
 			Client client = imSessionContext.getClient();
 			if( null != client){
-				User user = client.getUser();
-				if( null != user ){
-					String visitType = user.getVisitType();
-					String[] userIdArray = {user.getId()};
-					if( VisitTypeEnum.SERVICEACCOUNT.getKey().equals(visitType) ){
-						//移除客服容器中的 客服
-						String serviceAccountContainerKey
-								=  user.getExtras().getString("companyId") + ImConst.SEPARATOR
-								+ user.getExtras().getString("departmentId") + ImConst.SEPARATOR
-								+ VisitTypeEnum.SERVICEACCOUNT.getKey() ;
-						jedisTemplate.hashDel(serviceAccountContainerKey,userIdArray);
-						//判断 客服是否具有查看当前部门下 全部客服通话的权限 如果有移除
-						if( Boolean.valueOf(user.getExtras().getString("hasViewAllServiceAccount")) ){
-							String adminContainerKey = user.getExtras().getString("companyId")
-									+ ImConst.SEPARATOR + user.getExtras().getString("departmentId")
-									+ ImConst.SEPARATOR +  ImConst.ADMIN ;
-							jedisTemplate.listRemove(adminContainerKey,0,user.getId());
-						}
-						List<ChatGroup> chatGroups = ChatGroup.dao.find(this.createSelectGroupSql(user));
-						if( CollectionUtils.isNotEmpty(chatGroups) ){
-							for (ChatGroup chatGroup : chatGroups) {
-								//客服是否是离线状态 1: 是 0: 否
-								chatGroup.set("service_account_type", ServiceAccountOfflineTypeEnum.OFF_LINE.getKey()).update();
-							}
-						}
-					}
-					if( VisitTypeEnum.VISITOR.getKey().equals(visitType) ){
-						//修改 sw_visitor_department_middle 表中的 online状态; '用户状态 1:已下线 0:在线'
-						VisitorDepartmentMiddle.dao.findById(user.getId()).set("online",1).update();
-					}
-					jedisTemplate.hashDel(CURRENT_SYSTEM_ALL_USER_ID,userIdArray);
-				}
+				disposeUserData(client.getUser());
 			}
 			ImAio.remove(channelContext, "收到关闭请求");
 		}else{
 			String userId = closeReqBody.getUserid();
-			User user = ImAio.getUser(userId);
-			//访问类型 (SERVICEACCOUNT 客服 / CUSTOMER 客户 / VISITOR 游客)
+			disposeUserData(ImAio.getUser(userId));
+			ImAio.remove(userId, "收到关闭请求!");
+		}
+		return ImKit.ConvertRespPacket(new RespBody(Command.COMMAND_CLOSE_REQ, ImStatus.C10021), channelContext);
+	}
+
+	/**
+	 * 处理用户离线后的数据操作
+	 * @param user
+	 * @return {@link }
+	 * @author Darren
+	 * @date 2020/2/16 10:52
+	 */
+	private void disposeUserData(User user){
+		if( null != user ){
 			String visitType = user.getVisitType();
-			String[] userIdArray = {userId};
+			String[] userIdArray = {user.getId()};
 			if( VisitTypeEnum.SERVICEACCOUNT.getKey().equals(visitType) ){
 				//移除客服容器中的 客服
 				String serviceAccountContainerKey
@@ -104,12 +86,12 @@ public class CloseReqHandler extends AbstractCmdHandler
 						+ user.getExtras().getString("departmentId") + ImConst.SEPARATOR
 						+ VisitTypeEnum.SERVICEACCOUNT.getKey() ;
 				jedisTemplate.hashDel(serviceAccountContainerKey,userIdArray);
-				//判断 客服是否具有查看当前部门下 全部客服通话的权限
+				//判断 客服是否具有查看当前部门下 全部客服通话的权限 如果有移除
 				if( Boolean.valueOf(user.getExtras().getString("hasViewAllServiceAccount")) ){
 					String adminContainerKey = user.getExtras().getString("companyId")
 							+ ImConst.SEPARATOR + user.getExtras().getString("departmentId")
 							+ ImConst.SEPARATOR +  ImConst.ADMIN ;
-					jedisTemplate.listRemove(adminContainerKey,0,userId);
+					jedisTemplate.listRemove(adminContainerKey,0,user.getId());
 				}
 				List<ChatGroup> chatGroups = ChatGroup.dao.find(this.createSelectGroupSql(user));
 				if( CollectionUtils.isNotEmpty(chatGroups) ){
@@ -124,9 +106,7 @@ public class CloseReqHandler extends AbstractCmdHandler
 				VisitorDepartmentMiddle.dao.findById(user.getId()).set("online",1).update();
 			}
 			jedisTemplate.hashDel(CURRENT_SYSTEM_ALL_USER_ID,userIdArray);
-			ImAio.remove(userId, "收到关闭请求!");
 		}
-		return ImKit.ConvertRespPacket(new RespBody(Command.COMMAND_CLOSE_REQ, ImStatus.C10021), channelContext);
 	}
 
 	private String createSelectGroupSql(User user){

+ 12 - 0
jim-server/src/main/java/org/jim/server/helper/redis/RedisImBindListener.java

@@ -2,6 +2,7 @@ package org.jim.server.helper.redis;
 
 import org.apache.commons.lang3.StringUtils;
 import org.jim.common.ImConfig;
+import org.jim.common.ImConst;
 import org.jim.common.ImSessionContext;
 import org.jim.common.cache.redis.RedisCache;
 import org.jim.common.cache.redis.RedisCacheManager;
@@ -24,6 +25,8 @@ public class RedisImBindListener extends AbstractImBindListener{
 	private RedisCache groupCache = null;
 	private RedisCache userCache = null;
 	private final String SUBFIX = ":";
+	//设置key的过期时间 30分钟
+	private static final int TIME_OUT = 30 * 60;
 	
 	public RedisImBindListener(){
 		this(null);
@@ -106,6 +109,7 @@ public class RedisImBindListener extends AbstractImBindListener{
 		if(!users.contains(userId)){
 			groupCache.listPushTail(group_user_key, userId);
 		}
+		groupCache.expire(group_user_key,TIME_OUT);
 		initUserGroups(userId, groupId);
 		
 		ImSessionContext imSessionContext = (ImSessionContext)channelContext.getAttribute();
@@ -124,6 +128,7 @@ public class RedisImBindListener extends AbstractImBindListener{
 		for(Group group : groups){
 			if(groupId.equals(group.getGroup_id())){
 				groupCache.put(groupId+SUBFIX+INFO, group);
+				groupCache.expire(groupId+SUBFIX+INFO,TIME_OUT);
 				break;
 			}
 		}
@@ -144,6 +149,7 @@ public class RedisImBindListener extends AbstractImBindListener{
 		if(!groups.contains(group)){
 			userCache.listPushTail(userid+SUBFIX+GROUP, group);
 		}
+		userCache.expire(userid+SUBFIX+GROUP,TIME_OUT);
 	}
 	/**
 	 * 初始化用户终端协议类型;
@@ -161,6 +167,9 @@ public class RedisImBindListener extends AbstractImBindListener{
 			return;
 		}
 		userCache.put(userId+SUBFIX+TERMINAL+SUBFIX+terminal, status);
+		if( ImConst.ONLINE.equals(status) ){
+			userCache.expire(userId+SUBFIX+TERMINAL+SUBFIX+terminal,TIME_OUT);
+		}
 	}
 	/**
 	 * 初始化用户终端协议类型;
@@ -174,11 +183,14 @@ public class RedisImBindListener extends AbstractImBindListener{
 		if(StringUtils.isEmpty(userId)) {
 			return;
 		}
+		//复制用户信息不包括friends、groups下的users信息;
 		User userCopy = ImKit.copyUserWithoutFriendsGroups(user);
 		userCache.put(userId+SUBFIX+INFO, userCopy);
+		userCache.expire(userId+SUBFIX+INFO,TIME_OUT);
 		List<Group> friends = user.getFriends();
 		if(friends != null){
 			userCache.put(userId+SUBFIX+FRIENDS, (Serializable) friends);
+			userCache.expire(userId+SUBFIX+FRIENDS,TIME_OUT);
 		}
 	}
 	/**