Commit 9037b543 authored by Stephane Nicoll's avatar Stephane Nicoll

Merge pull request #3143 from eddumelendez/gh-3142

* gh-3142:
  Polish redis connection timeout support
  Add connection timeout property for redis
parents 98b6fafe 432c00e8
...@@ -52,6 +52,7 @@ import redis.clients.jedis.JedisPoolConfig; ...@@ -52,6 +52,7 @@ import redis.clients.jedis.JedisPoolConfig;
* @author Christian Dupuis * @author Christian Dupuis
* @author Christoph Strobl * @author Christoph Strobl
* @author Phillip Webb * @author Phillip Webb
* @author Eddú Meléndez
*/ */
@Configuration @Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class }) @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
...@@ -83,6 +84,9 @@ public class RedisAutoConfiguration { ...@@ -83,6 +84,9 @@ public class RedisAutoConfiguration {
factory.setPassword(this.properties.getPassword()); factory.setPassword(this.properties.getPassword());
} }
factory.setDatabase(this.properties.getDatabase()); factory.setDatabase(this.properties.getDatabase());
if(this.properties.getTimeout() > 0) {
factory.setTimeout(this.properties.getTimeout());
}
return factory; return factory;
} }
......
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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; ...@@ -23,6 +23,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* *
* @author Dave Syer * @author Dave Syer
* @author Christoph Strobl * @author Christoph Strobl
* @author Eddú Meléndez
*/ */
@ConfigurationProperties(prefix = "spring.redis") @ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties { public class RedisProperties {
...@@ -47,24 +48,29 @@ public class RedisProperties { ...@@ -47,24 +48,29 @@ public class RedisProperties {
*/ */
private int port = 6379; private int port = 6379;
/**
* Connection timeout in milliseconds.
*/
private int timeout;
private Pool pool; private Pool pool;
private Sentinel sentinel; private Sentinel sentinel;
public String getHost() { public int getDatabase() {
return this.host; return this.database;
} }
public void setHost(String host) { public void setDatabase(int database) {
this.host = host; this.database = database;
} }
public int getPort() { public String getHost() {
return this.port; return this.host;
} }
public void setPort(int port) { public void setHost(String host) {
this.port = port; this.host = host;
} }
public String getPassword() { public String getPassword() {
...@@ -75,20 +81,20 @@ public class RedisProperties { ...@@ -75,20 +81,20 @@ public class RedisProperties {
this.password = password; this.password = password;
} }
public Pool getPool() { public int getPort() {
return this.pool; return this.port;
} }
public void setPool(Pool pool) { public void setPort(int port) {
this.pool = pool; this.port = port;
} }
public int getDatabase() { public void setTimeout(int timeout) {
return this.database; this.timeout = timeout;
} }
public void setDatabase(int database) { public int getTimeout() {
this.database = database; return this.timeout;
} }
public Sentinel getSentinel() { public Sentinel getSentinel() {
...@@ -99,6 +105,14 @@ public class RedisProperties { ...@@ -99,6 +105,14 @@ public class RedisProperties {
this.sentinel = sentinel; this.sentinel = sentinel;
} }
public Pool getPool() {
return this.pool;
}
public void setPool(Pool pool) {
this.pool = pool;
}
/** /**
* Pool properties. * Pool properties.
*/ */
......
/* /*
* 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -19,6 +19,8 @@ package org.springframework.boot.autoconfigure.redis; ...@@ -19,6 +19,8 @@ package org.springframework.boot.autoconfigure.redis;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.boot.test.EnvironmentTestUtils;
...@@ -40,29 +42,34 @@ import static org.junit.Assert.assertTrue; ...@@ -40,29 +42,34 @@ import static org.junit.Assert.assertTrue;
* @author Dave Syer * @author Dave Syer
* @author Christian Dupuis * @author Christian Dupuis
* @author Christoph Strobl * @author Christoph Strobl
* @author Eddú Meléndez
*/ */
public class RedisAutoConfigurationTests { public class RedisAutoConfigurationTests {
private AnnotationConfigApplicationContext context; private AnnotationConfigApplicationContext context;
@Before
public void setup() {
this.context = new AnnotationConfigApplicationContext();
}
@After
public void close() {
if (this.context != null) {
this.context.close();
}
}
@Test @Test
public void testDefaultRedisConfiguration() throws Exception { public void testDefaultRedisConfiguration() throws Exception {
this.context = new AnnotationConfigApplicationContext(); load();
this.context.register(RedisAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
assertNotNull(this.context.getBean("redisTemplate", RedisOperations.class)); assertNotNull(this.context.getBean("redisTemplate", RedisOperations.class));
assertNotNull(this.context.getBean(StringRedisTemplate.class)); assertNotNull(this.context.getBean(StringRedisTemplate.class));
} }
@Test @Test
public void testOverrideRedisConfiguration() throws Exception { public void testOverrideRedisConfiguration() throws Exception {
this.context = new AnnotationConfigApplicationContext(); load("spring.redis.host:foo", "spring.redis.database:1");
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();
assertEquals("foo", this.context.getBean(JedisConnectionFactory.class) assertEquals("foo", this.context.getBean(JedisConnectionFactory.class)
.getHostName()); .getHostName());
assertEquals(1, this.context.getBean(JedisConnectionFactory.class).getDatabase()); assertEquals(1, this.context.getBean(JedisConnectionFactory.class).getDatabase());
...@@ -70,33 +77,29 @@ public class RedisAutoConfigurationTests { ...@@ -70,33 +77,29 @@ public class RedisAutoConfigurationTests {
@Test @Test
public void testRedisConfigurationWithPool() throws Exception { public void testRedisConfigurationWithPool() throws Exception {
this.context = new AnnotationConfigApplicationContext(); load("spring.redis.host:foo", "spring.redis.pool.max-idle:1");
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();
assertEquals("foo", this.context.getBean(JedisConnectionFactory.class) assertEquals("foo", this.context.getBean(JedisConnectionFactory.class)
.getHostName()); .getHostName());
assertEquals(1, this.context.getBean(JedisConnectionFactory.class) assertEquals(1, this.context.getBean(JedisConnectionFactory.class)
.getPoolConfig().getMaxIdle()); .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 @Test
public void testRedisConfigurationWithSentinel() throws Exception { public void testRedisConfigurationWithSentinel() throws Exception {
List<String> sentinels = Arrays.asList("127.0.0.1:26379", "127.0.0.1:26380"); List<String> sentinels = Arrays.asList("127.0.0.1:26379", "127.0.0.1:26380");
if (isAtLeastOneSentinelAvailable(sentinels)) { if (isAtLeastOneSentinelAvailable(sentinels)) {
this.context = new AnnotationConfigApplicationContext(); load("spring.redis.sentinel.master:mymaster", "spring.redis.sentinel.nodes:"
EnvironmentTestUtils.addEnvironment(this.context, + StringUtils.collectionToCommaDelimitedString(sentinels));
"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();
assertTrue(this.context.getBean(JedisConnectionFactory.class) assertTrue(this.context.getBean(JedisConnectionFactory.class)
.isRedisSentinelAware()); .isRedisSentinelAware());
...@@ -138,4 +141,18 @@ public class RedisAutoConfigurationTests { ...@@ -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;
}
} }
...@@ -455,6 +455,7 @@ content into your application; rather pick only the properties that you need. ...@@ -455,6 +455,7 @@ content into your application; rather pick only the properties that you need.
spring.redis.pool.max-wait=-1 spring.redis.pool.max-wait=-1
spring.redis.sentinel.master= # name of Redis server spring.redis.sentinel.master= # name of Redis server
spring.redis.sentinel.nodes= # comma-separated list of host:port pairs 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]) # ACTIVEMQ ({sc-spring-boot-autoconfigure}/jms/activemq/ActiveMQProperties.{sc-ext}[ActiveMQProperties])
spring.activemq.broker-url=tcp://localhost:61616 # connection URL spring.activemq.broker-url=tcp://localhost:61616 # connection URL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment