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 4513548e8..2e4f80c72 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 @@ -299,16 +299,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 quietPeriod = clientConfiguration.getShutdownQuietPeriod(); @@ -332,6 +324,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 5dc7499cb..12e9670de 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 @@ -48,6 +48,7 @@ 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; @@ -805,6 +806,25 @@ public class LettuceConnectionFactoryUnitTests { verify(connectionProviderMock, times(2)).getConnection(StatefulConnection.class); } + @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() {