1 packagecom.xbq.redis;2
3 importjava.util.HashSet;4 importjava.util.Properties;5 importjava.util.Set;6 importjava.util.regex.Pattern;7
8 importorg.apache.commons.pool2.impl.GenericObjectPoolConfig;9 importorg.springframework.beans.factory.FactoryBean;10 importorg.springframework.beans.factory.InitializingBean;11 importorg.springframework.core.io.Resource;12
13 importredis.clients.jedis.HostAndPort;14 importredis.clients.jedis.JedisCluster;15
16 /**
17 * Jedis集群工厂18 *@authorxbq19 * @Date 2017-05-1420 */
21 public class JedisClusterFactory implements InitializingBean,FactoryBean{22
23 privateResource addressConfig;24
25 //下面变量 对应spring redis配置文件中的 property的name
26 privateJedisCluster jedisCluster;27 privateString addressKeyPrefix;28 privateInteger timeout;29 privateInteger maxRedirections;30 privateGenericObjectPoolConfig genericObjectPoolConfig;31
32 //正则表达式 匹配 ip和port
33 private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");34
35 /**
36 * 实现 InitializingBean 的接口,初始化的 得到 jedisCluster37 */
38 public void afterPropertiesSet() throwsException {39 Set jedisClusterNode= this.parseHostAndPort();40 jedisCluster = newJedisCluster(jedisClusterNode, timeout, maxRedirections, genericObjectPoolConfig);41 }42
43 /**
44 * 实现 FactoryBean 的接口45 * 获取 jedisCluster对象46 */
47 public JedisCluster getObject() throwsException {48 returnjedisCluster;49 }50
51 /**
52 * 实现 FactoryBean 的接口53 * 获取 jedisCluster的类型54 */
55 public Class extends JedisCluster>getObjectType() {56 return (jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);57 }58
59 /**
60 * 实现 FactoryBean 的接口61 */
62 public booleanisSingleton() {63 return true;64 }65
66 /**
67 * 解析Jedis配置文件,看是否满足 IP和端口68 *@return
69 */
70 private Set parseHostAndPort() throwsException{71 Set hostAndPorts = new HashSet();72 try{73 Properties properties = newProperties();74 properties.load(this.addressConfig.getInputStream());75
76 for(Object key : properties.keySet()){77 //如果key不是以 addressKeyPrefix的值 开头,则continue
78 if(!((String)key).startsWith(addressKeyPrefix)){79 continue;80 }81 //根据 key从properties中取出值
82 String valus =(String) properties.get(key);83 //判断取出的value是否是ip和port
84 boolean isIPProt =p.matcher(valus).matches();85 if(!isIPProt){86 throw new IllegalArgumentException("ip和port不合法!");87 }88 String[] ipAndPort = valus.split(":");89 HostAndPort hostAndPort = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));90 hostAndPorts.add(hostAndPort);91 }92 } catch(Exception e) {93 throw new Exception("解析 jedis 配置文件失败!");94 }95 returnhostAndPorts;96 }97
98 //set方法
99 public voidsetJedisCluster(JedisCluster jedisCluster) {100 this.jedisCluster =jedisCluster;101 }102 public voidsetAddressKeyPrefix(String addressKeyPrefix) {103 this.addressKeyPrefix =addressKeyPrefix;104 }105 public voidsetTimeout(Integer timeout) {106 this.timeout =timeout;107 }108 public voidsetMaxRedirections(Integer maxRedirections) {109 this.maxRedirections =maxRedirections;110 }111 public voidsetGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {112 this.genericObjectPoolConfig =genericObjectPoolConfig;113 }114 public voidsetAddressConfig(Resource addressConfig) {115 this.addressConfig =addressConfig;116 }117 }