diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/ActivitiInterface.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/ActivitiInterface.java index c606ff872f7..a145b80cf02 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/ActivitiInterface.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/ActivitiInterface.java @@ -103,7 +103,7 @@ public void startActivitiProcessInstance(StartProcessCommand spic, Task task, Op processInterfaceFinder); event.setRunning(!pi.isEnded()); LOGGER.trace("Event to be sent to IDM: {}", event); - wfTaskController.onProcessEvent(event, task, result); + wfTaskController.onProcessEvent(event, true, task, result); } } @@ -150,7 +150,7 @@ public void queryActivitiProcessInstance(QueryProcessCommand qpc, Task task, Ope LOGGER.trace("Running process instance = {}, isRunning: {}", pi, qpr.isRunning()); LOGGER.trace("Response to be sent to midPoint: {}", qpr); - wfTaskController.onProcessEvent(qpr, task, result); + wfTaskController.onProcessEvent(qpr, false, task, result); } public void notifyMidpointAboutProcessFinishedEvent(DelegateExecution execution) { @@ -176,7 +176,7 @@ private void notifyMidpointAboutProcessEvent(ProcessEvent event) { return; } try { - wfTaskController.onProcessEvent(event, task, result); + wfTaskController.onProcessEvent(event, false, task, result); } catch (SchemaException|ObjectNotFoundException|ObjectAlreadyExistsException|RuntimeException e) { throw new SystemException("Couldn't process a process-related event: " + e.getMessage(), e); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskController.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskController.java index 72f5fca22aa..b706658913b 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskController.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskController.java @@ -49,7 +49,6 @@ import com.evolveum.midpoint.wf.impl.processors.primary.PcpWfTask; import com.evolveum.midpoint.wf.impl.processors.primary.PrimaryChangeProcessor; import com.evolveum.midpoint.wf.impl.util.MiscDataUtil; -import com.evolveum.midpoint.wf.util.ApprovalUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import org.apache.commons.lang.BooleanUtils; @@ -230,7 +229,12 @@ private void startWorkflowProcessInstance(WfTask wfTask, WfTaskCreationInstructi LOGGER.trace("startWorkflowProcessInstance finished"); } - public void onProcessEvent(ProcessEvent event, Task task, OperationResult result) + // skipProcessEndNotification is a bit of hack: It is to avoid sending process end notification twice if the process ends + // in the same thread in which it was started (MID-4850). It could be probably solved in a more brave way e.g. by removing + // the whole onProcessEvent call in startActivitiProcessInstance but that could have other consequences. + // + // We get rid of these hacks when we replace Activiti with our own implementation (4.0 or 4.1). + public void onProcessEvent(ProcessEvent event, boolean skipProcessEndNotification, Task task, OperationResult result) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException { WfTask wfTask = recreateWfTask(task); @@ -249,7 +253,7 @@ public void onProcessEvent(ProcessEvent event, Task task, OperationResult result wfTask.commitChanges(result); - if (event instanceof ProcessFinishedEvent || !event.isRunning()) { + if (!skipProcessEndNotification && (event instanceof ProcessFinishedEvent || !event.isRunning())) { onProcessFinishedEvent(event, wfTask, result); } } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/legacy/TestUserChangeApprovalLegacy.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/legacy/TestUserChangeApprovalLegacy.java index 6a4c2e5b44f..e3c37f5b615 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/legacy/TestUserChangeApprovalLegacy.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/legacy/TestUserChangeApprovalLegacy.java @@ -161,6 +161,8 @@ boolean decideOnApproval(String executionId) throws Exception { return decideOnRoleApproval(executionId); } }); + displayAllNotifications(); + checkDummyTransportMessages("simpleWorkflowNotifier-Processes", 2); // start + end } protected void assertWfContextAfterClockworkRun(Task rootTask, List subtasks, OperationResult result, String... processNames) throws Exception { @@ -774,6 +776,8 @@ boolean decideOnApproval(String executionId) throws Exception { } }); + displayAllNotifications(); + checkDummyTransportMessages("simpleWorkflowNotifier-Processes", 2); // start + end } @Test(enabled = true) @@ -838,6 +842,8 @@ boolean decideOnApproval(String executionId) throws Exception { } }); + displayAllNotifications(); + checkDummyTransportMessages("simpleWorkflowNotifier-Processes", 2); // start + end } @Test