diff --git a/src/main/java/teetime/framework/AbstractRunnableStage.java b/src/main/java/teetime/framework/AbstractRunnableStage.java index e2f87810a016fdadbf0e6221666c7d2937afa194..d9116d45cb552c56a3fc7c6ec96f6898c4dcf7e7 100644 --- a/src/main/java/teetime/framework/AbstractRunnableStage.java +++ b/src/main/java/teetime/framework/AbstractRunnableStage.java @@ -49,9 +49,9 @@ abstract class AbstractRunnableStage implements Runnable { throw new IllegalArgumentException("Argument stage may not have a nullable owning context"); } try { - do { + while (!stage.shouldBeTerminated()) { executeStage(); - } while (!stage.shouldBeTerminated()); + } } catch (TerminateException e) { this.stage.terminate(); stage.getOwningContext().abortConfigurationRun(); @@ -65,13 +65,16 @@ abstract class AbstractRunnableStage implements Runnable { } catch (InterruptedException e) { this.logger.error(TERMINATING_THREAD_DUE_TO_THE_FOLLOWING_EXCEPTION, e); } - } finally { + } finally + + { if (stage.getTerminationStrategy() != TerminationStrategy.BY_INTERRUPT) { stage.getOwningContext().getThreadService().getRunnableCounter().dec(); } } logger.debug("Finished runnable stage. (" + stage.getId() + ")"); + } protected abstract void beforeStageExecution() throws InterruptedException; diff --git a/src/main/java/teetime/framework/AbstractStage.java b/src/main/java/teetime/framework/AbstractStage.java index 308165a764b4100c8b730b0eb345f0ca51c50988..da8144202a25ec4c17f880f3b3b0e499ad3e7d38 100644 --- a/src/main/java/teetime/framework/AbstractStage.java +++ b/src/main/java/teetime/framework/AbstractStage.java @@ -55,7 +55,11 @@ public abstract class AbstractStage extends Stage { @Override public void onSignal(final ISignal signal, final InputPort<?> inputPort) { if (!this.signalAlreadyReceived(signal, inputPort)) { - signal.trigger(this); + try { + signal.trigger(this); + } catch (Exception e) { + this.getOwningContext().abortConfigurationRun(); + } for (OutputPort<?> outputPort : outputPorts.getOpenedPorts()) { outputPort.sendSignal(signal); } diff --git a/src/main/java/teetime/framework/signal/AbstractSignal.java b/src/main/java/teetime/framework/signal/AbstractSignal.java deleted file mode 100644 index cd67b53cebfebd785c6fe3fdfecc3f7462a05782..0000000000000000000000000000000000000000 --- a/src/main/java/teetime/framework/signal/AbstractSignal.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://christianwulf.github.io/teetime) - * - * 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. - */ -package teetime.framework.signal; - -import java.util.LinkedList; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -abstract class AbstractSignal implements ISignal { - - protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractSignal.class); - - protected final List<Exception> catchedExceptions = new LinkedList<Exception>(); - - protected AbstractSignal() { - super(); - } - - public List<Exception> getCatchedExceptions() { - return this.catchedExceptions; - } - -} diff --git a/src/main/java/teetime/framework/signal/ISignal.java b/src/main/java/teetime/framework/signal/ISignal.java index 13ecf747a31ae2d69a8d697267e8b7cf81e51f4b..80469661a1a5d7ff68667135081f7888c668ccd7 100644 --- a/src/main/java/teetime/framework/signal/ISignal.java +++ b/src/main/java/teetime/framework/signal/ISignal.java @@ -23,7 +23,7 @@ import teetime.framework.Stage; public interface ISignal { - void trigger(Stage stage); + void trigger(Stage stage) throws Exception; // Only used by the merger so far boolean mayBeTriggered(Set<InputPort<?>> receivedInputPorts, List<InputPort<?>> allInputPorts); diff --git a/src/main/java/teetime/framework/signal/StartingSignal.java b/src/main/java/teetime/framework/signal/StartingSignal.java index cb668ba995174e82d2b0643c327e5729d54c986b..f8e001592ba6250696beef8201c61fd8c64307da 100644 --- a/src/main/java/teetime/framework/signal/StartingSignal.java +++ b/src/main/java/teetime/framework/signal/StartingSignal.java @@ -19,20 +19,13 @@ import java.util.List; import java.util.Set; import teetime.framework.InputPort; -import teetime.framework.RuntimeServiceFacade; import teetime.framework.Stage; -public final class StartingSignal extends AbstractSignal { +public final class StartingSignal implements ISignal { @Override - public void trigger(final Stage stage) { - try { - stage.onStarting(); - } catch (final Exception e) { // NOCS NOPMD (Stages can throw any arbitrary Exception) - this.catchedExceptions.add(e); - RuntimeServiceFacade.INSTANCE.abortExecution(stage); - LOGGER.error("Exception while sending the start signal", e); - } + public void trigger(final Stage stage) throws Exception { + stage.onStarting(); } @Override diff --git a/src/main/java/teetime/framework/signal/TerminatingSignal.java b/src/main/java/teetime/framework/signal/TerminatingSignal.java index 96ef9d3be7b05512cc2a521ba4c9213ede16abbc..f17b532a66bb26b634f5de32d35707e5a2249a32 100644 --- a/src/main/java/teetime/framework/signal/TerminatingSignal.java +++ b/src/main/java/teetime/framework/signal/TerminatingSignal.java @@ -19,20 +19,13 @@ import java.util.List; import java.util.Set; import teetime.framework.InputPort; -import teetime.framework.RuntimeServiceFacade; import teetime.framework.Stage; -public final class TerminatingSignal extends AbstractSignal { +public final class TerminatingSignal implements ISignal { @Override - public void trigger(final Stage stage) { - try { - stage.onTerminating(); - } catch (final Exception e) { // NOCS NOPMD (Stages can throw any arbitrary Exception) - this.catchedExceptions.add(e); - RuntimeServiceFacade.INSTANCE.abortExecution(stage); - LOGGER.error("Exception while sending the termination signal", e); - } + public void trigger(final Stage stage) throws Exception { + stage.onTerminating(); } @Override