DATAREDIS-372 - Allow easier RedisSentinelConfiguration setup.
We now allow to initialize a RedisSentinelConfiguration based on a given String collection of host:ports. sentinelHostAndPorts[0] = 127.0.0.1:23679 sentinelHostAndPorts[1] = 127.0.0.1:23680 Further on it’s possible to pass in a PropertySource containing master name and sentinel nodes. spring.redis.sentinel.master=myMaster spring.redis.sentinel.nodes=127.0.0.1:23679,127.0.0.1:23680 Original pull request: #126.
This commit is contained in:
committed by
Thomas Darimont
parent
43a6a60c8d
commit
c662c46d02
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2014 the original author or authors.
|
||||
* Copyright 2014-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.
|
||||
@@ -15,11 +15,18 @@
|
||||
*/
|
||||
package org.springframework.data.redis.connection;
|
||||
|
||||
import static org.springframework.util.Assert.*;
|
||||
import static org.springframework.util.StringUtils.*;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.core.env.MapPropertySource;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Configuration class used for setting up {@link RedisConnection} via {@link RedisConnectionFactory} using connecting
|
||||
@@ -27,10 +34,14 @@ import org.springframework.util.Assert;
|
||||
* environment.
|
||||
*
|
||||
* @author Christoph Strobl
|
||||
* @author Thomas Darimont
|
||||
* @since 1.4
|
||||
*/
|
||||
public class RedisSentinelConfiguration {
|
||||
|
||||
private static final String REDIS_SENTINEL_MASTER_CONFIG_PROPERTY = "spring.redis.sentinel.master";
|
||||
private static final String REDIS_SENTINEL_NODES_CONFIG_PROPERTY = "spring.redis.sentinel.nodes";
|
||||
|
||||
private NamedNode master;
|
||||
private Set<RedisNode> sentinels;
|
||||
|
||||
@@ -38,7 +49,53 @@ public class RedisSentinelConfiguration {
|
||||
* Creates new {@link RedisSentinelConfiguration}.
|
||||
*/
|
||||
public RedisSentinelConfiguration() {
|
||||
this(new MapPropertySource("RedisSentinelConfiguration", Collections.<String, Object> emptyMap()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates {@link RedisSentinelConfiguration} for given hostPort combinations.
|
||||
*
|
||||
* <pre>
|
||||
* sentinelHostAndPorts[0] = 127.0.0.1:23679
|
||||
* sentinelHostAndPorts[1] = 127.0.0.1:23680
|
||||
* ...
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* @param sentinelHostAndPorts must not be {@literal null}.
|
||||
* @since 1.5
|
||||
*/
|
||||
public RedisSentinelConfiguration(String master, Set<String> sentinelHostAndPorts) {
|
||||
this(new MapPropertySource("RedisSentinelConfiguration", asMap(master, sentinelHostAndPorts)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates {@link RedisSentinelConfiguration} looking up values in given {@link PropertySource}.
|
||||
*
|
||||
* <pre>
|
||||
* <code>
|
||||
* spring.redis.sentinel.master=myMaster
|
||||
* spring.redis.sentinel.nodes=127.0.0.1:23679,127.0.0.1:23680,127.0.0.1:23681
|
||||
* </code>
|
||||
* </pre>
|
||||
*
|
||||
* @param propertySource must not be {@literal null}.
|
||||
* @since 1.5
|
||||
*/
|
||||
public RedisSentinelConfiguration(PropertySource<?> propertySource) {
|
||||
|
||||
notNull(propertySource, "PropertySource must not be null!");
|
||||
|
||||
this.sentinels = new LinkedHashSet<RedisNode>();
|
||||
|
||||
if (propertySource.containsProperty(REDIS_SENTINEL_MASTER_CONFIG_PROPERTY)) {
|
||||
this.setMaster(propertySource.getProperty(REDIS_SENTINEL_MASTER_CONFIG_PROPERTY).toString());
|
||||
}
|
||||
|
||||
if (propertySource.containsProperty(REDIS_SENTINEL_NODES_CONFIG_PROPERTY)) {
|
||||
appendSentinels(commaDelimitedListToSet(propertySource.getProperty(REDIS_SENTINEL_NODES_CONFIG_PROPERTY)
|
||||
.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -48,8 +105,10 @@ public class RedisSentinelConfiguration {
|
||||
*/
|
||||
public void setSentinels(Iterable<RedisNode> sentinels) {
|
||||
|
||||
Assert.notNull(sentinels, "Cannot set sentinels to 'null'.");
|
||||
notNull(sentinels, "Cannot set sentinels to 'null'.");
|
||||
|
||||
this.sentinels.clear();
|
||||
|
||||
for (RedisNode sentinel : sentinels) {
|
||||
addSentinel(sentinel);
|
||||
}
|
||||
@@ -71,7 +130,7 @@ public class RedisSentinelConfiguration {
|
||||
*/
|
||||
public void addSentinel(RedisNode sentinel) {
|
||||
|
||||
Assert.notNull(sentinel, "Sentinel must not be 'null'.");
|
||||
notNull(sentinel, "Sentinel must not be 'null'.");
|
||||
this.sentinels.add(sentinel);
|
||||
}
|
||||
|
||||
@@ -82,7 +141,7 @@ public class RedisSentinelConfiguration {
|
||||
*/
|
||||
public void setMaster(final String name) {
|
||||
|
||||
Assert.notNull(name, "Name of sentinel master must not be null.");
|
||||
notNull(name, "Name of sentinel master must not be null.");
|
||||
setMaster(new NamedNode() {
|
||||
|
||||
@Override
|
||||
@@ -99,7 +158,7 @@ public class RedisSentinelConfiguration {
|
||||
*/
|
||||
public void setMaster(NamedNode master) {
|
||||
|
||||
Assert.notNull("Sentinel master node must not be 'null'.");
|
||||
notNull("Sentinel master node must not be 'null'.");
|
||||
this.master = master;
|
||||
}
|
||||
|
||||
@@ -151,4 +210,37 @@ public class RedisSentinelConfiguration {
|
||||
public RedisSentinelConfiguration sentinel(String host, Integer port) {
|
||||
return sentinel(new RedisNode(host, port));
|
||||
}
|
||||
|
||||
private void appendSentinels(Set<String> hostAndPorts) {
|
||||
|
||||
for (String hostAndPort : hostAndPorts) {
|
||||
addSentinel(readHostAndPortFromString(hostAndPort));
|
||||
}
|
||||
}
|
||||
|
||||
private RedisNode readHostAndPortFromString(String hostAndPort) {
|
||||
|
||||
String[] args = split(hostAndPort, ":");
|
||||
|
||||
notNull(args, "HostAndPort need to be seperated by ':'.");
|
||||
isTrue(args.length == 2, "Host and Port String needs to specified as host:port");
|
||||
return new RedisNode(args[0], Integer.valueOf(args[1]).intValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param master must not be {@literal null} or empty.
|
||||
* @param sentinelHostAndPorts must not be {@literal null}.
|
||||
* @return
|
||||
*/
|
||||
private static Map<String, Object> asMap(String master, Set<String> sentinelHostAndPorts) {
|
||||
|
||||
hasText(master, "Master address must not be null or empty!");
|
||||
notNull(sentinelHostAndPorts, "SentinelHostAndPorts must not be null!");
|
||||
|
||||
Map<String, Object> map = new HashMap<String, Object>();
|
||||
map.put(REDIS_SENTINEL_MASTER_CONFIG_PROPERTY, master);
|
||||
map.put(REDIS_SENTINEL_NODES_CONFIG_PROPERTY, StringUtils.collectionToCommaDelimitedString(sentinelHostAndPorts));
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user