diff --git a/li.strolch.service/src/main/java/li/strolch/execution/Controller.java b/li.strolch.service/src/main/java/li/strolch/execution/Controller.java index f1bffd546..a8eb8c9ca 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/Controller.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/Controller.java @@ -1,8 +1,8 @@ package li.strolch.execution; +import static java.util.Collections.synchronizedMap; import static li.strolch.runtime.StrolchConstants.SYSTEM_USER_AGENT; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; @@ -52,7 +52,7 @@ public class Controller { this.activityType = activity.getType(); this.activityId = activity.getId(); this.activity = activity; - this.inExecution = Collections.synchronizedMap(new HashMap<>()); + this.inExecution = synchronizedMap(new HashMap<>()); } public String getRealm() { @@ -83,6 +83,10 @@ public class Controller { return executionPolicy; } + public void removeExecutionPolicy(Action action) { + this.inExecution.remove(action.getLocator()); + } + protected StrolchTransaction openTx(Certificate cert) { return this.executionHandler.openTx(this.realm, cert, getClass(), false); } @@ -145,7 +149,7 @@ public class Controller { command.validate(); command.doCommand(); - notifyObserverUpdate(); + updateObservers(); return command.needsRetriggerOfExecution(); } @@ -173,7 +177,7 @@ public class Controller { command.validate(); command.doCommand(); - notifyObserverUpdate(); + updateObservers(); // flush so we can see the changes performed tx.flush(); @@ -215,6 +219,8 @@ public class Controller { tx.commitOnClose(); } }); + + updateObservers(); } /** @@ -243,6 +249,8 @@ public class Controller { tx.commitOnClose(); } }); + + updateObservers(); } /** @@ -271,6 +279,8 @@ public class Controller { tx.commitOnClose(); } }); + + updateObservers(); } /** @@ -319,7 +329,7 @@ public class Controller { }); } - private void notifyObserverUpdate() { + private void updateObservers() { StrolchRealm realm = this.executionHandler.getContainer().getRealm(this.realm); if (!realm.isUpdateObservers()) return; diff --git a/li.strolch.service/src/main/java/li/strolch/execution/command/ExecuteActivityCommand.java b/li.strolch.service/src/main/java/li/strolch/execution/command/ExecuteActivityCommand.java index c63593f48..279439368 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/command/ExecuteActivityCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/command/ExecuteActivityCommand.java @@ -72,6 +72,10 @@ public class ExecuteActivityCommand extends BasePlanningAndExecutionCommand ConfirmationPolicy confirmationPolicy = getConfirmationPolicy(action); ExecutionPolicy executionPolicy = getExecutionPolicy(action); + if (executionPolicy.isStopped()) { + this.controller.removeExecutionPolicy(action); + executionPolicy = getExecutionPolicy(action); + } if (!executionPolicy.isExecutable(action)) { logger.info("Action " + action.getLocator() + " is not yet executable."); diff --git a/li.strolch.service/src/main/java/li/strolch/execution/policy/DurationExecution.java b/li.strolch.service/src/main/java/li/strolch/execution/policy/DurationExecution.java index c48848b84..6df402f69 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/policy/DurationExecution.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/policy/DurationExecution.java @@ -1,10 +1,11 @@ package li.strolch.execution.policy; -import li.strolch.model.Locator; +import static li.strolch.runtime.StrolchConstants.PolicyConstants.BAG_OBJECTIVES; +import static li.strolch.runtime.StrolchConstants.PolicyConstants.PARAM_DURATION; + import li.strolch.model.activity.Action; import li.strolch.model.parameter.DurationParameter; import li.strolch.persistence.api.StrolchTransaction; -import li.strolch.runtime.StrolchConstants.PolicyConstants; /** *

@@ -16,8 +17,6 @@ import li.strolch.runtime.StrolchConstants.PolicyConstants; */ public class DurationExecution extends SimpleExecution { - protected Locator actionLoc; - public DurationExecution(StrolchTransaction tx) { super(tx); } @@ -25,19 +24,9 @@ public class DurationExecution extends SimpleExecution { @Override public void toExecution(Action action) { - DurationParameter durationP = action - .findParameter(PolicyConstants.BAG_OBJECTIVES, PolicyConstants.PARAM_DURATION, true); - - String realmName = tx().getRealmName(); - this.actionLoc = action.getLocator(); - logger.info("Executing action " + actionLoc + " has a duration of " + durationP.getValueAsString()); - getDelayedExecutionTimer().execute(realmName, getContainer(), this.actionLoc, durationP.toMillis()); + DurationParameter durationP = action.findParameter(BAG_OBJECTIVES, PARAM_DURATION, true); + delayToExecutedBy(durationP.getDuration()); super.toExecution(action); } - - @Override - protected void handleStopped() { - getDelayedExecutionTimer().cancel(this.actionLoc); - } } diff --git a/li.strolch.service/src/main/java/li/strolch/execution/policy/SimpleExecution.java b/li.strolch.service/src/main/java/li/strolch/execution/policy/SimpleExecution.java index 01cc6b5e9..a99558338 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/policy/SimpleExecution.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/policy/SimpleExecution.java @@ -83,9 +83,4 @@ public class SimpleExecution extends ExecutionPolicy { addMessage(message); getController().asyncToWarning(message.getLocator()); } - - @Override - protected void handleStopped() { - getDelayedExecutionTimer().cancel(this.actionLoc); - } } diff --git a/li.strolch.service/src/main/java/li/strolch/execution/service/SetActionToErrorService.java b/li.strolch.service/src/main/java/li/strolch/execution/service/SetActionToErrorService.java index dcc4a55a4..403c3d709 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/service/SetActionToErrorService.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/service/SetActionToErrorService.java @@ -25,22 +25,22 @@ public class SetActionToErrorService extends AbstractService