提交 5f8c72ef 编写于 作者: J Joram Barrez

Fix #587 : event subscriptions should only be deleted when sibling executions are not active

上级 adca1a37
......@@ -196,8 +196,28 @@ public class EndExecutionOperation extends AbstractOperation {
// If there are no more active child executions, the process can be continued
// If not (eg an embedded subprocess still has active elements, we cannot continue)
if (getNumberOfActiveChildExecutionsForExecution(executionEntityManager, parentExecution.getId()) == 0
|| isAllEventScopeExecutions(executionEntityManager, parentExecution)) {
List<ExecutionEntity> eventScopeExecutions = getEventScopeExecutions(executionEntityManager, parentExecution);
// Event scoped executions need to be deleted when there are no active siblings anymore,
// unless instances of the event subprocess itself. If there are no active siblings anymore,
// the current scope had ended and the event subprocess start event should stop listening to any trigger.
if (!eventScopeExecutions.isEmpty()) {
List<? extends ExecutionEntity> childExecutions = parentExecution.getExecutions();
boolean activeSiblings = false;
for (ExecutionEntity childExecutionEntity : childExecutions) {
if (!isInEventSubProcess(childExecutionEntity) && childExecutionEntity.isActive() && !childExecutionEntity.isEnded()) {
activeSiblings = true;
}
}
if (!activeSiblings) {
for (ExecutionEntity eventScopeExecution : eventScopeExecutions) {
executionEntityManager.deleteExecutionAndRelatedData(eventScopeExecution, null);
}
}
}
if (getNumberOfActiveChildExecutionsForExecution(executionEntityManager, parentExecution.getId()) == 0) {
ExecutionEntity executionToContinue = null;
......@@ -386,18 +406,16 @@ public class EndExecutionOperation extends AbstractOperation {
return activeChildExecutions;
}
protected boolean isAllEventScopeExecutions(ExecutionEntityManager executionEntityManager, ExecutionEntity parentExecution) {
boolean allEventScopeExecutions = true;
protected List<ExecutionEntity> getEventScopeExecutions(ExecutionEntityManager executionEntityManager, ExecutionEntity parentExecution) {
List<ExecutionEntity> eventScopeExecutions = new ArrayList<>(1);
List<ExecutionEntity> executions = executionEntityManager.findChildExecutionsByParentExecutionId(parentExecution.getId());
for (ExecutionEntity childExecution : executions) {
if (childExecution.isEventScope()) {
executionEntityManager.deleteExecutionAndRelatedData(childExecution, null);
eventScopeExecutions.add(childExecution);
} else {
allEventScopeExecutions = false;
}
}
}
return allEventScopeExecutions;
return eventScopeExecutions;
}
protected boolean allChildExecutionsEnded(ExecutionEntity parentExecutionEntity, ExecutionEntity executionEntityToIgnore) {
......@@ -415,4 +433,16 @@ public class EndExecutionOperation extends AbstractOperation {
}
return true;
}
protected boolean isInEventSubProcess(ExecutionEntity executionEntity) {
ExecutionEntity currentExecutionEntity = executionEntity;
while (currentExecutionEntity != null) {
if (currentExecutionEntity.getCurrentFlowElement() instanceof EventSubProcess) {
return true;
}
currentExecutionEntity = currentExecutionEntity.getParent();
}
return false;
}
}
......@@ -93,9 +93,6 @@ public interface ExecutionEntity extends DelegateExecution, Execution, ProcessIn
void setEnded(boolean isEnded);
@Override
void setEventName(String eventName);
String getDeleteReason();
void setDeleteReason(String deleteReason);
......@@ -108,12 +105,6 @@ public interface ExecutionEntity extends DelegateExecution, Execution, ProcessIn
void setEventScope(boolean isEventScope);
@Override
boolean isMultiInstanceRoot();
@Override
void setMultiInstanceRoot(boolean isMultiInstanceRoot);
void setName(String name);
void setDescription(String description);
......@@ -128,26 +119,14 @@ public interface ExecutionEntity extends DelegateExecution, Execution, ProcessIn
void setLockTime(Date lockTime);
@Override
boolean isDeleted();
@Override
void setDeleted(boolean isDeleted);
void forceUpdate();
String getStartActivityId();
void setStartActivityId(String startActivityId);
@Override
String getStartUserId();
void setStartUserId(String startUserId);
@Override
Date getStartTime();
void setStartTime(Date startTime);
void setCallbackId(String callbackId);
......
......@@ -13,7 +13,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<messageEventDefinition messageRef="messageId" />
</startEvent>
......
......@@ -13,7 +13,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<messageEventDefinition messageRef="messageId" />
</startEvent>
......
......@@ -13,7 +13,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<messageEventDefinition messageRef="messageId" />
</startEvent>
......
......@@ -13,7 +13,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<signalEventDefinition signalRef="signalId" />
</startEvent>
......
......@@ -13,7 +13,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<signalEventDefinition signalRef="signalId" />
</startEvent>
......
......@@ -13,7 +13,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<signalEventDefinition signalRef="signalId" />
</startEvent>
......
......@@ -11,7 +11,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<timerEventDefinition>
<timeCycle>R3/P1D</timeCycle>
......
......@@ -11,7 +11,7 @@
<sequenceFlow sourceRef="task" targetRef="theEnd" />
<endEvent id="theEnd" />
<subProcess triggeredByEvent="true">
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="eventProcessStart" isInterrupting="false">
<timerEventDefinition>
<timeDuration>P1D</timeDuration>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册