package org.nutz.weixin.at.impl; import java.util.HashMap; import java.util.Map; import org.nutz.json.Json; import org.nutz.json.JsonFormat; import org.nutz.lang.Lang; import org.nutz.log.Log; import org.nutz.log.Logs; import org.nutz.weixin.at.WxAccessToken; import org.nutz.weixin.spi.WxAccessTokenStore; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * 中央缓存access_token * 底层为redis的实现 需要引入jedis客户端支持 * 参考IOC配置: * customerRedisTokenStore : { * type : "org.nutz.weixin.at.impl.RedisTokenStore", * fields : { * tokenKey : 'customer_token', * jedisPool : { * refer : 'jedisPool' * } * } * }, * jedisPool : { * type : "redis.clients.jedis.JedisPool", * args : [{refer : 'poolConfig'}, '127.0.0.1', 6379] * } * }, * poolConfig : { * type : "org.apache.commons.pool2.impl.GenericObjectPoolConfig", * fields : { * testWhileIdle : false, * maxTotal : 200, * maxIdle : 10, * maxWaitMillis : 10000, * testOnBorrow : true, * testOnReturn : true * } * } * * @author JiangKun * @date 2016年12月14日 下午5:04:08 */ public class RedisAccessTokenStore implements WxAccessTokenStore { private static final Log log = Logs.get(); private String tokenKey; private JedisPool jedisPool; public JedisPool getJedisPool() { return jedisPool; } public void setJedisPool(JedisPool jedisPool) { this.jedisPool = jedisPool; } public String getTokenKey() { return tokenKey; } public void setTokenKey(String tokenKey) { this.tokenKey = tokenKey; } @Override public WxAccessToken get() { Jedis jedis = null; try { jedis = jedisPool.getResource(); if (tokenKey == null) { throw new RuntimeException("Redis token key should not be null!"); } Map<String, String> hash = jedis.hgetAll(tokenKey); if (Lang.isEmpty(hash)) { log.warnf("could not find a valid token in redis with key [%s]", tokenKey); return null; } WxAccessToken at = new WxAccessToken();//从redis中拿出3个值组装成WxAccessToken返回 at.setToken(hash.get("token")); at.setLastCacheTimeMillis(Long.valueOf(hash.get("lastCacheMillis"))); at.setExpires(Integer.valueOf(hash.get("expires"))); log.debugf("wx access_token fetched from redis with the key [%s] : \n %s", tokenKey, Json.toJson(at, JsonFormat.nice())); return at; } catch (Exception e) { e.printStackTrace(); } finally { //jedisPool.returnResource(jedis); //这是老版本归还连接的方法 已经deprecated jedis.close();//2.9.0的方法直接close } return null; } @Override public void save(String token, int expires, long lastCacheTimeMillis) { Jedis jedis = null; try { jedis = jedisPool.getResource(); if (tokenKey == null) { throw new RuntimeException("Redis access_token key should not be null!"); } Map<String, String> hash = new HashMap<String, String>(); hash.put("token", token);//存入token值 hash.put("lastCacheMillis", String.valueOf(lastCacheTimeMillis));//存入设置的过期时间 hash.put("expires", String.valueOf(expires));//存入当前缓存时间 String result = jedis.hmset(tokenKey, hash); log.infof("A new wx access_token was generated and stored to redis with the key [%s] , redis return code : %s", tokenKey, result); } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); } } }