diff --git a/redisson/src/main/java/org/redisson/spring/support/RedissonDefinitionParser.java b/redisson/src/main/java/org/redisson/spring/support/RedissonDefinitionParser.java index b1e64be1d..7beef7354 100644 --- a/redisson/src/main/java/org/redisson/spring/support/RedissonDefinitionParser.java +++ b/redisson/src/main/java/org/redisson/spring/support/RedissonDefinitionParser.java @@ -18,7 +18,9 @@ package org.redisson.spring.support; import java.util.List; import org.redisson.Redisson; import org.redisson.config.Config; +import org.redisson.misc.URLBuilder; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.parsing.CompositeComponentDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; @@ -83,7 +85,7 @@ public final class RedissonDefinitionParser this.helper = helper; } - private void parseChildElements(Element element, String parentId, String redissonRef, ParserContext parserContext) { + private void parseChildElements(Element element, String parentId, String redissonRef, BeanDefinitionBuilder redissonDef, ParserContext parserContext) { if (element.hasChildNodes()) { CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(parentId, @@ -98,9 +100,9 @@ public final class RedissonDefinitionParser String localName = parserContext.getDelegate().getLocalName(elt); localName = Conventions.attributeNameToPropertyName(localName); if (ConfigType.contains(localName)) { - parseConfigTypes(elt, localName, parserContext); + parseConfigTypes(elt, localName, redissonDef, parserContext); } else if (AddressType.contains(localName)) { - parseAddressTypes(elt, localName, parserContext); + parseAddressTypes(elt, localName, redissonDef, parserContext); } else if (helper.isRedissonNS(elt)) { elt.setAttribute(REDISSON_REF, redissonRef); parserContext.getDelegate().parseCustomElement(elt); @@ -110,7 +112,7 @@ public final class RedissonDefinitionParser } } - private void parseConfigTypes(Element element, String configType, ParserContext parserContext) { + private void parseConfigTypes(Element element, String configType, BeanDefinitionBuilder redissonDef, ParserContext parserContext) { BeanDefinitionBuilder builder = helper.createBeanDefinitionBuilder(element, parserContext, null); @@ -122,16 +124,19 @@ public final class RedissonDefinitionParser helper.registerBeanDefinition(builder, id, helper.parseAliase(element), parserContext); parseAttributes(element, parserContext, builder); - parseChildElements(element, id, null, parserContext); + redissonDef.addDependsOn(id); + parseChildElements(element, id, null, redissonDef, parserContext); parserContext.getDelegate().parseQualifierElements(element, bd); } - private void parseAddressTypes(Element element, String addressType, ParserContext parserContext) { - helper.invoker(element, + private void parseAddressTypes(Element element, String addressType, BeanDefinitionBuilder redissonDef, ParserContext parserContext) { + BeanComponentDefinition invoker = helper.invoker(element, parserContext.getContainingComponent().getName(), "add" + StringUtils.capitalize(addressType), new String[]{element.getAttribute("value")}, parserContext); + String id = invoker.getName(); + redissonDef.addDependsOn(id); } private void parseAttributes(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { @@ -155,15 +160,17 @@ public final class RedissonDefinitionParser builder.addPropertyReference(propertyName, attribute.getValue()); } else { - String value = attribute.getValue(); - String localName = parserContext.getDelegate() - .getLocalName(element); - localName = Conventions - .attributeNameToPropertyName(localName); + Object value = attribute.getValue(); + String localName = helper.getName(element); if ("masterAddress".equals(propertyName) && ConfigType.masterSlaveServers.name() .equals(localName)) { - value = "redis://" + value; + try { + value = URLBuilder.create((String) value); + } catch (Exception e) { + //value may be a placeholder + value = "redis://" + value; + } } builder.addPropertyValue(propertyName, value); } @@ -194,7 +201,7 @@ public final class RedissonDefinitionParser String id = helper.getId(element, builder, parserContext); parseAttributes(element, parserContext, configBuilder); //Sort out all the nested elements - parseChildElements(element, configId, id, parserContext); + parseChildElements(element, configId, id, builder, parserContext); helper.registerBeanDefinition(builder, id, helper.parseAliase(element), parserContext); diff --git a/redisson/src/main/java/org/redisson/spring/support/RedissonMultiLockDefinitionParser.java b/redisson/src/main/java/org/redisson/spring/support/RedissonMultiLockDefinitionParser.java index e936a90de..0cad4c335 100644 --- a/redisson/src/main/java/org/redisson/spring/support/RedissonMultiLockDefinitionParser.java +++ b/redisson/src/main/java/org/redisson/spring/support/RedissonMultiLockDefinitionParser.java @@ -44,7 +44,6 @@ public class RedissonMultiLockDefinitionParser protected void parseNested(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, BeanDefinition bd) { bd.setDependsOn(element.getAttribute( RedissonNamespaceParserSupport.REDISSON_REF_ATTRIBUTE)); - bd.setLazyInit(true); List childElements = DomUtils.getChildElements(element); for (Element elt : childElements) { String localName = elt.getLocalName(); diff --git a/redisson/src/main/resources/org/redisson/spring/support/redisson-1.0.xsd b/redisson/src/main/resources/org/redisson/spring/support/redisson-1.0.xsd index 097feb15d..49d442556 100644 --- a/redisson/src/main/resources/org/redisson/spring/support/redisson-1.0.xsd +++ b/redisson/src/main/resources/org/redisson/spring/support/redisson-1.0.xsd @@ -57,6 +57,26 @@ + + + + + + + + + + + + + + + + @@ -201,7 +221,7 @@ ]]> - - - - each slave node. - - Default: 1 - ]]> - - - - - each slave node. - - Default: 50 - ]]> - - @@ -462,6 +459,36 @@ ]]> + + + + + + + + + + + + + + + @@ -477,7 +504,7 @@ @@ -772,6 +799,15 @@ ]]> + + + + + diff --git a/redisson/src/test/java/org/redisson/RedisRunner.java b/redisson/src/test/java/org/redisson/RedisRunner.java index 7012abbe9..e0990ffae 100644 --- a/redisson/src/test/java/org/redisson/RedisRunner.java +++ b/redisson/src/test/java/org/redisson/RedisRunner.java @@ -68,7 +68,7 @@ public class RedisRunner { SLAVE_PRIORITY, MIN_SLAVES_TO_WRITE, MIN_SLAVES_MAX_LAG, - REQUREPASS, + REQUIREPASS, RENAME_COMMAND(true), MAXCLIENTS, MAXMEMORY, @@ -552,7 +552,7 @@ public class RedisRunner { } public RedisRunner requirepass(String requirepass) { - addConfigOption(REDIS_OPTIONS.REQUREPASS, requirepass); + addConfigOption(REDIS_OPTIONS.REQUIREPASS, requirepass); return this; } diff --git a/redisson/src/test/java/org/redisson/RedissonCodecTest.java b/redisson/src/test/java/org/redisson/RedissonCodecTest.java index 372c9130f..a6b7c23ba 100644 --- a/redisson/src/test/java/org/redisson/RedissonCodecTest.java +++ b/redisson/src/test/java/org/redisson/RedissonCodecTest.java @@ -14,6 +14,7 @@ import org.redisson.codec.KryoCodec; import org.redisson.codec.LZ4Codec; import org.redisson.codec.MsgPackJacksonCodec; import org.redisson.codec.SerializationCodec; +import org.redisson.codec.AvroJacksonCodec; import org.redisson.codec.SmileJacksonCodec; import org.redisson.codec.SnappyCodec; import org.redisson.config.Config; @@ -28,7 +29,7 @@ import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; public class RedissonCodecTest extends BaseTest { - private Codec avroCodec = new SmileJacksonCodec(); + private Codec avroCodec = new AvroJacksonCodec(); private Codec smileCodec = new SmileJacksonCodec(); private Codec codec = new SerializationCodec(); private Codec kryoCodec = new KryoCodec(); diff --git a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java new file mode 100644 index 000000000..df1c38bf3 --- /dev/null +++ b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java @@ -0,0 +1,195 @@ +package org.redisson.spring.support; + +import java.io.IOException; +import java.util.List; +import org.junit.Test; +import org.redisson.ClusterRunner; +import org.redisson.RedisRunner; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * + * @author Rui Gu (https://github.com/jackygurui) + */ +public class SpringNamespaceWikiTest { + + @Test + public void testSingle() throws Exception { + RedisRunner.RedisProcess run = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .run(); + try { + ((ConfigurableApplicationContext) + new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace_wiki_single.xml")) + .close(); + } finally { + run.stop(); + } + } + + @Test + public void testMasterSlave() throws Exception { + RedisRunner.RedisProcess master = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .run(); + RedisRunner.RedisProcess slave1 = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .masterauth("do_not_use_if_it_is_not_set") + .port(6380) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .run(); + RedisRunner.RedisProcess slave2 = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .masterauth("do_not_use_if_it_is_not_set") + .port(6381) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .run(); + try { + ((ConfigurableApplicationContext) + new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace_wiki_master_slave.xml")) + .close(); + } finally { + master.stop(); + slave1.stop(); + slave2.stop(); + } + } + + @Test + public void testSentinel() throws Exception { + RedisRunner.RedisProcess master = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .run(); + RedisRunner.RedisProcess slave1 = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .masterauth("do_not_use_if_it_is_not_set") + .port(6380) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .run(); + RedisRunner.RedisProcess slave2 = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .masterauth("do_not_use_if_it_is_not_set") + .port(6381) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .run(); + RedisRunner.RedisProcess sentinel1 = new RedisRunner() +// .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .port(26379) + .sentinel() + .sentinelMonitor("myMaster", "127.0.0.1", 6379, 2) + .sentinelAuthPass("myMaster", "do_not_use_if_it_is_not_set") + .run(); + RedisRunner.RedisProcess sentinel2 = new RedisRunner() +// .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .port(26380) + .sentinel() + .sentinelMonitor("myMaster", "127.0.0.1", 6379, 2) + .sentinelAuthPass("myMaster", "do_not_use_if_it_is_not_set") + .run(); + RedisRunner.RedisProcess sentinel3 = new RedisRunner() +// .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .port(26381) + .sentinel() + .sentinelMonitor("myMaster", "127.0.0.1", 6379, 2) + .sentinelAuthPass("myMaster", "do_not_use_if_it_is_not_set") + .run(); + try { + ((ConfigurableApplicationContext) + new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace_wiki_sentinel.xml")) + .close(); + } finally { + master.stop(); + slave1.stop(); + slave2.stop(); + sentinel1.stop(); + sentinel2.stop(); + sentinel3.stop(); + } + } + + @Test + public void testReplicated() throws Exception { + RedisRunner.RedisProcess master = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .nosave() + .randomDir() + .run(); + RedisRunner.RedisProcess slave1 = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .masterauth("do_not_use_if_it_is_not_set") + .port(6380) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .run(); + RedisRunner.RedisProcess slave2 = new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .masterauth("do_not_use_if_it_is_not_set") + .port(6381) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .run(); + try { + ((ConfigurableApplicationContext) + new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace_wiki_replicated.xml")) + .close(); + } finally { + master.stop(); + slave1.stop(); + slave2.stop(); + } + } + + @Test + public void testCluster() throws Exception { + ClusterRunner clusterRunner = new ClusterRunner() + .addNode(new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .port(6379) + .randomDir() + .nosave()) + .addNode(new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .port(6380) + .randomDir() + .nosave()) + .addNode(new RedisRunner() + .requirepass("do_not_use_if_it_is_not_set") + .port(6381) + .randomDir() + .nosave()); + List nodes = clusterRunner.run(); + + try { + ((ConfigurableApplicationContext) + new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace_wiki_cluster.xml")) + .close(); + } finally { + for (RedisRunner.RedisProcess node : nodes) { + node.stop(); + } + } + } +} diff --git a/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_cluster.xml b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_cluster.xml new file mode 100644 index 000000000..1689951e5 --- /dev/null +++ b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_cluster.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_master_slave.xml b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_master_slave.xml new file mode 100644 index 000000000..12003cbe3 --- /dev/null +++ b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_master_slave.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_replicated.xml b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_replicated.xml new file mode 100644 index 000000000..450ea9d98 --- /dev/null +++ b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_replicated.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_sentinel.xml b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_sentinel.xml new file mode 100644 index 000000000..49d188775 --- /dev/null +++ b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_sentinel.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_single.xml b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_single.xml new file mode 100644 index 000000000..4c49a82fe --- /dev/null +++ b/redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_single.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + +