refactor: 增加一个清理后台session的定时任务
This commit is contained in:
parent
d5adce88da
commit
3078c53c17
|
@ -0,0 +1,68 @@
|
||||||
|
package io.metersphere.job.schedule;
|
||||||
|
|
||||||
|
import com.fit2cloud.quartz.anno.QuartzScheduled;
|
||||||
|
import io.metersphere.commons.utils.JSON;
|
||||||
|
import io.metersphere.commons.utils.LogUtil;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.commons.lang3.reflect.MethodUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.data.redis.core.Cursor;
|
||||||
|
import org.springframework.data.redis.core.ScanOptions;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class CleanSessionJob {
|
||||||
|
@Resource
|
||||||
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
@Resource
|
||||||
|
private RedisIndexedSessionRepository redisIndexedSessionRepository;
|
||||||
|
|
||||||
|
@Value("${spring.session.timeout:43200s}")
|
||||||
|
private Duration timeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理没有绑定user的session
|
||||||
|
* redisson 有时会把ttl设置成-1 https://github.com/redisson/redisson/issues/4200
|
||||||
|
*/
|
||||||
|
@QuartzScheduled(cron = "0 2 0 * * ?")
|
||||||
|
public void cleanSession() {
|
||||||
|
Map<String, Long> userCount = new HashMap<>();
|
||||||
|
ScanOptions options = ScanOptions.scanOptions().match("spring:session:sessions:*").count(1000).build();
|
||||||
|
try (
|
||||||
|
Cursor<String> scan = stringRedisTemplate.scan(options)
|
||||||
|
) {
|
||||||
|
while (scan.hasNext()) {
|
||||||
|
String key = scan.next();
|
||||||
|
if (StringUtils.contains(key, "spring:session:sessions:expires:")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Boolean exists = stringRedisTemplate.opsForHash().hasKey(key, "sessionAttr:user");
|
||||||
|
if (!exists) {
|
||||||
|
stringRedisTemplate.delete(key);
|
||||||
|
} else {
|
||||||
|
Object user = redisIndexedSessionRepository.getSessionRedisOperations().opsForHash().get(key, "sessionAttr:user");
|
||||||
|
Long expire = redisIndexedSessionRepository.getSessionRedisOperations().getExpire(key);
|
||||||
|
String userId = (String) MethodUtils.invokeMethod(user, "getId");
|
||||||
|
Long count = userCount.getOrDefault(userId, 0L);
|
||||||
|
count++;
|
||||||
|
userCount.put(userId, count);
|
||||||
|
LogUtil.info(key + " : " + userId + " 过期时间: " + expire);
|
||||||
|
if (expire != null && expire.intValue() == -1) {
|
||||||
|
redisIndexedSessionRepository.getSessionRedisOperations().expire(key, timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogUtil.info(JSON.toJSONString(userCount));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtil.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue