Skip to content

Commit 8fbfdca

Browse files
committed
Add support to the use of JedisSocketFactory using a pool
- Support for JedisSocketFactory has already been added to the lowest level Jedis to support adding any custom socket factory (e.g. UDS), this propagates the support in the JedisPool too
1 parent 72dc12e commit 8fbfdca

File tree

3 files changed

+50
-31
lines changed

3 files changed

+50
-31
lines changed

src/main/java/redis/clients/jedis/JedisFactory.java

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package redis.clients.jedis;
22

33
import java.net.URI;
4-
import java.util.concurrent.atomic.AtomicReference;
54

65
import javax.net.ssl.HostnameVerifier;
76
import javax.net.ssl.SSLParameters;
@@ -19,17 +18,19 @@
1918
* PoolableObjectFactory custom impl.
2019
*/
2120
class 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
}

src/main/java/redis/clients/jedis/JedisPool.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,19 @@ public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri,
283283
sslParameters, hostnameVerifier));
284284
}
285285

286+
public JedisPool(final GenericObjectPoolConfig poolConfig, final JedisSocketFactory jedisSocketFactory,
287+
final String user, final String password, final int database, final String clientName) {
288+
super(poolConfig, new JedisFactory(jedisSocketFactory, user, password, database, clientName));
289+
}
290+
291+
public JedisPool(final GenericObjectPoolConfig poolConfig, final JedisSocketFactory jedisSocketFactory) {
292+
super(poolConfig, new JedisFactory(jedisSocketFactory, null, null, Protocol.DEFAULT_DATABASE, null));
293+
}
294+
295+
public JedisPool(final JedisSocketFactory jedisSocketFactory) {
296+
super(new GenericObjectPoolConfig(), new JedisFactory(jedisSocketFactory, null, null, Protocol.DEFAULT_DATABASE, null));
297+
}
298+
286299
@Override
287300
public Jedis getResource() {
288301
Jedis jedis = super.getResource();

src/test/java/redis/clients/jedis/tests/UdsTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.newsclub.net.unix.AFUNIXSocket;
55
import org.newsclub.net.unix.AFUNIXSocketAddress;
66
import redis.clients.jedis.Jedis;
7+
import redis.clients.jedis.JedisPool;
78
import redis.clients.jedis.JedisSocketFactory;
89
import redis.clients.jedis.Protocol;
910

@@ -22,6 +23,14 @@ public void testConnectsToUds() {
2223
}
2324
}
2425

26+
@Test
27+
public void testConnectsToUdsWithPool() {
28+
try (JedisPool jedisPool = new JedisPool(new UdsJedisSocketFactory());
29+
Jedis jedis = jedisPool.getResource()) {
30+
assertEquals("PONG", jedis.ping());
31+
}
32+
}
33+
2534
private static class UdsJedisSocketFactory implements JedisSocketFactory {
2635

2736
private static final File UDS_SOCKET = new File("/tmp/redis_uds.sock");

0 commit comments

Comments
 (0)