diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 3f594729b62c7697929785785c8ab68fd72ac214..3e47bfad5fc22aea16a7ccc09e099d745dfd89e5 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -10,6 +10,10 @@ <action dev="ntd" type="add" issue="32"> Introduced a generic exception handling for stages. </action> + <action dev="ntd" type="update" issue="92"> + Introduced new method (returns void) in Analysis, which starts the execution of the analysis. + Marked old method as deprecated. + </action> </release> <release version="1.0" date="19.12.2014" description="Initial release"> diff --git a/src/main/java/teetime/framework/AbstractRunnableStage.java b/src/main/java/teetime/framework/AbstractRunnableStage.java index 1aec986bc2b8e4fabfe6ed0a0e54a2f7d7f5938e..b673d353fe139d6a1a7a0348cc55a80bb45156fe 100644 --- a/src/main/java/teetime/framework/AbstractRunnableStage.java +++ b/src/main/java/teetime/framework/AbstractRunnableStage.java @@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory; import teetime.framework.exceptionHandling.StageException; import teetime.framework.exceptionHandling.StageExceptionHandler; import teetime.framework.exceptionHandling.StageExceptionHandler.FurtherExecution; +import teetime.framework.signal.TerminatingSignal; abstract class AbstractRunnableStage implements Runnable { @@ -52,6 +53,14 @@ abstract class AbstractRunnableStage implements Runnable { this.logger.debug("Finished runnable stage. (" + this.stage.getId() + ")"); if (failed) { + if (stage.getTerminationStrategy() == TerminationStrategy.BY_SIGNAL) { + TerminatingSignal signal = new TerminatingSignal(); + // TODO: Check if this is really needed... it seems like signals are passed on after their first arrival + InputPort<?>[] inputPorts = stage.getInputPorts(); + for (int i = 0; i < inputPorts.length; i++) { + stage.onSignal(signal, inputPorts[i]); + } + } throw new IllegalStateException("Terminated by StageExceptionListener"); } } diff --git a/src/main/java/teetime/framework/Analysis.java b/src/main/java/teetime/framework/Analysis.java index 6f7dab0ad1aebb8a51b4ed0684288f8e11239d3d..cc12eb81cdc957b6950d15a45d7e77960385a8e4 100644 --- a/src/main/java/teetime/framework/Analysis.java +++ b/src/main/java/teetime/framework/Analysis.java @@ -11,7 +11,6 @@ import org.slf4j.LoggerFactory; import teetime.framework.exceptionHandling.IgnoringStageListener; import teetime.framework.exceptionHandling.StageExceptionHandler; -import teetime.framework.signal.TerminatingSignal; import teetime.framework.signal.ValidatingSignal; import teetime.framework.validation.AnalysisNotValidException; import teetime.util.Pair; @@ -140,8 +139,11 @@ public class Analysis implements UncaughtExceptionHandler { * This method will start the Analysis and all containing stages. * * @return a collection of thread/throwable pairs + * + * @deprecated As of release 1.1, replaced by {@link #execute()} */ - public void start() { + @Deprecated + public Collection<Pair<Thread, Throwable>> start() { // start analysis startThreads(this.consumerThreads); startThreads(this.finiteProducerThreads); @@ -170,10 +172,18 @@ public class Analysis implements UncaughtExceptionHandler { for (Thread thread : this.infiniteProducerThreads) { thread.interrupt(); } + + return this.exceptions; + } + + /** + * This method will start the Analysis and all containing stages. + */ + public void execute() { + start(); if (!exceptions.isEmpty()) { throw new RuntimeException("Errors while running analysis"); // TODO: add exceptions } - // return this.exceptions; } private void startThreads(final Iterable<Thread> threads) { @@ -199,15 +209,8 @@ public class Analysis implements UncaughtExceptionHandler { LOGGER.warn("Thread " + thread + " was interrupted. Terminating analysis now."); for (Stage stage : configuration.getThreadableStageJobs()) { if (stage.getOwningThread() != thread) { - switch (stage.getTerminationStrategy()) { - case BY_SELF_DECISION: { - stage.terminate(); // onSignal would also work, but this will execute in its own Thread - } - case BY_SIGNAL: { - final TerminatingSignal terminatingSignal = new TerminatingSignal(); - stage.onSignal(terminatingSignal, null); - } - default: + if (stage.getTerminationStrategy() == TerminationStrategy.BY_SELF_DECISION) { + stage.terminate(); } } } diff --git a/src/site/markdown/wiki b/src/site/markdown/wiki index 0e4474577e1f49bc96e734c286b2d9e0363895e8..a93581905ef7b0584d52eae1898148ffa6201a31 160000 --- a/src/site/markdown/wiki +++ b/src/site/markdown/wiki @@ -1 +1 @@ -Subproject commit 0e4474577e1f49bc96e734c286b2d9e0363895e8 +Subproject commit a93581905ef7b0584d52eae1898148ffa6201a31