From a7043588856ea10cfcde07cd88b0a58cc557032b Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 15 Aug 2019 11:06:59 +0200 Subject: [PATCH] DATAREDIS-1027 - Dispose reactive LettuceConnectionProvider on connection factory shutdown. LettuceConnectionFactory.destroy() now disposes also the reactive LettuceConnectionProvider to free resources of a connection pool. Original Pull Request: #470 --- .../lettuce/LettuceConnectionFactory.java | 26 ++++++++++++------- .../LettuceConnectionFactoryUnitTests.java | 20 ++++++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java index 3a2dec75a..48996f910 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java @@ -291,16 +291,8 @@ public class LettuceConnectionFactory resetConnection(); - if (connectionProvider instanceof DisposableBean) { - try { - ((DisposableBean) connectionProvider).destroy(); - } catch (Exception e) { - - if (log.isWarnEnabled()) { - log.warn(connectionProvider + " did not shut down gracefully.", e); - } - } - } + dispose(connectionProvider); + dispose(reactiveConnectionProvider); try { Duration timeout = clientConfiguration.getShutdownTimeout(); @@ -323,6 +315,20 @@ public class LettuceConnectionFactory } } + private void dispose(LettuceConnectionProvider connectionProvider) { + + if (connectionProvider instanceof DisposableBean) { + try { + ((DisposableBean) connectionProvider).destroy(); + } catch (Exception e) { + + if (log.isWarnEnabled()) { + log.warn(connectionProvider + " did not shut down gracefully.", e); + } + } + } + } + /* * (non-Javadoc) * @see org.springframework.data.redis.connection.RedisConnectionFactory#getConnection() diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java index f871cdf72..8cffaa412 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java @@ -45,6 +45,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.springframework.beans.DirectFieldAccessor; +import org.springframework.beans.factory.DisposableBean; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisClusterConnection; @@ -712,6 +713,25 @@ public class LettuceConnectionFactoryUnitTests { verify(connectionMock).close(); } + @Test // DATAREDIS-1027 + public void shouldDisposeConnectionProviders() throws Exception { + + LettuceConnectionProvider connectionProviderMock = mock(LettuceConnectionProvider.class, + withSettings().extraInterfaces(DisposableBean.class)); + LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory() { + @Override + protected LettuceConnectionProvider doCreateConnectionProvider(AbstractRedisClient client, + RedisCodec codec) { + return connectionProviderMock; + } + }; + + connectionFactory.afterPropertiesSet(); + connectionFactory.destroy(); + + verify((DisposableBean) connectionProviderMock, times(2)).destroy(); + } + @Test // DATAREDIS-842 public void databaseShouldBeSetCorrectlyOnSentinelClient() {