diff --git a/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle b/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle index 4f8f3b9..16a6010 100644 --- a/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle +++ b/samples/xml/gemfire-clientserver/spring-session-sample-xml-gemfire-clientserver.gradle @@ -6,7 +6,6 @@ dependencies { compile project(':spring-session-data-geode') compile "org.springframework:spring-web" - compile "org.springframework.data:spring-data-geode-test" compile "org.webjars:bootstrap" compile "org.webjars:webjars-taglib" compile jstlDependencies diff --git a/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java b/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java index f2a032e..43b8b92 100644 --- a/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java +++ b/samples/xml/gemfire-clientserver/src/main/java/sample/ClientServerReadyBeanPostProcessor.java @@ -16,28 +16,107 @@ package sample; +import java.io.IOException; +import java.net.Socket; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.data.gemfire.client.ClientCacheFactoryBean; -import org.springframework.data.gemfire.tests.integration.ClientServerIntegrationTestsSupport; +import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration; @SuppressWarnings("unused") -public class ClientServerReadyBeanPostProcessor extends ClientServerIntegrationTestsSupport - implements BeanPostProcessor { +public class ClientServerReadyBeanPostProcessor implements BeanPostProcessor { - @Value("${spring.session.data.geode.cache.server.port:${spring.data.gemfire.cache.server.port:40404}}") + private static final long DEFAULT_TIMEOUT = TimeUnit.SECONDS.toMillis(20); + + private final AtomicBoolean verifyGemFireServerIsRunning = new AtomicBoolean(true); + + @Value("${spring.data.gemfire.cache.server.port:40404}") private int port; - @Value("${spring.session.data.geode.cache.server.host:${spring.data.gemfire.cache.server.host:localhost}}") - private String host; - + @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof ClientCacheFactoryBean) { - waitForServerToStart(host, port); + if (isGemFireServerRunningVerificationEnabled(bean, beanName)) { + waitOn(getGemFireServerSocketCondition(this.port)); } return bean; } + + private boolean isGemFireServerRunningVerificationEnabled(Object bean, String beanName) { + + return isSessionGemFireRegion(bean, beanName) + && this.verifyGemFireServerIsRunning.compareAndSet(true, false); + } + + private boolean isSessionGemFireRegion(Object bean, String beanName) { + return GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME.equals(beanName); + } + + private Condition getGemFireServerSocketCondition(int port) { + + AtomicBoolean gemfireServerRunning = new AtomicBoolean(false); + + return () -> { + + Socket socket = null; + + try { + if (!gemfireServerRunning.get()) { + socket = new Socket("localhost", port); + gemfireServerRunning.set(true); + } + } + catch (IOException ignore) { } + finally { + safeClose(socket); + } + + return gemfireServerRunning.get(); + }; + } + + private boolean safeClose(Socket socket) { + + try { + if (socket != null) { + socket.close(); + } + + return true; + } + catch (IOException ignore) { + return false; + } + } + + private boolean waitOn(Condition condition) { + + long timeout = System.currentTimeMillis() + DEFAULT_TIMEOUT; + + while (doWait(condition, timeout)) { + synchronized (this) { + try { + TimeUnit.MICROSECONDS.timedWait(this, 500L); + } + catch (InterruptedException cause) { + Thread.currentThread().interrupt(); + } + } + } + + return condition.evaluate(); + } + + private boolean doWait(Condition condition, long timeout) { + return !Thread.currentThread().isInterrupted() && System.currentTimeMillis() < timeout && !condition.evaluate(); + } + + @FunctionalInterface + interface Condition { + boolean evaluate(); + } } diff --git a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/application.properties b/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/application.properties deleted file mode 100644 index d63e69a..0000000 --- a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.data.gemfire.cache.server.host=localhost -spring.data.gemfire.cache.server.port=42424 diff --git a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml b/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml index 0ec8aa4..c773206 100644 --- a/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml +++ b/samples/xml/gemfire-clientserver/src/main/resources/META-INF/spring/session-server.xml @@ -15,12 +15,12 @@ - + - SpringSessionDataGeodeXmlSampleServer - ${spring.session.data.gemfire.log-level:error} + SpringSessionDataGeodeSampleXmlServer + ${spring.session.data.geode.log-level:error} @@ -28,8 +28,8 @@ diff --git a/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml b/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml index 32ed1bd..bd17de9 100644 --- a/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml +++ b/samples/xml/gemfire-clientserver/src/main/webapp/WEB-INF/spring/session-client.xml @@ -15,7 +15,7 @@ - + @@ -29,7 +29,7 @@ -