Merge pull request #3143 from eddumelendez/gh-3142

* gh-3142:
  Polish redis connection timeout support
  Add connection timeout property for redis
This commit is contained in:
Stephane Nicoll
2015-06-06 13:35:56 +02:00
4 changed files with 80 additions and 44 deletions

View File

@@ -52,6 +52,7 @@ import redis.clients.jedis.JedisPoolConfig;
* @author Christian Dupuis
* @author Christoph Strobl
* @author Phillip Webb
* @author Eddú Meléndez
*/
@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@@ -83,6 +84,9 @@ public class RedisAutoConfiguration {
factory.setPassword(this.properties.getPassword());
}
factory.setDatabase(this.properties.getDatabase());
if(this.properties.getTimeout() > 0) {
factory.setTimeout(this.properties.getTimeout());
}
return factory;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.
@@ -23,6 +23,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
*
* @author Dave Syer
* @author Christoph Strobl
* @author Eddú Meléndez
*/
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
@@ -47,10 +48,23 @@ public class RedisProperties {
*/
private int port = 6379;
/**
* Connection timeout in milliseconds.
*/
private int timeout;
private Pool pool;
private Sentinel sentinel;
public int getDatabase() {
return this.database;
}
public void setDatabase(int database) {
this.database = database;
}
public String getHost() {
return this.host;
}
@@ -59,14 +73,6 @@ public class RedisProperties {
this.host = host;
}
public int getPort() {
return this.port;
}
public void setPort(int port) {
this.port = port;
}
public String getPassword() {
return this.password;
}
@@ -75,20 +81,20 @@ public class RedisProperties {
this.password = password;
}
public Pool getPool() {
return this.pool;
public int getPort() {
return this.port;
}
public void setPool(Pool pool) {
this.pool = pool;
public void setPort(int port) {
this.port = port;
}
public int getDatabase() {
return this.database;
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setDatabase(int database) {
this.database = database;
public int getTimeout() {
return this.timeout;
}
public Sentinel getSentinel() {
@@ -99,6 +105,14 @@ public class RedisProperties {
this.sentinel = sentinel;
}
public Pool getPool() {
return this.pool;
}
public void setPool(Pool pool) {
this.pool = pool;
}
/**
* Pool properties.
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.
@@ -19,6 +19,8 @@ package org.springframework.boot.autoconfigure.redis;
import java.util.Arrays;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.test.EnvironmentTestUtils;
@@ -40,29 +42,34 @@ import static org.junit.Assert.assertTrue;
* @author Dave Syer
* @author Christian Dupuis
* @author Christoph Strobl
* @author Eddú Meléndez
*/
public class RedisAutoConfigurationTests {
private AnnotationConfigApplicationContext context;
@Before
public void setup() {
this.context = new AnnotationConfigApplicationContext();
}
@After
public void close() {
if (this.context != null) {
this.context.close();
}
}
@Test
public void testDefaultRedisConfiguration() throws Exception {
this.context = new AnnotationConfigApplicationContext();
this.context.register(RedisAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load();
assertNotNull(this.context.getBean("redisTemplate", RedisOperations.class));
assertNotNull(this.context.getBean(StringRedisTemplate.class));
}
@Test
public void testOverrideRedisConfiguration() throws Exception {
this.context = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(this.context, "spring.redis.host:foo");
EnvironmentTestUtils.addEnvironment(this.context, "spring.redis.database:1");
this.context.register(RedisAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load("spring.redis.host:foo", "spring.redis.database:1");
assertEquals("foo", this.context.getBean(JedisConnectionFactory.class)
.getHostName());
assertEquals(1, this.context.getBean(JedisConnectionFactory.class).getDatabase());
@@ -70,33 +77,29 @@ public class RedisAutoConfigurationTests {
@Test
public void testRedisConfigurationWithPool() throws Exception {
this.context = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(this.context, "spring.redis.host:foo");
EnvironmentTestUtils.addEnvironment(this.context, "spring.redis.pool.max-idle:1");
this.context.register(RedisAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load("spring.redis.host:foo", "spring.redis.pool.max-idle:1");
assertEquals("foo", this.context.getBean(JedisConnectionFactory.class)
.getHostName());
assertEquals(1, this.context.getBean(JedisConnectionFactory.class)
.getPoolConfig().getMaxIdle());
}
@Test
public void testRedisConfigurationWithTimeout() throws Exception {
load("spring.redis.host:foo", "spring.redis.timeout:100");
assertEquals("foo", this.context.getBean(JedisConnectionFactory.class)
.getHostName());
assertEquals(100, this.context.getBean(JedisConnectionFactory.class)
.getTimeout());
}
@Test
public void testRedisConfigurationWithSentinel() throws Exception {
List<String> sentinels = Arrays.asList("127.0.0.1:26379", "127.0.0.1:26380");
if (isAtLeastOneSentinelAvailable(sentinels)) {
this.context = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(this.context,
"spring.redis.sentinel.master:mymaster");
EnvironmentTestUtils.addEnvironment(
this.context,
"spring.redis.sentinel.nodes:"
+ StringUtils.collectionToCommaDelimitedString(sentinels));
this.context.register(RedisAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
load("spring.redis.sentinel.master:mymaster", "spring.redis.sentinel.nodes:"
+ StringUtils.collectionToCommaDelimitedString(sentinels));
assertTrue(this.context.getBean(JedisConnectionFactory.class)
.isRedisSentinelAware());
@@ -138,4 +141,18 @@ public class RedisAutoConfigurationTests {
}
}
private void load(String... environment) {
this.context = doLoad(environment);
}
private AnnotationConfigApplicationContext doLoad(
String... environment) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(applicationContext, environment);
applicationContext.register(RedisAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
applicationContext.refresh();
return applicationContext;
}
}

View File

@@ -455,6 +455,7 @@ content into your application; rather pick only the properties that you need.
spring.redis.pool.max-wait=-1
spring.redis.sentinel.master= # name of Redis server
spring.redis.sentinel.nodes= # comma-separated list of host:port pairs
spring.redis.timeout= # connection timeout in milliseconds
# ACTIVEMQ ({sc-spring-boot-autoconfigure}/jms/activemq/ActiveMQProperties.{sc-ext}[ActiveMQProperties])
spring.activemq.broker-url=tcp://localhost:61616 # connection URL