Spring 定时任务(精)(session工具类(配置失效时间),cookie工具类 web工程(初始化容器) redis工具类)
来源:互联网 发布:禁止软件开机启动 编辑:程序博客网 时间:2024/06/03 23:41
工作中的bean:
public class SystemSessionsScheduler { //log private Logger logger = LoggerFactory.getLogger(getClass()); /** * 功能描述: 本地定时任务 定时清理过时的用户session 信息<br> * 〈功能详细描述〉 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void removeOvertimeSessionInfo() { long start = System.currentTimeMillis(); logger.info("start excute task : removeOvertimeSessionInfo() "); try { //临时存放过时的session信息 List<String> temp = new ArrayList<String>(); for (Map.Entry<String, Object> element : StaticContainer.getSystemSessions().entrySet()) { if (RedisUtils.getInstance().get(AuthUtil.SESS_PREFIX + element.getKey()) == null) { temp.add(element.getKey()); } } for (String key : temp) { StaticContainer.getSystemSessions().remove(key); } temp.clear(); } catch (Exception e) { logger.error("task removeOvertimeSessionInfo() error:", ExceptionUtils.getStackTrace(e)); } logger.info("end excute removeOvertimeSessionInfo use [" + (System.currentTimeMillis() - start) + "]"); }}
spring-scheduler.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ss="http://www.springframework.org/schema/security"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 线程执行器配置,用于任务注册 --><bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><property name="corePoolSize" value="5" /><property name="maxPoolSize" value="20" /><property name="queueCapacity" value="500" /></bean><!-- 启动触发器的配置开始 --><bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="sessionsJobTrigger" /></list></property></bean><bean id="sessionsJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail"><ref bean="sessionsJobDetail" /></property><property name="cronExpression"><!--每30分钟执行一次调度任务 --><value>0 */30 * * * ?</value></property></bean><bean id="sessionsJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="sessionsJob" /></property><property name="targetMethod"><value>removeOvertimeSessionInfo</value></property></bean><!-- 工作的bean --><bean id="sessionsJob" class="counting.corn.job.session.SystemSessionsScheduler" /></beans>
/** * 验证帮助类 * */public class AuthUtil { //Cookie标识 public final static String COOKIEID = "_passengerFlow_sessionId"; //Session前缀 public final static String SESS_PREFIX = "pfcSess:"; /** * 获取Session中的登录用户 * * @param request 请求 * @return 登录用户信息 */ public static UserLoginInfoVO getSessionUserAuth(HttpServletRequest request) { String cookieValue = CookieUtil.getCookieValue(request, COOKIEID); if (null == cookieValue) return null; else return (UserLoginInfoVO) StaticContainer.getSystemSessions().get(cookieValue); } /** * 功能描述: 如果登录的时候 没有 cookie信息 登录时重新生成cookie信息 然后将其插入到本地缓存sessions中<br> * 〈功能详细描述〉 * * @param cookieValue Cookie值 * @param userEntity 用户实体 * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static void setSessionAccountAuth(String cookieValue, UserLoginInfoVO userEntity) { StaticContainer.getSystemSessions().put(cookieValue, userEntity); return; } /** * 保存Session验证信息 * * @param request 请求 * @param userEntity 用户实体 */ public static void setSessionAccountAuth(HttpServletRequest request, UserLoginInfoVO userEntity) { StaticContainer.getSystemSessions().put(CookieUtil.getCookieValue(request, COOKIEID), userEntity); return; } /** * 移除Session中的验证用户 * * @param request 请求 */ public static void removeSessionUserAuth(HttpServletRequest request) { StaticContainer.getSystemSessions().remove(CookieUtil.getCookieValue(request, COOKIEID)); return; } /** * 获取Session中的超时时间,即web.xml中的session-timeout元素 * * @param request 请求 * @return 时间(分钟) */ public static int getMaxInactiveInterval(HttpServletRequest request) { int times = request.getSession().getMaxInactiveInterval(); if (times == 0) { times = 1800; } return times; }}
/** * Cookie帮助类 * */public class CookieUtil { //log private static final Logger logger = LoggerFactory.getLogger(CookieUtil.class); /** * 获取Cookie中指定用户值 * * @param request 请求 * @param name 用户 * @return cookie值 */ public static String getCookieValue(HttpServletRequest request, String name) { Cookie cookie = getCookie(request, name); if (cookie != null) { return cookie.getValue(); } else { return null; } } /** * 获取Cookie * * @param request 请求 * @param name 用户 * @return cookie */ public static Cookie getCookie(HttpServletRequest request, String name) { return WebUtils.getCookie(request, name); } /** * 设置Cookie * * @param request 请求 * @param response 响应 * @param name 用户 * @param value 值 * @param maxAge 最大时效 */ public static void setCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, int maxAge) { try { //用户访问的域名 String doMain = request.getServerName(); setCookie(response, name, value, doMain, maxAge); } catch (Exception e) { logger.error("error:", e); } } /** * 设置Cookie * * @param response 响应 * @param name 用户 * @param value 值 * @param doMain 域 * @param maxAge 最大时效 */ public static void setCookie(HttpServletResponse response, String name, String value, String doMain, int maxAge) { if (value == null) { value = ""; } Cookie cookie = new Cookie(name, value); cookie.setMaxAge(maxAge); if (StringUtils.isNotEmpty(doMain) && !"localhost".equals(doMain)) { cookie.setDomain(doMain); } cookie.setPath("/"); response.addCookie(cookie); } /** * 功能描述: 动态生成一个32位的cookie value<br> * 〈功能详细描述〉 * * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static String getUuid32() { UUID uuid = UUID.randomUUID(); String cookieValue = uuid.toString().replaceAll("-", ""); logger.info("new cookie from uuid:" + cookieValue); return cookieValue; }}
/** * 初始化容器类<br> * 〈功能详细描述〉 * * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */public class StaticContainer { /** * 用户session资源存放 */ protected static final ConcurrentMap<String, Object> systemSessions = new ConcurrentHashMap<String, Object>(); public static ConcurrentMap<String, Object> getSystemSessions() { return systemSessions; }}
redis工具类:
** * Redis操作工具类 * */public final class RedisUtils { //log private static final Logger logger = LoggerFactory.getLogger(RedisUtils.class); //pptv 超时时间 5s public static final int PPTV_LOCK_EXPIRE_TIME=5000; protected static ShardedJedisClientImpl shardedClient; private static RedisUtils redis = null; /** * 功能描述: <br> * 〈获取实例〉 * * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public static synchronized RedisUtils getInstance() { if (redis == null) { shardedClient = new ShardedJedisClientImpl("redis.conf"); redis = new RedisUtils(); } return redis; } /** * 返回key所关联的序列化对象。如果key不存在则返回null。 </br>时间复杂度O(1) * * @param key * @return */ public String get(final String key) { return shardedClient.execute(new ShardedJedisAction<String>() { @Override public String doAction(ShardedJedis shardedJedis) { return shardedJedis.get(key); } }); } /** * 功能描述: <br> * 返回hash * * @param key * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public Map<String, String> hgetAll(final String key) { return shardedClient.execute(new ShardedJedisAction<Map<String, String>>() { @Override public Map<String, String> doAction(ShardedJedis shardedJedis) { return shardedJedis.hgetAll(key); } }); } /** * 获取Redis Key值对应的值类型 * * @param key key * @return 值类型 */ public String getType(final String key) { return shardedClient.execute(new ShardedJedisAction<String>() { @Override public String doAction(ShardedJedis shardedJedis) { return shardedJedis.type(key); } }); } //将序列化对象值value关联到key, 如果key已经持有其他值,SET就覆写旧值,无视类型 时间复杂度O(1) public String set(final String key, final String value,final int expireTime) { return shardedClient.execute(new ShardedJedisAction<String>() { @Override public String doAction(ShardedJedis shardedJedis) { String result = shardedJedis.set(key, value); shardedJedis.expire(key, expireTime); return result; } }); } /** * 移除给定的key。如果key不存在,则忽略该命令。 <\br>时间复杂度O(1) * * @param key * @return */ public Long del(final String key) { return shardedClient.execute(new ShardedJedisAction<Long>() { @Override public Long doAction(ShardedJedis shardedJedis) { return shardedJedis.del(key); } }); } /** * 为给定key设置生存时间,当key过期时,它会被自动删除<\br> 时间复杂度O(1) * * @param key * @param seconds 秒 * @return 1:成功; 0:key不存在或不能为key设置生存时间时 */ public static Long expire(final String key, final int seconds) { return shardedClient.execute(new ShardedJedisAction<Long>() { @Override public Long doAction(ShardedJedis shardedJedis) { return shardedJedis.expire(key, seconds); } }); } /** * TTL命令用于获取键到期的剩余时间(毫秒) * 以毫秒为单位的整数值TTL或负值 * TTL以毫秒为单位。 * -1, 如果key没有到期超时。 * -2, 如果键不存在。 * * @param key * @return */ public Long ttl(final String key) { return shardedClient.execute(new ShardedJedisAction<Long>() { @Override public Long doAction(ShardedJedis shardedJedis) { return shardedJedis.ttl(key); } }); } /** * 打印Redis分片信息 * @return 分片信息 */ public String info() { return shardedClient.execute(new ShardedJedisAction<String>() { @Override public String doAction(ShardedJedis shardedJedis) { StringBuffer info = new StringBuffer(""); Collection<Jedis> shards = shardedJedis.getAllShards(); for (Jedis shard : shards) { info.append(shard.info()); } return info.toString(); } }); } /** * 设置指定的字符串值,并返回其旧值 * @param key * @param value * @return oldValue */ public String getSet(final String key,final String value){ return shardedClient.execute( new ShardedJedisAction<String>() { @Override public String doAction(ShardedJedis shardedJedis) { return shardedJedis.getSet(key, value); } }); } /** * 判断是否获取锁 * @param key KEY * @param timeout 超时时间 * @return 是否获取锁 */ public boolean isGetLock(final String key, final long timeout){ return shardedClient.execute(new ShardedJedisAction<Boolean>() { @Override public Boolean doAction(ShardedJedis shardedJedis) { long expireTimeValue=System.currentTimeMillis();//当前时间 String expireTimeStr=String.valueOf(expireTimeValue); do { Long setnx = shardedJedis.setnx(key, expireTimeStr);//当前时间戳作为value if (setnx == 1) { //获取锁 //设置锁的超时时间 expire(key, PPTV_LOCK_EXPIRE_TIME); logger.debug("get lock, key: " + key + " , expire in " + PPTV_LOCK_EXPIRE_TIME + " seconds."); return true; } else { // 锁被占用 String value = get(key);//获取redis中的时间戳 //判断锁是否超时 if(value !=null && (System.currentTimeMillis()-Long.parseLong(value) )>timeout){ String oldValue=getSet(key,expireTimeStr); //如果拿到的oldValue依然是超时的,说明已经拿到锁了 if(oldValue !=null && (System.currentTimeMillis()-Long.parseLong(oldValue) )>timeout){ return true; } } } if (timeout == 0) { //取不到锁时,不等待,直接返回 break; } try { Thread.sleep(500); } catch (InterruptedException e) { logger.error(e.getMessage()); } }while((System.currentTimeMillis()-expireTimeValue)<timeout); return false; } }); } /** * 释放锁 */ public Long unlock(final String key){ logger.debug("release lock, keys :" + key); return del(key); } /** * 从队列的头部(左边)弹出元素 * * @param key * @return */ public static String lpop(final String key){ return shardedClient.execute( new ShardedJedisAction<String>() { @Override public String doAction(ShardedJedis shardedJedis) { return shardedJedis.lpop(key); } }); } /** * 返回列表的长度 * * @param key * @return */ public static Long llen(final String key){ return shardedClient.execute(new ShardedJedisAction<Long>() { @Override public Long doAction(ShardedJedis shardedJedis) { return shardedJedis.llen(key); } }); } /** * 向队列的尾部(右边)加入元素 * * @param key * @param value * @return */ public static Long rpush(final String key, final String value){ return shardedClient.execute( new ShardedJedisAction<Long>() { @Override public Long doAction(ShardedJedis shardedJedis) { return shardedJedis.rpush(key, value); } }); }}ShardedJedisClientImpl :
public class ShardedJedisClientImpl extends AbstractClient implements ShardedJedisClient { private static final Logger logger = LoggerFactory.getLogger(ShardedJedisClientImpl.class); public ShardedJedisClientImpl(String configFile) { super(configFile); } public ShardedJedisClientImpl(String configPath, boolean globalConfig) { super(configPath, globalConfig); } public void destroy() { super.destroy(); } public <T> T execute(ShardedJedisAction<T> action) { try { T result = this.executeAction(action); return result; } catch (Exception var4) { throw new RedisClientException(var4); } } private <T> T executeAction(ShardedJedisAction<T> action) { SmartShardedJedisPool pool = this.getSmartShardedJedisPool(); ShardedJedis shardedJedis = null; Object var4; try { shardedJedis = (ShardedJedis)pool.getResource(); var4 = action.doAction(shardedJedis); } catch (JedisConnectionException var15) { if(shardedJedis != null) { try { pool.returnBrokenResource(shardedJedis); } catch (Exception var14) { logger.warn("Can not return broken resource.", var14); } shardedJedis = null; } throw var15; } finally { if(shardedJedis != null) { try { pool.returnResource(shardedJedis); } catch (Exception var13) { logger.warn("Can not return resource.", var13); } } } return var4; }}
public abstract class AbstractClient { private static final Map<String, SmartShardedJedisPool> smartShardedJedisPools = new ConcurrentHashMap(); private static final Object MUX = new Object(); private static final String GLOBAL_WARNING_CONFIG_PATH = "/monitor.warning.service"; private static SCMNode globalWarnConfigNode; private SCMNode redisConfigNode; private String configPath; private final SCMListener redisConfigListener; protected AbstractClient(String configPath) { this(configPath, false); } protected AbstractClient(String configPath, boolean globalConfig) { this.redisConfigListener = new SCMListener() { public void execute(String oldValue, String newValue) { if(newValue != null && !"".equals(newValue.trim())) { SmartShardedJedisPool shardedJedisPoolx; if(AbstractClient.this.notEqual(AbstractClient.XMLParser.parseSentinels(oldValue), AbstractClient.XMLParser.parseSentinels(newValue))
|| AbstractClient.this.notEqual(AbstractClient.XMLParser.parseMasters(oldValue), AbstractClient.XMLParser.parseMasters(newValue))
|| AbstractClient.this.notEqual(AbstractClient.XMLParser.parse(oldValue, "timeOut"), AbstractClient.XMLParser.parse(newValue, "timeOut"))
|| AbstractClient.this.notEqual(AbstractClient.XMLParser.parse(oldValue, "dbIndex"), AbstractClient.XMLParser.parse(newValue, "dbIndex"))) { synchronized(AbstractClient.MUX) { shardedJedisPoolx = AbstractClient.XMLParser.parse(AbstractClient.this.redisConfigNode.getValue(),
(WarningService)AbstractClient.this.makeWarningService()); SmartShardedJedisPool oldPool = (SmartShardedJedisPool)AbstractClient.smartShardedJedisPools.put(AbstractClient.this.configPath, shardedJedisPoolx); if(oldPool != null) { try { Thread.sleep(5000L); } catch (Exception var8) { ; } oldPool.destroy(); } } } if(AbstractClient.this.notEqual(AbstractClient.XMLParser.poolConfig(oldValue, "maxIdle"),
AbstractClient.XMLParser.poolConfig(newValue, "maxIdle"))) { PoolStatusUtil.setMaxIdle(AbstractClient.this.getSmartShardedJedisPool(),
AbstractClient.XMLParser.poolConfig(AbstractClient.this.redisConfigNode.getValue(), "maxIdle")); } if(AbstractClient.this.notEqual(AbstractClient.XMLParser.poolConfig(oldValue, "minIdle"), AbstractClient.XMLParser.poolConfig(newValue, "minIdle"))) { PoolStatusUtil.setMinIdle(AbstractClient.this.getSmartShardedJedisPool(),
AbstractClient.XMLParser.poolConfig(AbstractClient.this.redisConfigNode.getValue(), "minIdle")); } SmartShardedJedisPool shardedJedisPool; if(AbstractClient.this.notEqual(AbstractClient.XMLParser.parse(oldValue, "phones"), AbstractClient.XMLParser.parse(newValue, "phones"))) { shardedJedisPool = AbstractClient.this.getSmartShardedJedisPool(); if(shardedJedisPool != null) { shardedJedisPool.setWarningService(AbstractClient.this.makeWarningService()); } } if(AbstractClient.this.notEqual(AbstractClient.XMLParser.forceMasterKeys(oldValue),
AbstractClient.XMLParser.forceMasterKeys(newValue)) || AbstractClient.this.notEqual(AbstractClient.XMLParser.parse(oldValue, "forceMaster"),
AbstractClient.XMLParser.parse(newValue, "forceMaster"))) { shardedJedisPool = AbstractClient.this.getSmartShardedJedisPool(); if(shardedJedisPool != null) { shardedJedisPool.setRwPolicy(AbstractClient.XMLParser.parseRwPolicy(AbstractClient.this.redisConfigNode.getValue())); } } if(AbstractClient.this.notEqual(AbstractClient.XMLParser.parse(oldValue, "execTimeThreshold"),
AbstractClient.XMLParser.parse(newValue, "execTimeThreshold"))) { String execTimeThreshold = AbstractClient.XMLParser.parse(AbstractClient.this.redisConfigNode.getValue(), "execTimeThreshold"); if(null == execTimeThreshold || "".equals(execTimeThreshold.trim())) { execTimeThreshold = "20"; } shardedJedisPoolx = AbstractClient.this.getSmartShardedJedisPool(); if(shardedJedisPoolx != null) { shardedJedisPoolx.setExecTimeThreshold(Long.valueOf(execTimeThreshold)); } } } } }; this.configPath = globalConfig?"GLOBAL." + configPath:"PROJECT." + configPath; if(!smartShardedJedisPools.containsKey(this.configPath)) { Object var3 = MUX; synchronized(MUX) { if(!smartShardedJedisPools.containsKey(this.configPath)) { VersionStatistics.reportVersion(AbstractClient.class); SCMClient scmClient = SCMClientImpl.getInstance(); globalWarnConfigNode = scmClient.getGlobalConfig("/monitor.warning.service"); globalWarnConfigNode.sync(); if(globalConfig) { this.redisConfigNode = scmClient.getGlobalConfig(configPath); this.redisConfigNode.sync(); } else { this.redisConfigNode = scmClient.getConfig(configPath); this.redisConfigNode.sync(); } String redisConfig = this.redisConfigNode.getValue(); if(redisConfig != null && !"".equals(redisConfig.trim())) { String globalWarnConfig = globalWarnConfigNode.getValue(); if(globalWarnConfig != null && !"".equals(globalWarnConfig.trim())) { SmartShardedJedisPool pool = AbstractClient.XMLParser.parse(this.redisConfigNode.getValue(),
(WarningService)this.makeWarningService()); smartShardedJedisPools.put(this.configPath, pool); globalWarnConfigNode.monitor(new SCMListener() { public void execute(String oldValue, String newValue) { SmartShardedJedisPool shardedJedisPool = AbstractClient.this.getSmartShardedJedisPool(); if(shardedJedisPool != null) { shardedJedisPool.setWarningService(AbstractClient.this.makeWarningService()); } } }); this.redisConfigNode.monitor(this.redisConfigListener); return; } throw new RedisClientException("can't find warningService config or config is empty."); } throw new RedisClientException("can't find redis config or config content is empty."); } } } } private boolean notEqual(Set<String> setA, Set<String> setB) { List<String> listA = new ArrayList(setA); List<String> listB = new ArrayList(setB); return this.notEqual((List)listA, (List)listB); } private boolean notEqual(List<String> listA, List<String> listB) { Collections.sort(listA, new Comparator<String>() { public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); } }); Collections.sort(listB, new Comparator<String>() { public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); } }); StringBuilder strA = new StringBuilder(); Iterator i$ = listA.iterator(); while(i$.hasNext()) { String s = (String)i$.next(); strA.append(s.trim()); } StringBuilder strB = new StringBuilder(); Iterator i$ = listB.iterator(); while(i$.hasNext()) { String s = (String)i$.next(); strB.append(s.trim()); } return this.notEqual(strA.toString(), strB.toString()); } private boolean notEqual(String strA, String strB) { return strA != null && strB != null && !strA.trim().equalsIgnoreCase(strB.trim()); } public SmartShardedJedisPool getSmartShardedJedisPool() { return (SmartShardedJedisPool)smartShardedJedisPools.get(this.configPath); } public void setMasterChangedListener(MasterChangedListener masterChangedListener) { this.getSmartShardedJedisPool().setMasterChangedListener(masterChangedListener); } protected void destroy() { Object var1 = MUX; synchronized(MUX) { SmartShardedJedisPool pool = this.getSmartShardedJedisPool(); if(pool != null) { pool.destroy(); } smartShardedJedisPools.remove(this.configPath); } } protected SNWarningService makeWarningService() { Properties properties = new Properties(); StringReader reader = new StringReader(globalWarnConfigNode.getValue()); try { properties.load(reader); } catch (IOException var11) { throw new RedisClientException("load warning config error"); } String appCode = SCMClientImpl.getInstance().getAppCode(); String url = (String)properties.get("monitor.service.server"); String globalPhones = (String)properties.get("sedis.warning.phones"); String phones = AbstractClient.XMLParser.parse(this.redisConfigNode.getValue(), "phones"); Set<String> phonesSet = new HashSet(); phonesSet.addAll(Arrays.asList(globalPhones.split("\\,"))); phonesSet.addAll(Arrays.asList(phones.split("\\,"))); StringBuilder allPhones = new StringBuilder(); Iterator i$ = phonesSet.iterator(); while(i$.hasNext()) { String str = (String)i$.next(); allPhones.append(","); allPhones.append(str); } allPhones.delete(0, 1); return new SNWarningService(appCode, url, allPhones.toString()); } public String getPoolStatus() { return PoolStatusUtil.getPoolStatus(this.getSmartShardedJedisPool()); } private static class XMLParser { private static Logger logger = LoggerFactory.getLogger(AbstractClient.XMLParser.class); private static XPath path; private static Document doc; private XMLParser() { } private static String getString(Object node, String expression) throws XPathExpressionException { return (String)path.evaluate(expression, node, XPathConstants.STRING); } private static NodeList getList(Object node, String expression) throws XPathExpressionException { return (NodeList)path.evaluate(expression, node, XPathConstants.NODESET); } private static Node getNode(Object node, String expression) throws XPathExpressionException { return (Node)path.evaluate(expression, node, XPathConstants.NODE); } public static String parse(String redisConfig, String key) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { return getString(rootN, key); } } catch (Exception var6) { throw new RedisClientException("Fail to parse redis configure file.", var6); } } public static String poolConfig(String redisConfig, String field) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { Node poolConfigNode = getNode(rootN, "poolConfig"); return getString(poolConfigNode, field); } } catch (Exception var7) { throw new RedisClientException("Fail to parse redis configure file.", var7); } } public static Set<String> parseSentinels(String redisConfig) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { Node sentinelNode = getNode(rootN, "sentinels"); Set<String> sentinels = new HashSet(); NodeList sentinelConfigs = getList(sentinelNode, "sentinel"); for(int i = 0; i < sentinelConfigs.getLength(); ++i) { Node sentinelConfig = sentinelConfigs.item(i); String ip = getString(sentinelConfig, "ip"); String port = getString(sentinelConfig, "port"); sentinels.add(ip + ":" + port); } return sentinels; } } catch (Exception var12) { throw new RedisClientException("Fail to parse redis configure file.", var12); } } public static List<String> parseMasters(String redisConfig) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { List<String> masters = new ArrayList(); Node mastersNode = getNode(rootN, "shards"); if(mastersNode != null) { NodeList masterNodes = getList(mastersNode, "shardName"); for(int i = 0; i < masterNodes.getLength(); ++i) { String master = masterNodes.item(i).getTextContent(); masters.add(master); } } return masters; } } catch (Exception var10) { throw new RedisClientException("Fail to parse redis configure file.", var10); } } public static List<String> forceMasterKeys(String redisConfig) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { List<String> forceMasterKeys = new ArrayList(); Node forceMasterKeysNode = getNode(rootN, "forceMasterkeys"); if(forceMasterKeysNode != null) { NodeList keyPatternNodes = getList(forceMasterKeysNode, "keyPattern"); for(int i = 0; i < keyPatternNodes.getLength(); ++i) { String master = keyPatternNodes.item(i).getTextContent(); forceMasterKeys.add(master); } } return forceMasterKeys; } } catch (Exception var10) { throw new RedisClientException("Fail to parse redis configure file.", var10); } } public static RwPolicy parseRwPolicy(String redisConfig) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { RwPolicy rwPolicy = null; Node forceMasterKeysNode = getNode(rootN, "forceMasterkeys"); if(forceMasterKeysNode != null) { NodeList keyPatternNodes = getList(forceMasterKeysNode, "keyPattern"); if(keyPatternNodes != null) { String[] keyPatterns = new String[keyPatternNodes.getLength()]; for(int i = 0; i < keyPatternNodes.getLength(); ++i) { String keyPattern = keyPatternNodes.item(i).getTextContent(); keyPatterns[i] = keyPattern; } rwPolicy = new SimpleRwPolicy(keyPatterns); } } if(rwPolicy == null) { String forceMaster = getString(rootN, "forceMaster"); if(null == forceMaster || "".equals(forceMaster.trim())) { forceMaster = "true"; } Boolean isForceMaster = Boolean.valueOf(forceMaster); if(isForceMaster.booleanValue()) { rwPolicy = new SimpleRwPolicy(true); } else { rwPolicy = new SimpleRwPolicy(false); } } return rwPolicy; } } catch (Exception var11) { throw new RedisClientException("Fail to parse redis configure file.", var11); } } public static SmartShardedJedisPool parse(String redisConfig, WarningService warningService) { try { StringReader reader = new StringReader(redisConfig); InputSource is = new InputSource(reader); DocumentBuilder dbd = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = dbd.parse(is); path = XPathFactory.newInstance().newXPath(); Node rootN = getNode(doc, "config"); if(null == rootN) { throw new RedisClientException("Invalid xml format, can't find <config> root node!"); } else { String timeOut = getString(rootN, "timeOut"); if(null == timeOut || "".equals(timeOut.trim())) { timeOut = "2000"; } String password = getString(rootN, "password"); if(null == password || "".equals(password.trim())) { password = null; } String dbIndex = getString(rootN, "dbIndex"); if(null == dbIndex || "".equals(dbIndex.trim())) { dbIndex = "0"; } GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); Node poolConfigNode = getNode(rootN, "poolConfig"); String numTestsPerEvictionRun; String evictionPolicyClassName; String testOnBorrow; String testOnReturn; String jmxEnabled; if(poolConfigNode != null) { poolConfig.setMaxTotal(2147483647); poolConfig.setMaxWaitMillis(200L); poolConfig.setBlockWhenExhausted(false); String maxIdle = getString(poolConfigNode, "maxIdle"); if(null != maxIdle && !"".equals(maxIdle.trim())) { poolConfig.setMaxIdle(Integer.valueOf(maxIdle).intValue()); } String minIdle = getString(poolConfigNode, "minIdle"); if(null != minIdle && !"".equals(minIdle.trim())) { poolConfig.setMinIdle(Integer.valueOf(minIdle).intValue()); } String lifo = getString(poolConfigNode, "lifo"); if(null != lifo && !"".equals(lifo.trim())) { poolConfig.setLifo(Boolean.valueOf(lifo).booleanValue()); } String minEvictableIdleTimeMillis = getString(poolConfigNode, "minEvictableIdleTimeMillis"); if(null != minEvictableIdleTimeMillis && !"".equals(minEvictableIdleTimeMillis.trim())) { poolConfig.setMinEvictableIdleTimeMillis(Long.valueOf(minEvictableIdleTimeMillis).longValue()); } else { poolConfig.setMinEvictableIdleTimeMillis(60000L); } String softMinEvictableIdleTimeMillis = getString(poolConfigNode, "softMinEvictableIdleTimeMillis"); if(null != softMinEvictableIdleTimeMillis && !"".equals(softMinEvictableIdleTimeMillis.trim())) { poolConfig.setSoftMinEvictableIdleTimeMillis(Long.valueOf(softMinEvictableIdleTimeMillis).longValue()); } numTestsPerEvictionRun = getString(poolConfigNode, "numTestsPerEvictionRun"); if(null != numTestsPerEvictionRun && !"".equals(numTestsPerEvictionRun.trim())) { poolConfig.setNumTestsPerEvictionRun(Integer.valueOf(numTestsPerEvictionRun).intValue()); } else { poolConfig.setNumTestsPerEvictionRun(-1); } evictionPolicyClassName = getString(poolConfigNode, "evictionPolicyClassName"); if(null != evictionPolicyClassName && !"".equals(evictionPolicyClassName.trim())) { poolConfig.setEvictionPolicyClassName(evictionPolicyClassName); } testOnBorrow = getString(poolConfigNode, "testOnBorrow"); if(null != testOnBorrow && !"".equals(testOnBorrow.trim())) { poolConfig.setTestOnBorrow(Boolean.valueOf(testOnBorrow).booleanValue()); } testOnReturn = getString(poolConfigNode, "testOnReturn"); if(null != testOnReturn && !"".equals(testOnReturn.trim())) { poolConfig.setTestOnReturn(Boolean.valueOf(testOnReturn).booleanValue()); } String testWhileIdle = getString(poolConfigNode, "testWhileIdle"); if(null != testWhileIdle && !"".equals(testWhileIdle.trim())) { poolConfig.setTestWhileIdle(Boolean.valueOf(testWhileIdle).booleanValue()); } else { poolConfig.setTestWhileIdle(true); } String timeBetweenEvictionRunsMillis = getString(poolConfigNode, "timeBetweenEvictionRunsMillis"); if(null != timeBetweenEvictionRunsMillis && !"".equals(timeBetweenEvictionRunsMillis.trim())) { poolConfig.setTimeBetweenEvictionRunsMillis(Long.valueOf(timeBetweenEvictionRunsMillis).longValue()); } else { poolConfig.setTimeBetweenEvictionRunsMillis(30000L); } jmxEnabled = getString(poolConfigNode, "jmxEnabled"); if(null != jmxEnabled && !"".equals(jmxEnabled.trim())) { poolConfig.setJmxEnabled(Boolean.valueOf(jmxEnabled).booleanValue()); } String jmxNamePrefix = getString(poolConfigNode, "jmxNamePrefix"); if(null != jmxNamePrefix && !"".equals(jmxNamePrefix.trim())) { poolConfig.setJmxNamePrefix(jmxNamePrefix); } } Node sentinelNode = getNode(rootN, "sentinels"); Set<String> sentinels = new HashSet(); NodeList sentinelConfigs = getList(sentinelNode, "sentinel"); if(sentinelConfigs.getLength() != 0 && sentinelConfigs.getLength() < 3) { throw new RedisClientException("Configuration error,no less than 3 sentinels"); } else { Node mastersNode; for(int i = 0; i < sentinelConfigs.getLength(); ++i) { mastersNode = sentinelConfigs.item(i); numTestsPerEvictionRun = getString(mastersNode, "ip"); evictionPolicyClassName = getString(mastersNode, "port"); if(null == numTestsPerEvictionRun || "".equals(numTestsPerEvictionRun.trim())) { throw new RedisClientException("Configuration error,sentinel host can not be null"); } if(null == evictionPolicyClassName || "".equals(evictionPolicyClassName.trim())) { evictionPolicyClassName = "26379"; } sentinels.add(numTestsPerEvictionRun + ":" + evictionPolicyClassName); } List<String> masters = new ArrayList(); mastersNode = getNode(rootN, "shards"); if(mastersNode == null) { throw new RedisClientException("Configuration error, <shards> can not be null in <shardConfig> "); } else { NodeList masterNodes = getList(mastersNode, "shardName"); if(masterNodes.getLength() == 0) { throw new RedisClientException("Configuration error, <shardName> can not be null in <shards> "); } else { for(int i = 0; i < masterNodes.getLength(); ++i) { testOnBorrow = masterNodes.item(i).getTextContent(); if(null == testOnBorrow || "".equals(testOnBorrow.trim())) { throw new RedisClientException("Configuration error,<master> can not be null in <shard>"); } masters.add(testOnBorrow); } RwPolicy rwPolicy = null; Node forceMasterKeysNode = getNode(rootN, "forceMasterkeys"); if(forceMasterKeysNode != null) { NodeList keyPatternNodes = getList(forceMasterKeysNode, "keyPattern"); if(keyPatternNodes != null) { String[] keyPatterns = new String[keyPatternNodes.getLength()]; for(int i = 0; i < keyPatternNodes.getLength(); ++i) { jmxEnabled = keyPatternNodes.item(i).getTextContent(); keyPatterns[i] = jmxEnabled; } rwPolicy = new SimpleRwPolicy(keyPatterns); } } if(rwPolicy == null) { testOnReturn = getString(rootN, "forceMaster"); if(null == testOnReturn || "".equals(testOnReturn.trim())) { testOnReturn = "true"; } Boolean isForceMaster = Boolean.valueOf(testOnReturn); if(isForceMaster.booleanValue()) { rwPolicy = new SimpleRwPolicy(true); } else { rwPolicy = new SimpleRwPolicy(false); } } testOnReturn = getString(rootN, "execTimeThreshold"); if(null == testOnReturn || "".equals(testOnReturn.trim())) { testOnReturn = "20"; } Reporter.report(); return new SmartShardedJedisPool(masters, sentinels, poolConfig, Integer.valueOf(timeOut).intValue(), password,
Integer.valueOf(dbIndex).intValue(), rwPolicy, warningService, Long.valueOf(testOnReturn)); } } } } } catch (IOException var24) { logger.error("IOException!", var24); throw new RedisClientException("IOException!", var24); } catch (Exception var25) { throw new RedisClientException("Fail to parse redis configure file.", var25); } } }}
public interface ShardedJedisClient { void destroy(); <T> T execute(ShardedJedisAction<T> var1);}
在web.xml中配置:
<session-config> <session-timeout>30</session-timeout></session-config>
阅读全文
0 0
- Spring 定时任务(精)(session工具类(配置失效时间),cookie工具类 web工程(初始化容器) redis工具类)
- Spring session 工具类
- quartz工具类实现动态配置定时任务
- 工具类:Cookie 工具类
- HibernateUtil.java 工具类(获得SESSION)
- 工具(五):日期时间操作工具类
- Python 边做边学 8.6 工具类--时间工具(TimeUtil)
- Spring(2)——Web工具类
- Spring提高篇(七):Web 相关工具类
- 主动获取spring容器工具类SpringContextUtil
- java容器类------------Collections容器工具类解析(四)
- 【Android工具】时间工具类
- cookie工具类
- JavaScript Cookie 工具类
- cookie 工具类
- Cookie工具类
- Cookie工具类
- cookie工具类
- poj1595 素数打表
- 集合
- 算法和数据结构
- Unable to load class for JSP或者有class not found 等
- leetcode#3-Longest Substring Without Repeating Characters-java
- Spring 定时任务(精)(session工具类(配置失效时间),cookie工具类 web工程(初始化容器) redis工具类)
- 日记(周中)
- Scale-Aware Face Detection
- codeforces 183d(期望概率dp)
- 构造器和this static静态
- 1024 大数运算,回文数
- 【bzoj1589】[Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
- php解析url
- 从游戏天赋到学习方法,你应该知道的