From 1b9e65cdc11dc0addc2fda79ba6759056d3f790a Mon Sep 17 00:00:00 2001 From: John Blum Date: Fri, 18 Nov 2016 19:43:09 -0800 Subject: [PATCH] SGF-570 - Respect manual-start on Gateway Senders/Receivers but no longer couple the start/stop lifecycle to the Spring container. --- .../wan/GatewayReceiverFactoryBean.java | 106 ++++++----------- .../gemfire/wan/GatewaySenderFactoryBean.java | 107 +++++------------- ...GatewayReceiverAutoStartNamespaceTest.java | 1 - ...ewayReceiverDefaultStartNamespaceTest.java | 1 - ...tewayReceiverManualStartNamespaceTest.java | 2 - .../test/StubGatewayReceiverFactory.java | 7 +- 6 files changed, 69 insertions(+), 155 deletions(-) diff --git a/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java index 3aa78f40..092df5b3 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewayReceiverFactoryBean.java @@ -15,22 +15,20 @@ */ package org.springframework.data.gemfire.wan; -import java.io.IOException; import java.util.List; -import org.springframework.context.SmartLifecycle; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.wan.GatewayReceiver; import com.gemstone.gemfire.cache.wan.GatewayReceiverFactory; import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; +import org.springframework.data.gemfire.util.CollectionUtils; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + /** * Spring FactoryBean for creating a GemFire {@link GatewayReceiver}. - * + * * @author David Turanski * @author John Blum * @see org.springframework.context.SmartLifecycle @@ -41,8 +39,7 @@ import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; * @since 1.2.2 */ @SuppressWarnings("unused") -public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean - implements SmartLifecycle { +public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean { private boolean manualStart = false; @@ -59,35 +56,39 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean< private String hostnameForSenders; /** - * Constructs an instance of the GatewayReceiverFactoryBean class for configuring an initializing - * a GemFire Gateway Receiver. + * Constructs an instance of the {@link GatewayReceiverFactoryBean} class for configuring and initializing + * a GemFire {@link GatewayReceiver}. * - * @param cache a reference to the GemFire Cache used to setup the Gateway Receiver. + * @param cache reference to the GemFire {@link Cache} used to create the {@link GatewayReceiver}. + * @see com.gemstone.gemfire.cache.Cache */ public GatewayReceiverFactoryBean(Cache cache) { super(cache); } + /** + * @inheritDoc + */ @Override public GatewayReceiver getObject() throws Exception { return gatewayReceiver; } + /** + * @inheritDoc + */ @Override public Class getObjectType() { return (gatewayReceiver != null ? gatewayReceiver.getClass() : GatewayReceiver.class); } + /** + * @inheritDoc + */ @Override protected void doInit() throws Exception { GatewayReceiverFactory gatewayReceiverFactory = cache.createGatewayReceiverFactory(); - if (!CollectionUtils.isEmpty(transportFilters)) { - for (GatewayTransportFilter transportFilter : transportFilters) { - gatewayReceiverFactory.addGatewayTransportFilter(transportFilter); - } - } - if (StringUtils.hasText(bindAddress)) { gatewayReceiverFactory.setBindAddress(bindAddress); } @@ -96,28 +97,36 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean< gatewayReceiverFactory.setHostnameForSenders(hostnameForSenders); } - if (maximumTimeBetweenPings != null) { - gatewayReceiverFactory.setMaximumTimeBetweenPings(maximumTimeBetweenPings); - } + int localStartPort = defaultPort(startPort, GatewayReceiver.DEFAULT_START_PORT); + int localEndPort = defaultPort(endPort, GatewayReceiver.DEFAULT_END_PORT); - int localStartPort = (startPort != null ? startPort : GatewayReceiver.DEFAULT_START_PORT); - int localEndPort = (endPort != null ? endPort : GatewayReceiver.DEFAULT_END_PORT); - - Assert.isTrue(localStartPort <= localEndPort, String.format("'startPort' must be less than or equal to %1$d.", - localEndPort)); + Assert.isTrue(localStartPort <= localEndPort, + String.format("'startPort' must be less than or equal to %d.", localEndPort)); gatewayReceiverFactory.setStartPort(localStartPort); gatewayReceiverFactory.setEndPort(localEndPort); - gatewayReceiverFactory.setManualStart(true); + gatewayReceiverFactory.setManualStart(manualStart); + + if (maximumTimeBetweenPings != null) { + gatewayReceiverFactory.setMaximumTimeBetweenPings(maximumTimeBetweenPings); + } if (socketBufferSize != null) { gatewayReceiverFactory.setSocketBufferSize(socketBufferSize); } + for (GatewayTransportFilter transportFilter : CollectionUtils.nullSafeList(transportFilters)) { + gatewayReceiverFactory.addGatewayTransportFilter(transportFilter); + } + gatewayReceiver = gatewayReceiverFactory.create(); } - public void setGatewayReceiver(final GatewayReceiver gatewayReceiver) { + protected int defaultPort(Integer port, int defaultPort) { + return (port != null ? port : defaultPort); + } + + public void setGatewayReceiver(GatewayReceiver gatewayReceiver) { this.gatewayReceiver = gatewayReceiver; } @@ -152,45 +161,4 @@ public class GatewayReceiverFactoryBean extends AbstractWANComponentFactoryBean< public void setTransportFilters(List transportFilters) { this.transportFilters = transportFilters; } - - @Override - public boolean isAutoStartup() { - return !manualStart; - } - - @Override - public int getPhase() { - return Integer.MAX_VALUE; - } - - @Override - public boolean isRunning() { - return gatewayReceiver.isRunning(); - } - - @Override - public void start() { - Assert.state(gatewayReceiver != null, "The GatewayReceiver was not properly configured and initialized!"); - - if (!isRunning()) { - try { - gatewayReceiver.start(); - } - catch (IOException e) { - throw new RuntimeException("Failed to start Gateway Receiver due to I/O error.", e); - } - } - } - - @Override - public void stop() { - gatewayReceiver.stop(); - } - - @Override - public void stop(final Runnable callback) { - stop(); - callback.run(); - } - } diff --git a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java index db43e625..9933c516 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java @@ -17,10 +17,6 @@ package org.springframework.data.gemfire.wan; import java.util.List; -import org.springframework.context.SmartLifecycle; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; - import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.util.Gateway; import com.gemstone.gemfire.cache.wan.GatewayEventFilter; @@ -29,22 +25,23 @@ import com.gemstone.gemfire.cache.wan.GatewaySender; import com.gemstone.gemfire.cache.wan.GatewaySenderFactory; import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.data.gemfire.util.CollectionUtils; +import org.springframework.util.Assert; + /** - * FactoryBean for creating a parallel or serial GemFire {@link GatewaySender}. + * Spring {@link FactoryBean} for creating a parallel or serial GemFire {@link GatewaySender}. * * @author David Turanski * @author John Blum - * @see org.springframework.context.SmartLifecycle * @see org.springframework.data.gemfire.wan.AbstractWANComponentFactoryBean * @see com.gemstone.gemfire.cache.Cache - * @see com.gemstone.gemfire.cache.util.Gateway * @see com.gemstone.gemfire.cache.wan.GatewaySender * @see com.gemstone.gemfire.cache.wan.GatewaySenderFactory * @since 1.2.2 */ @SuppressWarnings("unused") -public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean - implements SmartLifecycle { +public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean { private boolean manualStart = false; @@ -75,25 +72,35 @@ public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean getObjectType() { return (gatewaySender != null ? gatewaySender.getClass() : GatewaySender.class); } + /** + * @inheritDoc + */ @Override protected void doInit() { GatewaySenderFactory gatewaySenderFactory = (this.factory != null ? (GatewaySenderFactory) factory @@ -103,6 +110,10 @@ public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean gatewayTransportFilters) { this.transportFilters = gatewayTransportFilters; } - - /* (non-Javadoc) - * @see org.springframework.context.SmartLifecycle#isAutoStartup() - */ - @Override - public boolean isAutoStartup() { - return !manualStart; - } - - /* (non-Javadoc) - * @see org.springframework.context.Phased#getPhase() - */ - @Override - public int getPhase() { - return Integer.MAX_VALUE; - } - - /* (non-Javadoc) - * @see org.springframework.context.Lifecycle#isRunning() - */ - @Override - public boolean isRunning() { - return gatewaySender.isRunning(); - } - - /* (non-Javadoc) - * @see org.springframework.context.Lifecycle#start() - */ - @Override - public synchronized void start() { - Assert.notNull(gatewaySender, "The GatewaySender was not properly configured and initialized!"); - - if (!isRunning()){ - gatewaySender.start(); - } - } - - /* (non-Javadoc) - * @see org.springframework.context.Lifecycle#stop() - */ - @Override - public void stop() { - gatewaySender.stop(); - } - - /* (non-Javadoc) - * @see org.springframework.context.SmartLifecycle#stop(java.lang.Runnable) - */ - @Override - public void stop(Runnable callback) { - stop(); - callback.run(); - } - } diff --git a/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverAutoStartNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverAutoStartNamespaceTest.java index 2eefe88a..89640d0e 100644 --- a/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverAutoStartNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverAutoStartNamespaceTest.java @@ -63,7 +63,6 @@ public class GatewayReceiverAutoStartNamespaceTest { public void testAuto() throws Exception { assertNotNull("The 'Auto' GatewayReceiverFactoryBean was not properly configured and initialized!", autoGatewayReceiverFactory); - assertTrue(autoGatewayReceiverFactory.isAutoStartup()); GatewayReceiver autoGatewayReceiver = autoGatewayReceiverFactory.getObject(); diff --git a/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverDefaultStartNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverDefaultStartNamespaceTest.java index 6b21a01e..6fa5333d 100644 --- a/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverDefaultStartNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverDefaultStartNamespaceTest.java @@ -63,7 +63,6 @@ public class GatewayReceiverDefaultStartNamespaceTest { public void testDefault() throws Exception { assertNotNull("The 'Default' GatewayReceiverFactoryBean was not properly configured and initialized!", defaultGatewayReceiverFactory); - assertTrue(defaultGatewayReceiverFactory.isAutoStartup()); GatewayReceiver defaultGatewayReceiver = defaultGatewayReceiverFactory.getObject(); diff --git a/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverManualStartNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverManualStartNamespaceTest.java index 7345d196..e1b21a5c 100644 --- a/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverManualStartNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/xml/GatewayReceiverManualStartNamespaceTest.java @@ -62,7 +62,6 @@ public class GatewayReceiverManualStartNamespaceTest { public void testManual() throws Exception { assertNotNull("The 'Manual' GatewayReceiverFactoryBean was not properly configured and initialized!", manualGatewayReceiverFactory); - assertFalse(manualGatewayReceiverFactory.isAutoStartup()); GatewayReceiver manualGatewayReceiver = manualGatewayReceiverFactory.getObject(); @@ -75,5 +74,4 @@ public class GatewayReceiverManualStartNamespaceTest { assertFalse(manualGatewayReceiver.isRunning()); assertEquals(8192, manualGatewayReceiver.getSocketBufferSize()); } - } diff --git a/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java b/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java index 341ceb38..eeb6ad8d 100644 --- a/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java +++ b/src/test/java/org/springframework/data/gemfire/test/StubGatewayReceiverFactory.java @@ -1,11 +1,11 @@ /* * Copyright 2002-2013 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. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. @@ -142,6 +142,7 @@ public class StubGatewayReceiverFactory implements GatewayReceiverFactory { @Override public GatewayReceiverFactory setManualStart(final boolean manualStart) { this.manualStart = manualStart; + this.running = !manualStart; return this; }