From 4d8a16ac5ebe33a9a2640419e7dcbd1c5a1903a0 Mon Sep 17 00:00:00 2001 From: Rui Gu Date: Thu, 9 Mar 2017 12:50:44 +0000 Subject: [PATCH 1/7] Removed the workaround for multi-lock namespace definition Removed the workaround for multi-lock namespace definition Employed proper solution where dependencies are explicitly defined to help spring create beans in a desired order. --- .../support/RedissonDefinitionParser.java | 25 ++++++++++--------- .../RedissonMultiLockDefinitionParser.java | 1 - 2 files changed, 13 insertions(+), 13 deletions(-) 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..36cc682cc 100644 --- a/redisson/src/main/java/org/redisson/spring/support/RedissonDefinitionParser.java +++ b/redisson/src/main/java/org/redisson/spring/support/RedissonDefinitionParser.java @@ -19,6 +19,7 @@ import java.util.List; import org.redisson.Redisson; import org.redisson.config.Config; 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 +84,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 +99,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 +111,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 +123,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) { @@ -156,10 +160,7 @@ public final class RedissonDefinitionParser attribute.getValue()); } else { String value = attribute.getValue(); - String localName = parserContext.getDelegate() - .getLocalName(element); - localName = Conventions - .attributeNameToPropertyName(localName); + String localName = helper.getName(element); if ("masterAddress".equals(propertyName) && ConfigType.masterSlaveServers.name() .equals(localName)) { @@ -194,7 +195,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(); From 6d2a45b5e79bc9dc5b6a4e1b482393848e9e066b Mon Sep 17 00:00:00 2001 From: Rui Gu Date: Thu, 9 Mar 2017 14:49:41 +0000 Subject: [PATCH 2/7] keep the xsd inline with configuration changes happened recently --- .../redisson/spring/support/redisson-1.0.xsd | 75 +++++++++++++------ 1 file changed, 51 insertions(+), 24 deletions(-) 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..150d16418 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 @@ + + + + + + + + + + + + + + + + @@ -388,29 +408,6 @@ ]]> - - - each slave node. - - Default: 1 - ]]> - - - - - each slave node. - - Default: 50 - ]]> - - @@ -462,6 +459,36 @@ ]]> + + + + + + + + + + + + + + + @@ -477,7 +504,7 @@ From 3ceb0c4d1ea4b5ae60de4107faa5616a5aa7cf57 Mon Sep 17 00:00:00 2001 From: Rui Gu Date: Thu, 9 Mar 2017 17:31:41 +0000 Subject: [PATCH 3/7] XSD typo fixed and added a missing attribute --- .../org/redisson/spring/support/redisson-1.0.xsd | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 150d16418..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 @@ -221,7 +221,7 @@ ]]> - + + + + + From 53bbc25a9497756062a42724f038dfef39eca553 Mon Sep 17 00:00:00 2001 From: Rui Gu Date: Thu, 9 Mar 2017 23:11:19 +0000 Subject: [PATCH 4/7] fixed a typo in RedisRunner --- redisson/src/test/java/org/redisson/RedisRunner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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; } From c90a898ecb5571a9a9a38f7bae0adb0e8fa57176 Mon Sep 17 00:00:00 2001 From: Rui Gu Date: Thu, 9 Mar 2017 23:12:36 +0000 Subject: [PATCH 5/7] Added a way to eagerly resolve the masterAddress URL from string --- .../spring/support/RedissonDefinitionParser.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 36cc682cc..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,6 +18,7 @@ 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; @@ -159,12 +160,17 @@ public final class RedissonDefinitionParser builder.addPropertyReference(propertyName, attribute.getValue()); } else { - String value = attribute.getValue(); + 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); } From 4c678f2083d4f5c5635ce9ef5b716ce354be7a74 Mon Sep 17 00:00:00 2001 From: Rui Gu Date: Thu, 9 Mar 2017 23:13:20 +0000 Subject: [PATCH 6/7] Added test case for examples mentioned in the wiki page. --- .../support/SpringNamespaceWikiTest.java | 195 ++++++++++++++++++ .../spring/support/namespace_wiki_cluster.xml | 70 +++++++ .../support/namespace_wiki_master_slave.xml | 70 +++++++ .../support/namespace_wiki_replicated.xml | 71 +++++++ .../support/namespace_wiki_sentinel.xml | 70 +++++++ .../spring/support/namespace_wiki_single.xml | 63 ++++++ 6 files changed, 539 insertions(+) create mode 100644 redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java create mode 100644 redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_cluster.xml create mode 100644 redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_master_slave.xml create mode 100644 redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_replicated.xml create mode 100644 redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_sentinel.xml create mode 100644 redisson/src/test/resources/org/redisson/spring/support/namespace_wiki_single.xml 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 @@ + + + + + + + + + + + + + + + + + From d736b07470415e3d53aa0e66dd8d89027a220f85 Mon Sep 17 00:00:00 2001 From: Marlon Reghert Date: Fri, 10 Mar 2017 21:24:51 -0300 Subject: [PATCH 7/7] Add test coverage for org.redisson.codec.AvroJacksonCodec by fixing an wrong variable assignment at org.redisson.RedissonCodecTest --- redisson/src/test/java/org/redisson/RedissonCodecTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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();