DATAREDIS-830 - Release Pub/Sub connection when closing LettuceSubscription.

We now release the native connection back to the connection provider when LettuceSubscription is closed. Previously, we just closed the connection which interfered with pooling as pooling connection providers still had a reference on the connection.

Original Pull Request: #341
This commit is contained in:
Mark Paluch
2018-05-09 08:44:20 +02:00
committed by Christoph Strobl
parent 03c607a337
commit a2bc45cfa2
3 changed files with 19 additions and 11 deletions

View File

@@ -752,7 +752,7 @@ public class LettuceConnection extends AbstractRedisConnection {
throw new UnsupportedOperationException();
}
try {
subscription = new LettuceSubscription(listener, switchToPubSub());
subscription = new LettuceSubscription(listener, switchToPubSub(), connectionProvider);
subscription.pSubscribe(patterns);
} catch (Exception ex) {
throw convertLettuceAccessException(ex);
@@ -767,7 +767,7 @@ public class LettuceConnection extends AbstractRedisConnection {
throw new UnsupportedOperationException();
}
try {
subscription = new LettuceSubscription(listener, switchToPubSub());
subscription = new LettuceSubscription(listener, switchToPubSub(), connectionProvider);
subscription.subscribe(channels);
} catch (Exception ex) {

View File

@@ -25,16 +25,19 @@ import org.springframework.data.redis.connection.util.AbstractSubscription;
* Message subscription on top of Lettuce.
*
* @author Costin Leau
* @author Mark Paluch
*/
class LettuceSubscription extends AbstractSubscription {
final StatefulRedisPubSubConnection<byte[], byte[]> pubsub;
private LettuceMessageListener listener;
private final LettuceConnectionProvider connectionProvider;
LettuceSubscription(MessageListener listener, StatefulRedisPubSubConnection<byte[], byte[]> pubsubConnection) {
LettuceSubscription(MessageListener listener, StatefulRedisPubSubConnection<byte[], byte[]> pubsubConnection, LettuceConnectionProvider connectionProvider) {
super(listener);
this.pubsub = pubsubConnection;
this.listener = new LettuceMessageListener(listener);
this.connectionProvider = connectionProvider;
pubsub.addListener(this.listener);
}
@@ -47,7 +50,8 @@ class LettuceSubscription extends AbstractSubscription {
pubsub.sync().punsubscribe(new byte[0]);
}
pubsub.removeListener(this.listener);
pubsub.close();
connectionProvider.release(pubsub);
}
protected void doPsubscribe(byte[]... patterns) {