From cc597333c5618948aa82d98c62cb301dfeb05dce Mon Sep 17 00:00:00 2001 From: Dmytro Kostiuk Date: Mon, 20 Apr 2026 17:15:36 +0200 Subject: [PATCH] Interrupting Notification Event Sub-Process --- .../workflows/boundary-events.md | 4 ++-- .../workflows/event-sub-processes.md | 19 +++++++++++++----- .../event-sub-processes/security-dialog.png | Bin 0 -> 17657 bytes 3 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/security-dialog.png diff --git a/content/en/docs/refguide/modeling/application-logic/workflows/boundary-events.md b/content/en/docs/refguide/modeling/application-logic/workflows/boundary-events.md index 00b4ab1a8fd..b3595c75336 100644 --- a/content/en/docs/refguide/modeling/application-logic/workflows/boundary-events.md +++ b/content/en/docs/refguide/modeling/application-logic/workflows/boundary-events.md @@ -65,7 +65,7 @@ To configure the properties of a boundary event, double-click the event to open When a boundary event is added to an ongoing activity, any workflow instances currently executing that activity will schedule the new boundary event accordingly. The only exception occurs when an ongoing boundary event is removed from the ongoing activity, the workflow is redeployed, and then the removal is reverted. In this case, the re-added boundary event will not be scheduled. -#### Implications of Changing the Boundary Event Type +#### Implications of Changing the Boundary Event Type {#event-type-change} For an existing boundary event, when you change its type from non-interrupting to interrupting or vice versa, you will be presented with a warning dialog. For example, when you change a boundary event from non-interrupting to interrupting, you will see the following warning dialog: @@ -78,7 +78,7 @@ After you confirm the change: * If the changed boundary event was non-interrupting, you will get the [Non-interrupting Boundary Event Path Removed](/refguide/workflow-versioning/#non-interrupting-boundary-event-path-removed) conflict. * If the changed boundary event was interrupting, you will get the [Current Activity Removed](/refguide/workflow-versioning/#current-activity-removed) conflict. -Boundary events are re-created upon type switch due to the execution limitations that exist for ongoing boundary events. For example, the parent activity will not be aborted when a non-interrupting boundary event starts. Once the boundary event type is changed to interrupting, the parent activity will stay in progress. That would allow the parent activity to have more than one ongoing interrupting boundary event. Vice versa, when an ongoing interrupting boundary event is changed to be non-interrupting, the parent activity is already aborted. Since a non-interrupting boundary event cannot end a workflow, it may remain active indefinitely unless explicitly aborted. +Boundary events are re-created upon type switch because in-place conversion would produce states that contradict BPMN 2.0 concepts. Per BPMN, an interrupting boundary event must abort its parent activity upon firing, which means an activity can never have more than one interrupting boundary event active at the same time. Converting an already-triggered non-interrupting boundary event to interrupting in place would violate this rule: the parent activity would still be in progress, resulting in an interrupting boundary event whose parent was never aborted. Conversely, converting an already-triggered interrupting boundary event to non-interrupting in place would leave it active on an already-aborted parent activity — contradicting the BPMN concept that a non-interrupting boundary event must never abort its parent. ### Rearranging Boundary Events diff --git a/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md b/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md index 48f921bb503..85c4ec661c8 100644 --- a/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md +++ b/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md @@ -53,16 +53,25 @@ Event sub-processes are triggered by a [Notify workflow](/refguide/notify-workfl Event sub-processes can be configured as either interrupting or non-interrupting, depending on how they interact with the main process flow. -* **Interrupting (solid line)** – Immediately cancels the main process flow. +* **Interrupting (solid line)** – Immediately cancels the main process flow and all ongoing sub-processes within the workflow instance. * **Non-Interrupting (dashed line)** – Runs in parallel with the main flow. -{{% alert color="info" %}} -Currently, Mendix only supports the non-interrupting variant of event sub-processes. Support for interrupting event sub-processes is planned for a future release. -{{% /alert %}} +##### Implications of Changing the Sub-Process Start Event Type {#event-type-change} + +For an existing event sub-process, when you change the type of its start event from non-interrupting to interrupting or vice versa, you will be presented with a warning dialog. For example, when you change a notification start event from non-interrupting to interrupting, you will see the following warning dialog: + +{{< figure src="/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/security-dialog.png" alt="Security Dialog when changing type" width="450">}} + +After you confirm the change: + +* The sub-process is re-created with the start event of the specified type together with all the event sub-process activities. The new start event can be triggered after the workflow is redeployed and becomes in progress. +* The workflow will become incompatible if the changed event sub-process is already being executed in one of the ongoing workflow instances. + +The event sub-process is re-created upon type switch because in-place conversion would produce states that contradict BPMN 2.0 concepts. Per BPMN, an interrupting event sub-process cancels the parent process scope and all other active sub-processes the moment it is triggered, while a non-interrupting one runs in parallel without affecting them. These are mutually exclusive execution models: an event sub-process instance belongs to exactly one of them from the moment it starts. Changing the type in place on an already-active instance would leave it in a state that is neither valid interrupting nor valid non-interrupting behavior, violating the fundamental BPMN distinction between the two. #### Concurrency Limitation -Mendix workflows currently support a **single concurrent instance** per defined event sub-process. If a non-interrupting event sub-process is already active, subsequent attempts to trigger that same sub-process via the **Notify workflow** activity will return `false`. No new instances will be created for that specific sub-process while one is **In Progress**. A new instance can only be initiated once the active sub-process has completed its execution path. +Mendix workflows currently support a **single concurrent instance** per defined event sub-process. If an event sub-process is already active, subsequent attempts to trigger that same sub-process via the **Notify workflow** activity will return `false`. No new instances will be created for that specific sub-process while one is **In Progress**. A new instance can only be initiated once the active sub-process has completed its execution path. If your workflow has multiple, distinct event sub-processes defined (for example, one for "Address Change" and one for "Document Upload"), each one can have its own active instance simultaneously. One being active does not prevent a different one from being triggered. diff --git a/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/security-dialog.png b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/security-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..433bc7ecdbd5ccc2a987f442a23cbfe9f5182d79 GIT binary patch literal 17657 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

OpLKDV^T9f?WveXpcQ2PI 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 literal 0 HcmV?d00001