diff --git a/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/AbstractLightyModule.java b/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/AbstractLightyModule.java index ef7ea0e27..ab1cb4721 100644 --- a/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/AbstractLightyModule.java +++ b/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/AbstractLightyModule.java @@ -7,32 +7,27 @@ */ package io.lighty.core.controller.api; -import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; import javax.servlet.ServletException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This abstract class implement {@link LightyModule} interface with - * synchronization of {@link LightyModule#start()}, - * {@link LightyModule#startBlocking()} and {@link LightyModule#shutdown()} + * synchronization of {@link LightyModule#start()} and {@link LightyModule#shutdown()} * methods. Users who don't want to implement their own synchronization * can extend this class and provide just * {@link AbstractLightyModule#initProcedure()} and * {@link AbstractLightyModule#stopProcedure()} methods.These methods * will be then automatically called in - * {@link AbstractLightyModule#start()}, - * {@link AbstractLightyModule#startBlocking()} and + * {@link AbstractLightyModule#start()} and * {@link AbstractLightyModule#shutdown()} methods. * *

@@ -63,7 +58,6 @@ */ public abstract class AbstractLightyModule implements LightyModule { private static final Logger LOG = LoggerFactory.getLogger(AbstractLightyModule.class); - private final CountDownLatch shutdownLatch; private ListeningExecutorService executorService; private boolean executorIsProvided; private volatile boolean running; @@ -77,7 +71,6 @@ public AbstractLightyModule(final ExecutorService executorService) { this.executorService = MoreExecutors.listeningDecorator(executorService); this.executorIsProvided = true; } - this.shutdownLatch = new CountDownLatch(1); this.running = false; } @@ -127,35 +120,6 @@ public synchronized ListenableFuture start() { }); } - @Override - public void startBlocking() throws InterruptedException { - LOG.info("Start LightyModule {} and block until it will shutdown.", this.getClass().getSimpleName()); - start(); - LOG.debug("Waiting for LightyModule {} shutdown.", this.getClass().getSimpleName()); - this.shutdownLatch.await(); - LOG.info("LightyModule {} shutdown complete. Stop blocking.", this.getClass().getSimpleName()); - } - - /** - * Start and block until shutdown is requested. - * @param initFinishCallback callback that will be called after start is completed. - * @throws InterruptedException thrown in case module initialization fails. - */ - public void startBlocking(final Consumer initFinishCallback) throws InterruptedException { - Futures.addCallback(start(), new FutureCallback() { - @Override - public void onSuccess(final Boolean result) { - initFinishCallback.accept(true); - } - - @Override - public void onFailure(final Throwable cause) { - initFinishCallback.accept(false); - } - }, MoreExecutors.directExecutor()); - this.shutdownLatch.await(); - } - @Override public synchronized ListenableFuture shutdown() { if (!this.running) { @@ -191,7 +155,6 @@ public synchronized ListenableFuture shutdown() { @Override public final boolean shutdown(final long duration, final TimeUnit unit) { try { - shutdownLatch.countDown(); final var stopSuccess = shutdown().get(duration, unit); if (stopSuccess) { LOG.info("LightyModule {} stopped successfully!", getClass().getSimpleName()); diff --git a/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/LightyModule.java b/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/LightyModule.java index c88b5458e..494286c7d 100644 --- a/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/LightyModule.java +++ b/lighty-core/lighty-controller/src/main/java/io/lighty/core/controller/api/LightyModule.java @@ -26,13 +26,6 @@ public interface LightyModule { */ ListenableFuture start(); - /** - * Start and block until shutdown is requested. - * - * @throws InterruptedException thrown in case module initialization fails. - */ - void startBlocking() throws InterruptedException; - /** * Shutdown module. * diff --git a/lighty-core/lighty-controller/src/test/java/io/lighty/core/controller/api/LightyModuleTest.java b/lighty-core/lighty-controller/src/test/java/io/lighty/core/controller/api/LightyModuleTest.java index a57c9997f..c457489b0 100644 --- a/lighty-core/lighty-controller/src/test/java/io/lighty/core/controller/api/LightyModuleTest.java +++ b/lighty-core/lighty-controller/src/test/java/io/lighty/core/controller/api/LightyModuleTest.java @@ -7,13 +7,9 @@ */ package io.lighty.core.controller.api; -import com.google.common.util.concurrent.SettableFuture; import io.lighty.core.controller.impl.LightyControllerBuilder; import io.lighty.core.controller.impl.util.ControllerConfigUtils; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -26,7 +22,6 @@ public class LightyModuleTest { private static final long MAX_INIT_TIMEOUT = 15000L; private static final long MAX_SHUTDOWN_TIMEOUT = 15000L; - private static final long SLEEP_AFTER_SHUTDOWN_TIMEOUT = 800L; private ExecutorService executorService; private LightyModule moduleUnderTest; @@ -84,62 +79,4 @@ public void testShutdown_before_start() throws Exception { this.moduleUnderTest.shutdown(MAX_SHUTDOWN_TIMEOUT, TimeUnit.MILLISECONDS); Mockito.verify(executorService, Mockito.times(0)).execute(Mockito.any()); } - - @Test - public void testStartBlocking_and_shutdown() throws Exception { - this.moduleUnderTest = getModuleUnderTest(getExecutorService()); - startStopBlocking(this.moduleUnderTest instanceof AbstractLightyModule); - } - - @Test - public void testStartStopBlocking() throws Exception { - this.moduleUnderTest = getModuleUnderTest(getExecutorService()); - startStopBlocking(false); - } - - private void startStopBlocking(final boolean isAbstract) throws Exception { - Future startBlockingFuture; - if (isAbstract) { - startBlockingFuture = startBlockingOnLightyModuleAbstractClass(); - } else { - startBlockingFuture = startBlockingOnLightyModuleInterface(); - } - //test if thread which invokes startBlocking method is still running (it should be) - Assert.assertFalse(startBlockingFuture.isDone()); - - this.moduleUnderTest.shutdown(MAX_SHUTDOWN_TIMEOUT, TimeUnit.MILLISECONDS); - try { - //test if thread which invokes startBlocking method is done after shutdown was called - //(after small timeout due to synchronization); - startBlockingFuture.get(SLEEP_AFTER_SHUTDOWN_TIMEOUT, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - Assert.fail("Waiting for finish of startBlocking method thread timed out. you may consider to adjust" - + "timeout by overriding SLEEP_AFTER_SHUTDOWN_TIMEOUT", e); - } - - Mockito.verify(executorService, Mockito.times(2)).execute(Mockito.any()); - } - - private Future startBlockingOnLightyModuleAbstractClass() throws ExecutionException, InterruptedException { - SettableFuture initDoneFuture = SettableFuture.create(); - Future startFuture = Executors.newSingleThreadExecutor().submit(() -> { - ((AbstractLightyModule)this.moduleUnderTest).startBlocking(initDoneFuture::set); - return true; - }); - try { - initDoneFuture.get(MAX_INIT_TIMEOUT, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - Assert.fail("Init timed out.", e); - } - return startFuture; - } - - private Future startBlockingOnLightyModuleInterface() throws InterruptedException { - Future startFuture = Executors.newSingleThreadExecutor().submit(() -> { - this.moduleUnderTest.startBlocking(); - return true; - }); - Thread.sleep(MAX_INIT_TIMEOUT); - return startFuture; - } }