11package redis .clients .jedis ;
22
33import java .net .URI ;
4- import java .util .concurrent .atomic .AtomicReference ;
54
65import javax .net .ssl .HostnameVerifier ;
76import javax .net .ssl .SSLParameters ;
1918 * PoolableObjectFactory custom impl.
2019 */
2120class JedisFactory implements PooledObjectFactory <Jedis > {
22- private final AtomicReference <HostAndPort > hostAndPort = new AtomicReference <>();
23- private final int connectionTimeout ;
24- private final int soTimeout ;
21+ private final JedisSocketFactory jedisSocketFactory ;
2522 private final String user ;
2623 private final String password ;
2724 private final int database ;
2825 private final String clientName ;
29- private final boolean ssl ;
30- private final SSLSocketFactory sslSocketFactory ;
31- private final SSLParameters sslParameters ;
32- private final HostnameVerifier hostnameVerifier ;
26+
27+ JedisFactory (final JedisSocketFactory jedisSocketFactory , final String user , final String password , final int database , final String clientName ) {
28+ this .jedisSocketFactory = jedisSocketFactory ;
29+ this .user = user ;
30+ this .password = password ;
31+ this .database = database ;
32+ this .clientName = clientName ;
33+ }
3334
3435 JedisFactory (final String host , final int port , final int connectionTimeout ,
3536 final int soTimeout , final String password , final int database , final String clientName ) {
@@ -55,17 +56,8 @@ class JedisFactory implements PooledObjectFactory<Jedis> {
5556 final int soTimeout , final String user , final String password , final int database , final String clientName ,
5657 final boolean ssl , final SSLSocketFactory sslSocketFactory , final SSLParameters sslParameters ,
5758 final HostnameVerifier hostnameVerifier ) {
58- this .hostAndPort .set (new HostAndPort (host , port ));
59- this .connectionTimeout = connectionTimeout ;
60- this .soTimeout = soTimeout ;
61- this .user = user ;
62- this .password = password ;
63- this .database = database ;
64- this .clientName = clientName ;
65- this .ssl = ssl ;
66- this .sslSocketFactory = sslSocketFactory ;
67- this .sslParameters = sslParameters ;
68- this .hostnameVerifier = hostnameVerifier ;
59+ this (new DefaultJedisSocketFactory (host , port , connectionTimeout , soTimeout , ssl ,
60+ sslSocketFactory , sslParameters , hostnameVerifier ), user , password , database , clientName );
6961 }
7062
7163 JedisFactory (final URI uri , final int connectionTimeout , final int soTimeout ,
@@ -81,21 +73,20 @@ class JedisFactory implements PooledObjectFactory<Jedis> {
8173 "Cannot open Redis connection due invalid URI. %s" , uri .toString ()));
8274 }
8375
84- this .hostAndPort .set (new HostAndPort (uri .getHost (), uri .getPort ()));
85- this .connectionTimeout = connectionTimeout ;
86- this .soTimeout = soTimeout ;
76+ this .jedisSocketFactory = new DefaultJedisSocketFactory (
77+ uri .getHost (), uri .getPort (), connectionTimeout , soTimeout ,
78+ JedisURIHelper .isRedisSSLScheme (uri ), sslSocketFactory ,
79+ sslParameters , hostnameVerifier
80+ );
8781 this .user = JedisURIHelper .getUser (uri );
8882 this .password = JedisURIHelper .getPassword (uri );
8983 this .database = JedisURIHelper .getDBIndex (uri );
9084 this .clientName = clientName ;
91- this .ssl = JedisURIHelper .isRedisSSLScheme (uri );
92- this .sslSocketFactory = sslSocketFactory ;
93- this .sslParameters = sslParameters ;
94- this .hostnameVerifier = hostnameVerifier ;
9585 }
9686
9787 public void setHostAndPort (final HostAndPort hostAndPort ) {
98- this .hostAndPort .set (hostAndPort );
88+ jedisSocketFactory .setHost (hostAndPort .getHost ());
89+ jedisSocketFactory .setPort (hostAndPort .getPort ());
9990 }
10091
10192 @ Override
@@ -123,9 +114,7 @@ public void destroyObject(PooledObject<Jedis> pooledJedis) throws Exception {
123114
124115 @ Override
125116 public PooledObject <Jedis > makeObject () throws Exception {
126- final HostAndPort hp = this .hostAndPort .get ();
127- final Jedis jedis = new Jedis (hp .getHost (), hp .getPort (), connectionTimeout , soTimeout ,
128- ssl , sslSocketFactory , sslParameters , hostnameVerifier );
117+ final Jedis jedis = getJedis ();
129118 try {
130119 jedis .connect ();
131120 if (user != null ) {
@@ -147,6 +136,10 @@ public PooledObject<Jedis> makeObject() throws Exception {
147136 return new DefaultPooledObject <>(jedis );
148137 }
149138
139+ private Jedis getJedis () {
140+ return new Jedis (jedisSocketFactory );
141+ }
142+
150143 @ Override
151144 public void passivateObject (PooledObject <Jedis > pooledJedis ) throws Exception {
152145 // TODO maybe should select db 0? Not sure right now.
@@ -156,7 +149,7 @@ public void passivateObject(PooledObject<Jedis> pooledJedis) throws Exception {
156149 public boolean validateObject (PooledObject <Jedis > pooledJedis ) {
157150 final BinaryJedis jedis = pooledJedis .getObject ();
158151 try {
159- HostAndPort hostAndPort = this . hostAndPort . get ();
152+ HostAndPort hostAndPort = getHostAndPort ();
160153
161154 String connectionHost = jedis .getClient ().getHost ();
162155 int connectionPort = jedis .getClient ().getPort ();
@@ -168,4 +161,8 @@ public boolean validateObject(PooledObject<Jedis> pooledJedis) {
168161 return false ;
169162 }
170163 }
164+
165+ private HostAndPort getHostAndPort () {
166+ return new HostAndPort (jedisSocketFactory .getHost (), jedisSocketFactory .getPort ());
167+ }
171168}
0 commit comments