DATAREDIS-507 - Do not destroy RedisConnectionFactory in RedisKeyValueAdapter.destroy.

Do not destroy RedisConnectionFactory which is likely managed outside of RedisKeyValueAdapter. 
This change makes sure to retain a working connection factory while shutting down message listeners as those try to unsubscribe on shutdown.

Original Pull Request: #195
This commit is contained in:
Mark Paluch
2016-05-03 13:50:04 +02:00
committed by Christoph Strobl
parent c1476b701b
commit ebbcd95c6d
3 changed files with 76 additions and 7 deletions

View File

@@ -84,6 +84,7 @@ import org.springframework.util.Assert;
* Please use {@link RedisTemplate} for this purpose.
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 1.7
*/
public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
@@ -447,13 +448,6 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
*/
public void destroy() throws Exception {
if (redisOps instanceof RedisTemplate) {
RedisConnectionFactory connectionFactory = ((RedisTemplate<?, ?>) redisOps).getConnectionFactory();
if (connectionFactory instanceof DisposableBean) {
((DisposableBean) connectionFactory).destroy();
}
}
this.expirationListener.destroy();
this.messageListenerContainer.destroy();
}

View File

@@ -29,6 +29,7 @@ import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.dao.DataAccessException;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Reference;
@@ -86,6 +87,14 @@ public class RedisKeyValueAdapterTests {
} catch (Exception e) {
// ignore
}
try {
if (connectionFactory instanceof DisposableBean) {
((DisposableBean) connectionFactory).destroy();
}
} catch (Exception e) {
// ignore
}
}
/**

View File

@@ -0,0 +1,66 @@
/*
* Copyright 2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.redis.core;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
/**
* Unit tests for {@link RedisKeyValueAdapter}.
*
* @author Mark Paluch
*/
@RunWith(MockitoJUnitRunner.class)
public class RedisKeyValueAdapterUnitTests {
RedisTemplate<?, ?> redisTemplate;
RedisKeyValueAdapter redisKeyValueAdapter;
@Mock JedisConnectionFactory jedisConnectionFactoryMock;
@Mock RedisConnection redisConnectionMock;
@Before
public void setUp() throws Exception {
redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactoryMock);
redisTemplate.afterPropertiesSet();
when(jedisConnectionFactoryMock.getConnection()).thenReturn(redisConnectionMock);
when(redisConnectionMock.getConfig("notify-keyspace-events"))
.thenReturn(Arrays.asList("notify-keyspace-events", "KEA"));
redisKeyValueAdapter = new RedisKeyValueAdapter(redisTemplate);
}
@Test
public void destroyShouldNotDestroyConnectionFactory() throws Exception {
redisKeyValueAdapter.destroy();
verify(jedisConnectionFactoryMock, never()).destroy();
}
}