Skip to content

5.5.2.1.8. Fork Node

Mikołaj Milewski edited this page Nov 12, 2026 · 1 revision

Fork Node

A Fork Node duplicates the offered control and object tokens onto multiple outgoing flows, enabling parallel paths in a UML Activity. Unlike a Decision Node, a Fork does not choose one guarded alternative.

flowchart LR
    create(Create shipment) --> fork[ ]:::bar
    fork -->|Shipment| label(Print label)
    fork -->|Shipment| notify(Notify customer)
    classDef bar fill:#000,stroke:#000
Loading

Mermaid approximation: this diagram shows the model's routing, not a complete UML Activity notation. Rounded boxes represent actions; edge labels identify token types or guards. The black rectangle approximates a UML fork/join bar; its exact proportions depend on Mermaid rendering.

Definition

.AddAction(
    "CreateShipment",
    async c => c.Output(new Shipment("SHP-42")),
    node => node.AddFlow<Shipment, ForkNode>())
.AddFork(fork => fork
    .AddFlow<Shipment>("PrintLabel")
    .AddFlow<Shipment>("NotifyCustomer"))
.AddAction("PrintLabel", async c =>
    await labels.PrintAsync(c.GetTokensOfType<Shipment>().Single(), c.CancellationToken))
.AddAction("NotifyCustomer", async c =>
    await notifications.SendAsync(c.GetTokensOfType<Shipment>().Single(), c.CancellationToken))

Both outgoing branches receive the forked token. A Fork Node has no joining behavior; use a Join Node to synchronize flows later. Actions also have implicit-fork behavior by default; an explicit Fork makes the branching point clear in the model. See Implicit Fork and Join.

Clone this wiki locally