SGF-396 - Enable support for variable Locator and Server endpoints on a SDG GFE Pool bean definition in a Spring Context.

Removed the SDG XSD schema restriction requiring the use of at least 1 <gfe:locator> of <gfe:server> sub-element on the <gfe:pool> element.  Also added a default Locator endpoint on localhost listening on the Locators default port of 10334 when no Locator or Server endpoints were specified, either by way of explicit use of the 'locators' or 'servers' attribute or a corresponding <gfe:locator> or <gfe:server> sub-element.
This commit is contained in:
John Blum
2015-04-16 11:06:16 -07:00
parent 847283a7e4
commit 3c9d9f7065
6 changed files with 114 additions and 18 deletions

View File

@@ -81,6 +81,12 @@ class PoolParser extends AbstractSimpleBeanDefinitionParser {
locators.addAll(parseLocators(element));
servers.addAll(parseServers(element));
// NOTE if neither Locators or Servers were specified, then setup a default connection to a Locator
// running on localhost listening on the default Locator port (10334) for convenience
if (locators.isEmpty() && servers.isEmpty()) {
locators.add(buildConnection(DEFAULT_HOST, String.valueOf(DEFAULT_LOCATOR_PORT), false));
}
if (!locators.isEmpty()) {
builder.addPropertyValue("locators", locators);
}

View File

@@ -2052,11 +2052,9 @@ Note that in order to instantiate a pool, a GemFire cache needs to be already st
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:choice minOccurs="1" maxOccurs="1">
<xsd:element name="locator" type="connectionType"
minOccurs="1" maxOccurs="unbounded" />
<xsd:element name="server" type="connectionType"
minOccurs="1" maxOccurs="unbounded" />
<xsd:choice>
<xsd:element name="locator" type="connectionType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="server" type="connectionType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:choice>
<xsd:attribute name="id" type="xsd:string" use="optional">
<xsd:annotation>

View File

@@ -2052,11 +2052,9 @@ Note that in order to instantiate a pool, a GemFire cache needs to be already st
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:choice minOccurs="1" maxOccurs="1">
<xsd:element name="locator" type="connectionType"
minOccurs="1" maxOccurs="unbounded" />
<xsd:element name="server" type="connectionType"
minOccurs="1" maxOccurs="unbounded" />
<xsd:choice>
<xsd:element name="locator" type="connectionType" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="server" type="connectionType" minOccurs="0" maxOccurs="unbounded" />
</xsd:choice>
<xsd:attribute name="id" type="xsd:string" use="optional">
<xsd:annotation>

View File

@@ -19,6 +19,7 @@ package org.springframework.data.gemfire.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.net.InetSocketAddress;
@@ -71,18 +72,69 @@ public class PoolNamespaceTest {
assertSocketAddress(locators.iterator().next(), "localhost", 40403);
}
@Test
public void testSimplePool() throws Exception {
assertTrue(context.containsBean("simple"));
PoolFactoryBean poolFactoryBean = context.getBean("&simple", PoolFactoryBean.class);
Collection<InetSocketAddress> locators = TestUtils.readField("locators", poolFactoryBean);
assertNotNull(locators);
assertEquals(1, locators.size());
assertSocketAddress(locators.iterator().next(), PoolParser.DEFAULT_HOST, PoolParser.DEFAULT_LOCATOR_PORT);
Collection<InetSocketAddress> servers = TestUtils.readField("servers", poolFactoryBean);
assertNull(servers);
}
@Test
public void testLocatorPool() throws Exception {
assertTrue(context.containsBean("locator"));
PoolFactoryBean poolFactoryBean = context.getBean("&locator", PoolFactoryBean.class);
Collection<InetSocketAddress> locators = TestUtils.readField("locators", poolFactoryBean);
assertNotNull(locators);
assertEquals(2, locators.size());
Iterator<InetSocketAddress> it = locators.iterator();
assertSocketAddress(it.next(), "skullbox", PoolParser.DEFAULT_LOCATOR_PORT);
assertSocketAddress(it.next(), "yorktown", 12480);
Collection<InetSocketAddress> servers = TestUtils.readField("servers", poolFactoryBean);
assertNull(servers);
}
@Test
public void testComplexPool() throws Exception {
assertTrue(context.containsBean("complex"));
PoolFactoryBean poolFactoryBean = context.getBean("&complex", PoolFactoryBean.class);
assertEquals(30, TestUtils.readField("retryAttempts", poolFactoryBean));
assertEquals(6000, TestUtils.readField("freeConnectionTimeout", poolFactoryBean));
assertEquals(5000l, TestUtils.readField("pingInterval", poolFactoryBean));
assertTrue((Boolean) TestUtils.readField("subscriptionEnabled", poolFactoryBean));
assertEquals(2000, TestUtils.readField("freeConnectionTimeout", poolFactoryBean));
assertEquals(20000l, TestUtils.readField("idleTimeout", poolFactoryBean));
assertEquals(10000, TestUtils.readField("loadConditioningInterval", poolFactoryBean));
assertEquals(false, TestUtils.readField("keepAlive", poolFactoryBean));
assertEquals(100, TestUtils.readField("maxConnections", poolFactoryBean));
assertEquals(5, TestUtils.readField("minConnections", poolFactoryBean));
assertEquals(5, TestUtils.readField("minConnections", poolFactoryBean));
assertFalse((Boolean) TestUtils.readField("multiUserAuthentication", poolFactoryBean));
assertEquals(5000l, TestUtils.readField("pingInterval", poolFactoryBean));
assertTrue((Boolean) TestUtils.readField("prSingleHopEnabled", poolFactoryBean));
assertEquals(500, TestUtils.readField("readTimeout", poolFactoryBean));
assertEquals(5, TestUtils.readField("retryAttempts", poolFactoryBean));
assertEquals("TestGroup", TestUtils.readField("serverGroup", poolFactoryBean));
assertEquals(65536, TestUtils.readField("socketBufferSize", poolFactoryBean));
assertEquals(5000, TestUtils.readField("statisticInterval", poolFactoryBean));
assertEquals(250, TestUtils.readField("subscriptionAckInterval", poolFactoryBean));
assertTrue((Boolean) TestUtils.readField("subscriptionEnabled", poolFactoryBean));
assertEquals(30000, TestUtils.readField("subscriptionMessageTrackingTimeout", poolFactoryBean));
assertEquals(2, TestUtils.readField("subscriptionRedundancy", poolFactoryBean));
assertTrue((Boolean) TestUtils.readField("threadLocalConnections", poolFactoryBean));
Collection<InetSocketAddress> servers = TestUtils.readField("servers", poolFactoryBean);
@@ -122,11 +174,12 @@ public class PoolNamespaceTest {
Collection<InetSocketAddress> servers = TestUtils.readField("servers", poolFactoryBean);
assertNotNull(servers);
assertEquals(2, servers.size());
assertEquals(3, servers.size());
Iterator<InetSocketAddress> serverIterator = locators.iterator();
assertSocketAddress(serverIterator.next(), "scorch", 21480);
assertSocketAddress(serverIterator.next(), "scorn", 51515);
assertSocketAddress(serverIterator.next(), "skullbox", 9110);
}

View File

@@ -19,6 +19,7 @@ package org.springframework.data.gemfire.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -227,6 +228,8 @@ public class PoolParserTest {
BeanDefinition poolDefinition = builder.getRawBeanDefinition();
assertNotNull(poolDefinition);
assertTrue(poolDefinition.getPropertyValues().contains("locators"));
assertTrue(poolDefinition.getPropertyValues().contains("servers"));
ManagedList<BeanDefinition> locators = (ManagedList<BeanDefinition>) poolDefinition.getPropertyValues()
.getPropertyValue("locators").getValue();
@@ -249,4 +252,33 @@ public class PoolParserTest {
assertBeanDefinition(servers.get(2), "backspace", String.valueOf(PoolParser.DEFAULT_SERVER_PORT));
}
@Test
@SuppressWarnings("unchecked")
public void testPostProcessWithNoLocatorsOrServersSpecified() {
BeanDefinitionBuilder poolBuilder = BeanDefinitionBuilder.genericBeanDefinition();
Element mockPoolElement = mock(Element.class, "testPostProcessWithNoLocatorsOrServersSpecified.MockPoolElement");
NodeList mockNodeList = mock(NodeList.class, "testPostProcessWithNoLocatorsOrServersSpecified.MockNodeList");
when(mockNodeList.getLength()).thenReturn(0);
when(mockPoolElement.getChildNodes()).thenReturn(mockNodeList);
when(mockPoolElement.getAttribute(eq(PoolParser.LOCATORS_ATTRIBUTE_NAME))).thenReturn("");
when(mockPoolElement.getAttribute(eq(PoolParser.SERVERS_ATTRIBUTE_NAME))).thenReturn("");
parser.postProcess(poolBuilder, mockPoolElement);
BeanDefinition poolDefinition = poolBuilder.getBeanDefinition();
assertNotNull(poolDefinition);
assertTrue(poolDefinition.getPropertyValues().contains("locators"));
assertFalse(poolDefinition.getPropertyValues().contains("servers"));
ManagedList<BeanDefinition> locators = (ManagedList<BeanDefinition>) poolDefinition.getPropertyValues()
.getPropertyValue("locators").getValue();
assertNotNull(locators);
assertFalse(locators.isEmpty());
assertEquals(1, locators.size());
assertBeanDefinition(locators.get(0), "localhost", String.valueOf(PoolParser.DEFAULT_LOCATOR_PORT));
}
}

View File

@@ -17,7 +17,7 @@
<prop key="log-level">error</prop>
</util:properties>
<gfe:cache properties-ref="gemfireProperties"/>
<gfe:client-cache properties-ref="gemfireProperties"/>
<context:property-placeholder location="classpath:port.properties"/>
@@ -25,8 +25,16 @@
<gfe:locator host="localhost" port="${gfe.port}"/>
</gfe:pool>
<gfe:pool id="complex" free-connection-timeout="6000" retry-attempts="30" ping-interval="5000"
subscription-enabled="true" multi-user-authentication="false" pr-single-hop-enabled="true">
<gfe:pool id="simple"/>
<gfe:pool id="locator" locators="skullbox, yorktown[12480]"/>
<gfe:pool id="complex" free-connection-timeout="2000" idle-timeout="20000" load-conditioning-interval="10000"
keep-alive="false" max-connections="100" min-connections="5" multi-user-authentication="false"
ping-interval="5000" pr-single-hop-enabled="true" read-timeout="500" retry-attempts="5"
server-group="TestGroup" socket-buffer-size="65536" statistic-interval="5000"
subscription-ack-interval="250" subscription-enabled="true" subscription-message-tracking-timeout="30000"
subscription-redundancy="2" thread-local-connections="true">
<gfe:server host="localhost" port="${gfe.port.4}"/>
<gfe:server host="localhost" port="40405"/>
</gfe:pool>
@@ -37,6 +45,7 @@
<gfe:pool id="combo-servers" servers="skullbox[9110]">
<gfe:server host="scorch" port="21480"/>
<gfe:server host="scorn" port="51515"/>
</gfe:pool>
</beans>