Skip to content
IRC-Coding IRC-Coding
BPMN Grundlagen Prozessmodellierung Events Gateways Tasks Pools Lanes Business Process

BPMN Grundlagen: Prozessmodellierung mit Events, Gateways, Tasks, Pools & Lanes

BPMN Prozessmodellierung Grundlagen. Events, Gateways, Tasks, Pools, Lanes mit praktischen Beispielen, XML-Struktur und Business Process Management.

S

schutzgeist

2 min read

BPMN Grundlagen: Prozessmodellierung mit Events, Gateways, Tasks, Pools & Lanes

Dieser Beitrag ist eine umfassende Einführung in die BPMN Grundlagen – inklusive Prozessmodellierung mit Events, Gateways, Tasks, Pools und Lanes mit praktischen Beispielen.

In a Nutshell

BPMN (Business Process Model and Notation) ist eine standardisierte Notation zur Modellierung von Geschäftsprozessen mit grafischen Elementen wie Events, Gateways, Tasks und Swimlanes.

Kompakte Fachbeschreibung

BPMN (Business Process Model and Notation) ist ein grafischer Standard zur Beschreibung von Geschäftsprozessen. Sie ermöglicht eine einheitliche Darstellung von Prozessabläufen unabhängig von Tools und Organisationen.

Wichtige BPMN-Elemente:

Events (Ereignisse)

  • Start Event: Prozessbeginn (Kreis, dünn umrandet)
  • End Event: Prozessende (Kreis, dick umrandet)
  • Intermediate Event: Zwischenereignis (Kreis, doppelt umrandet)
  • Boundary Event: Fehlerereignis an Task
  • Timer Event: Zeitgesteuerte Ereignisse
  • Message Event: Nachrichtenbasierte Ereignisse

Tasks (Aufgaben)

  • User Task: Manuelle Aufgabe durch Benutzer
  • Service Task: Automatisierte Aufgabe
  • Script Task: Skript-Ausführung
  • Manual Task: Manuelle Aufgabe ohne Systemunterstützung
  • Receive Task: Warten auf Nachricht
  • Send Task: Nachricht senden

Gateways (Gateways/Verzweigungen)

  • Exclusive Gateway: Exklusive Verzweigung (X)
  • Parallel Gateway: Parallele Ausführung (+)
  • Inclusive Gateway: Inklusive Verzweigung (O)
  • Complex Gateway: Komplexe Bedingungen
  • Event Gateway: Ereignisbasierte Verzweigung

Swimlanes (Schwimmbahnen)

  • Pool: Prozesscontainer für eine Organisation
  • Lane: Verantwortlichkeitsbereich innerhalb eines Pools
  • Participant: Akteur im Prozess

Prüfungsrelevante Stichpunkte

  • BPMN: Standardisierte Prozessmodellierungsnotation
  • Events: Prozessereignisse (Start, End, Intermediate)
  • Tasks: Prozessaufgaben (User, Service, Script)
  • Gateways: Prozessverzweigungen (Exclusive, Parallel, Inclusive)
  • Pools/Lanes: Organisatorische Zuordnung (Swimlanes)
  • Sequence Flow: Prozessfluss zwischen Elementen
  • Message Flow: Kommunikation zwischen Pools
  • IHK-relevant: Wichtig für Geschäftsprozessanalyse und -optimierung

Kernkomponenten

  1. Events: Prozesssteuerung durch Ereignisse
  2. Tasks: Ausführung von Arbeitsschritten
  3. Gateways: Entscheidungen und Verzweigungen
  4. Pools: Prozesscontainer für Organisationen
  5. Lanes: Verantwortlichkeitsbereiche
  6. Sequence Flow: Prozessabläufe
  7. Message Flow: Zwischenprozesskommunikation
  8. Artifacts: Zusätzliche Informationen (Datenobjekte, Gruppen)

Praxisbeispiele

1. BPMN-Prozess: Bestellabwicklung

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             targetNamespace="http://www.example.com/bpmn">
    
    <!-- Prozess: Bestellabwicklung -->
    <process id="bestellprozess" name="Bestellabwicklung" isExecutable="false">
        
        <!-- Start Event -->
        <startEvent id="start_bestellung" name="Bestellung eingegangen"/>
        
        <!-- User Task: Bestellung prüfen -->
        <userTask id="pruefe_bestellung" name="Bestellung prüfen">
            <documentation>
                Mitarbeiter prüft Bestellung auf Vollständigkeit und Verfügbarkeit
            </documentation>
        </userTask>
        
        <!-- Exclusive Gateway: Bestellung gültig? -->
        <exclusiveGateway id="gueltig_pruefung" name="Bestellung gültig?"/>
        
        <!-- Service Task: Lager prüfen -->
        <serviceTask id="pruefe_lager" name="Lagerbestand prüfen">
            <documentation>
                Automatisierte Prüfung der Lagerverfügbarkeit
            </documentation>
        </serviceTask>
        
        <!-- Parallel Gateway: Parallelverarbeitung -->
        <parallelGateway id="parallel_start" name="Parallel starten"/>
        
        <!-- User Task: Rechnung erstellen -->
        <userTask id="erstelle_rechnung" name="Rechnung erstellen">
            <potentialOwner>
                <resourceAssignmentExpression>
                    <formalExpression>finanzabteilung</formalExpression>
                </resourceAssignmentExpression>
            </potentialOwner>
        </userTask>
        
        <!-- Service Task: Ware versenden -->
        <serviceTask id="versende_ware" name="Ware versenden">
            <documentation>
                Automatisierter Versand über Logistiksystem
            </documentation>
        </serviceTask>
        
        <!-- Parallel Gateway: Zusammenführen -->
        <parallelGateway id="parallel_end" name="Zusammenführen"/>
        
        <!-- End Event: Bestellung abgeschlossen -->
        <endEvent id="end_erfolgreich" name="Bestellung abgeschlossen"/>
        
        <!-- End Event: Bestellung abgelehnt -->
        <endEvent id="end_abgelehnt" name="Bestellung abgelehnt"/>
        
        <!-- Sequence Flows -->
        <sequenceFlow sourceRef="start_bestellung" targetRef="pruefe_bestellung"/>
        <sequenceFlow sourceRef="pruefe_bestellung" targetRef="gueltig_pruefung"/>
        
        <sequenceFlow sourceRef="gueltig_pruefung" targetRef="pruefe_lager">
            <conditionExpression xsi:type="tFormalExpression">${bestellungGueltig == true}</conditionExpression>
        </sequenceFlow>
        
        <sequenceFlow sourceRef="gueltig_pruefung" targetRef="end_abgelehnt">
            <conditionExpression xsi:type="tFormalExpression">${bestellungGueltig == false}</conditionExpression>
        </sequenceFlow>
        
        <sequenceFlow sourceRef="pruefe_lager" targetRef="parallel_start"/>
        <sequenceFlow sourceRef="parallel_start" targetRef="erstelle_rechnung"/>
        <sequenceFlow sourceRef="parallel_start" targetRef="versende_ware"/>
        <sequenceFlow sourceRef="erstelle_rechnung" targetRef="parallel_end"/>
        <sequenceFlow sourceRef="versende_ware" targetRef="parallel_end"/>
        <sequenceFlow sourceRef="parallel_end" targetRef="end_erfolgreich"/>
        
    </process>
</definitions>

2. BPMN mit Java-Implementierung

import java.util.*;
import java.time.*;

// BPMN-Prozess-Engine (vereinfacht)
class BPMNProcessEngine {
    private Map<String, BPMNElement> elements = new HashMap<>();
    private Map<String, List<String>> sequenceFlows = new HashMap<>();
    private Set<String> completedElements = new HashSet<>();
    private Map<String, Object> processVariables = new HashMap<>();
    
    public void addElement(BPMNElement element) {
        elements.put(element.getId(), element);
    }
    
    public void addSequenceFlow(String from, String to) {
        sequenceFlows.computeIfAbsent(from, k -> new ArrayList<>()).add(to);
    }
    
    public void setVariable(String name, Object value) {
        processVariables.put(name, value);
    }
    
    public Object getVariable(String name) {
        return processVariables.get(name);
    }
    
    public void executeProcess(String startElementId) {
        System.out.println("=== BPMN-Prozess-Start ===");
        executeElement(startElementId);
    }
    
    private void executeElement(String elementId) {
        if (completedElements.contains(elementId)) {
            return;
        }
        
        BPMNElement element = elements.get(elementId);
        if (element == null) {
            throw new RuntimeException("Element nicht gefunden: " + elementId);
        }
        
        System.out.println("\n--- Ausführe: " + element.getName() + " (" + elementId + ") ---");
        
        // Element ausführen
        element.execute(this);
        completedElements.add(elementId);
        
        // Nächste Elemente finden
        List<String> nextElements = sequenceFlows.get(elementId);
        if (nextElements != null) {
            for (String nextId : nextElements) {
                executeElement(nextId);
            }
        }
    }
}

// BPMN-Element-Interface
interface BPMNElement {
    String getId();
    String getName();
    void execute(BPMNProcessEngine engine);
}

// Event-Implementierungen
class StartEvent implements BPMNElement {
    private String id;
    private String name;
    
    public StartEvent(String id, String name) {
        this.id = id;
        this.name = name;
    }
    
    @Override
    public String getId() { return id; }
    
    @Override
    public String getName() { return name; }
    
    @Override
    public void execute(BPMNProcessEngine engine) {
        System.out.println("Prozess gestartet: " + name);
        engine.setVariable("startTime", LocalDateTime.now());
    }
}

class EndEvent implements BPMNElement {
    private String id;
    private String name;
    
    public EndEvent(String id, String name) {
        this.id = id;
        this.name = name;
    }
    
    @Override
    public String getId() { return id; }
    
    @Override
    public String getName() { return name; }
    
    @Override
    public void execute(BPMNProcessEngine engine) {
        System.out.println("Prozess beendet: " + name);
        engine.setVariable("endTime", LocalDateTime.now());
        
        Duration duration = Duration.between(
            (LocalDateTime) engine.getVariable("startTime"),
            (LocalDateTime) engine.getVariable("endTime")
        );
        System.out.println("Prozessdauer: " + duration.toSeconds() + " Sekunden");
    }
}

// Task-Implementierungen
class UserTask implements BPMNElement {
    private String id;
    private String name;
    private String assignee;
    
    public UserTask(String id, String name, String assignee) {
        this.id = id;
        this.name = name;
        this.assignee = assignee;
    }
    
    @Override
    public String getId() { return id; }
    
    @Override
    public String getName() { return name; }
    
    @Override
    public void execute(BPMNProcessEngine engine) {
        System.out.println("User Task zugewiesen an: " + assignee);
        System.out.println("Aufgabe: " + name);
        
        // Simuliere Benutzerinteraktion
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        System.out.println("User Task abgeschlossen");
        engine.setVariable("userTask_" + id + "_completed", true);
    }
}

class ServiceTask implements BPMNElement {
    private String id;
    private String name;
    private String serviceClass;
    
    public ServiceTask(String id, String name, String serviceClass) {
        this.id = id;
        this.name = name;
        this.serviceClass = serviceClass;
    }
    
    @Override
    public String getId() { return id; }
    
    @Override
    public String getName() { return name; }
    
    @Override
    public void execute(BPMNProcessEngine engine) {
        System.out.println("Service Task: " + name);
        System.out.println("Service-Klasse: " + serviceClass);
        
        // Simuliere Service-Aufruf
        if (serviceClass.equals("LagerService")) {
            boolean verfuegbar = checkLagerverfuegbarkeit(engine);
            engine.setVariable("lagerVerfuegbar", verfuegbar);
            System.out.println("Lagerverfügbarkeit: " + verfuegbar);
        } else if (serviceClass.equals("RechnungService")) {
            String rechnungsNummer = generateRechnung(engine);
            engine.setVariable("rechnungsNummer", rechnungsNummer);
            System.out.println("Rechnung erstellt: " + rechnungsNummer);
        }
    }
    
    private boolean checkLagerverfuegbarkeit(BPMNProcessEngine engine) {
        // Simuliere Lagerprüfung
        return Math.random() > 0.3; // 70% Verfügbarkeit
    }
    
    private String generateRechnung(BPMNProcessEngine engine) {
        return "RG-" + System.currentTimeMillis();
    }
}

// Gateway-Implementierungen
class ExclusiveGateway implements BPMNElement {
    private String id;
    private String name;
    private Map<String, String> conditions;
    
    public ExclusiveGateway(String id, String name) {
        this.id = id;
        this.name = name;
        this.conditions = new HashMap<>();
    }
    
    public void addCondition(String targetId, String condition) {
        conditions.put(targetId, condition);
    }
    
    @Override
    public String getId() { return id; }
    
    @Override
    public String getName() { return name; }
    
    @Override
    public void execute(BPMNProcessEngine engine) {
        System.out.println("Exclusive Gateway: " + name);
        
        // Bedingung auswerten
        boolean bestellungGueltig = (boolean) engine.getVariable("bestellungGueltig");
        
        System.out.println("Bedingung 'bestellungGueltig': " + bestellungGueltig);
        
        // Entscheidung treffen
        if (bestellungGueltig) {
            engine.setVariable("gateway_decision_" + id, "gueltig");
        } else {
            engine.setVariable("gateway_decision_" + id, "ungueltig");
        }
    }
}

class ParallelGateway implements BPMNElement {
    private String id;
    private String name;
    
    public ParallelGateway(String id, String name) {
        this.id = id;
        this.name = name;
    }
    
    @Override
    public String getId() { return id; }
    
    @Override
    public String getName() { return name; }
    
    @Override
    public void execute(BPMNProcessEngine engine) {
        System.out.println("Parallel Gateway: " + name);
        
        if (name.contains("starten")) {
            System.out.println("Parallele Ausführung gestartet");
            engine.setVariable("parallel_branches_active", true);
        } else {
            System.out.println("Parallele Ausführung zusammengeführt");
            engine.setVariable("parallel_branches_active", false);
        }
    }
}

// BPMN-Demo
public class BPMDemo {
    public static void main(String[] args) {
        System.out.println("=== BPMN Prozessmodellierung Demo ===");
        
        // Prozess-Engine erstellen
        BPMNProcessEngine engine = new BPMNProcessEngine();
        
        // BPMN-Elemente erstellen
        StartEvent start = new StartEvent("start_bestellung", "Bestellung eingegangen");
        UserTask pruefung = new UserTask("pruefe_bestellung", "Bestellung prüfen", "sachbearbeiter");
        ExclusiveGateway gueltigCheck = new ExclusiveGateway("gueltig_pruefung", "Bestellung gültig?");
        ServiceTask lagerPruefung = new ServiceTask("pruefe_lager", "Lagerbestand prüfen", "LagerService");
        ParallelGateway parallelStart = new ParallelGateway("parallel_start", "Parallel starten");
        UserTask rechnung = new UserTask("erstelle_rechnung", "Rechnung erstellen", "finanzabteilung");
        ServiceTask versand = new ServiceTask("versende_ware", "Ware versenden", "VersandService");
        ParallelGateway parallelEnd = new ParallelGateway("parallel_end", "Zusammenführen");
        EndEvent endErfolgreich = new EndEvent("end_erfolgreich", "Bestellung abgeschlossen");
        EndEvent endAbgelehnt = new EndEvent("end_abgelehnt", "Bestellung abgelehnt");
        
        // Elemente zur Engine hinzufügen
        engine.addElement(start);
        engine.addElement(pruefung);
        engine.addElement(gueltigCheck);
        engine.addElement(lagerPruefung);
        engine.addElement(parallelStart);
        engine.addElement(rechnung);
        engine.addElement(versand);
        engine.addElement(parallelEnd);
        engine.addElement(endErfolgreich);
        engine.addElement(endAbgelehnt);
        
        // Sequence Flows definieren
        engine.addSequenceFlow("start_bestellung", "pruefe_bestellung");
        engine.addSequenceFlow("pruefe_bestellung", "gueltig_pruefung");
        
        // Bedingte Flows für Exclusive Gateway
        engine.addSequenceFlow("gueltig_pruefung", "pruefe_lager");
        engine.addSequenceFlow("gueltig_pruefung", "end_abgelehnt");
        
        engine.addSequenceFlow("pruefe_lager", "parallel_start");
        engine.addSequenceFlow("parallel_start", "erstelle_rechnung");
        engine.addSequenceFlow("parallel_start", "versende_ware");
        engine.addSequenceFlow("erstelle_rechnung", "parallel_end");
        engine.addSequenceFlow("versende_ware", "parallel_end");
        engine.addSequenceFlow("parallel_end", "end_erfolgreich");
        
        // Prozessvariablen setzen
        engine.setVariable("bestellungGueltig", true);
        
        // Prozess ausführen
        engine.executeProcess("start_bestellung");
        
        // Prozessstatistik
        System.out.println("\n=== Prozessstatistik ===");
        System.out.println("Abgeschlossene Elemente: " + engine.completedElements.size());
        
        // Zweiter Durchlauf mit ungültiger Bestellung
        System.out.println("\n=== Zweiter Durchlauf (ungültige Bestellung) ===");
        BPMNProcessEngine engine2 = new BPMNProcessEngine();
        
        // Elemente wieder hinzufügen
        Arrays.asList(start, pruefung, gueltigCheck, endAbgelehnt).forEach(engine2::addElement);
        engine2.addSequenceFlow("start_bestellung", "pruefe_bestellung");
        engine2.addSequenceFlow("pruefe_bestellung", "gueltig_pruefung");
        engine2.addSequenceFlow("gueltig_pruefung", "end_abgelehnt");
        
        engine2.setVariable("bestellungGueltig", false);
        engine2.executeProcess("start_bestellung");
    }
}

3. BPMN-Datenobjekte und Artifacts

// BPMN-Datenobjekte
class DataObject {
    private String id;
    private String name;
    private Object value;
    private String dataType;
    
    public DataObject(String id, String name, String dataType) {
        this.id = id;
        this.name = name;
        this.dataType = dataType;
    }
    
    // Getter und Setter
    public String getId() { return id; }
    public String getName() { return name; }
    public Object getValue() { return value; }
    public void setValue(Object value) { this.value = value; }
    public String getDataType() { return dataType; }
    
    @Override
    public String toString() {
        return "DataObject{" + name + "=" + value + " (" + dataType + ")}";
    }
}

// BPMN-Gruppe
class BPMNGroup {
    private String id;
    private String name;
    private List<String> elementIds;
    private String categoryValue;
    
    public BPMNGroup(String id, String name, String categoryValue) {
        this.id = id;
        this.name = name;
        this.categoryValue = categoryValue;
        this.elementIds = new ArrayList<>();
    }
    
    public void addElement(String elementId) {
        elementIds.add(elementId);
    }
    
    // Getter
    public String getId() { return id; }
    public String getName() { return name; }
    public List<String> getElementIds() { return new ArrayList<>(elementIds); }
    public String getCategoryValue() { return categoryValue; }
}

// BPMN-Text Annotation
class TextAnnotation {
    private String id;
    private String text;
    private String format;
    
    public TextAnnotation(String id, String text) {
        this.id = id;
        this.text = text;
        this.format = "text/plain";
    }
    
    // Getter
    public String getId() { return id; }
    public String getText() { return text; }
    public String getFormat() { return format; }
}

// Erweiterte BPMN-Engine mit Datenobjekten
class AdvancedBPMNEngine extends BPMNProcessEngine {
    private Map<String, DataObject> dataObjects = new HashMap<>();
    private Map<String, BPMNGroup> groups = new HashMap<>();
    private Map<String, TextAnnotation> annotations = new HashMap<>();
    
    public void addDataObject(DataObject dataObject) {
        dataObjects.put(dataObject.getId(), dataObject);
    }
    
    public void addGroup(BPMNGroup group) {
        groups.put(group.getId(), group);
    }
    
    public void addAnnotation(TextAnnotation annotation) {
        annotations.put(annotation.getId(), annotation);
    }
    
    public DataObject getDataObject(String id) {
        return dataObjects.get(id);
    }
    
    public void setDataObjectValue(String id, Object value) {
        DataObject dataObject = dataObjects.get(id);
        if (dataObject != null) {
            dataObject.setValue(value);
        }
    }
    
    public void printProcessInfo() {
        System.out.println("\n=== Prozess-Informationen ===");
        
        System.out.println("\nDatenobjekte:");
        dataObjects.values().forEach(System.out::println);
        
        System.out.println("\nGruppen:");
        groups.values().forEach(group -> {
            System.out.println(group.getName() + " (" + group.getCategoryValue() + "): " + 
                             group.getElementIds());
        });
        
        System.out.println("\nAnnotationen:");
        annotations.values().forEach(annotation -> 
            System.out.println(annotation.getText()));
    }
}

// Demo mit erweiterten BPMN-Features
public class AdvancedBPMDemo {
    public static void main(String[] args) {
        System.out.println("=== Erweiterte BPMN Demo ===");
        
        AdvancedBPMNEngine engine = new AdvancedBPMNEngine();
        
        // BPMN-Elemente
        StartEvent start = new StartEvent("start_antrag", "Antrag eingegangen");
        UserTask pruefung = new UserTask("pruefe_antrag", "Antrag prüfen", "sachbearbeiter");
        ServiceTask pruefungService = new ServiceTask("automatische_pruefung", 
                                                     "Automatische Prüfung", 
                                                     "PruefService");
        EndEvent endGenehmigt = new EndEvent("end_genehmigt", "Antrag genehmigt");
        EndEvent endAbgelehnt = new EndEvent("end_abgelehnt", "Antrag abgelehnt");
        
        // Elemente hinzufügen
        Arrays.asList(start, pruefung, pruefungService, endGenehmigt, endAbgelehnt)
              .forEach(engine::addElement);
        
        // Datenobjekte
        DataObject antragData = new DataObject("antrag_daten", "Antragsdaten", "Antrag");
        DataObject pruefungsErgebnis = new DataObject("pruefung_ergebnis", 
                                                   "Prüfungsergebnis", 
                                                   "Boolean");
        
        engine.addDataObject(antragData);
        engine.addDataObject(pruefungsErgebnis);
        
        // Gruppe für Prüfungsprozess
        BPMNGroup pruefungsGruppe = new BPMNGroup("pruefungsgruppe", 
                                                 "Prüfungsprozess", 
                                                 "Prüfung");
        pruefungsGruppe.addElement("pruefe_antrag");
        pruefungsGruppe.addElement("automatische_pruefung");
        engine.addGroup(pruefungsGruppe);
        
        // Annotation
        TextAnnotation hinweis = new TextAnnotation("hinweis", 
            "Wichtig: Alle Prüfungen müssen dokumentiert werden");
        engine.addAnnotation(hinweis);
        
        // Sequence Flows
        engine.addSequenceFlow("start_antrag", "pruefe_antrag");
        engine.addSequenceFlow("pruefe_antrag", "automatische_pruefung");
        engine.addSequenceFlow("automatische_pruefung", "end_genehmigt");
        
        // Datenobjekte initialisieren
        engine.setDataObjectValue("antrag_daten", "Antrag #12345");
        engine.setDataObjectValue("pruefung_ergebnis", true);
        
        // Prozess ausführen
        engine.executeProcess("start_antrag");
        
        // Prozess-Informationen ausgeben
        engine.printProcessInfo();
    }
}

BPMN-Elemente Übersicht

Events (Ereignisse)

TypSymbolBeschreibungBeispiel
Start EventKreis (dünn)ProzessbeginnBestellung eingegangen
End EventKreis (dick)ProzessendeBestellung abgeschlossen
Intermediate EventKreis (doppelt)ZwischenereignisTimer ausgelöst
Boundary EventKreis (angeheftet)FehlerereignisTimeout bei Task
Message EventBriefumschlagNachrichtNachricht empfangen
Timer EventUhrzeitZeitbasiertWartezeit abgelaufen

Tasks (Aufgaben)

TypSymbolBeschreibungBeispiel
User TaskRechteck mit PersonManuelle AufgabeFormular ausfüllen
Service TaskRechteck mit ZahnradAutomatisierte AufgabeDatenbank speichern
Script TaskRechteck mit SkriptSkript-AusführungBerechnung durchführen
Manual TaskRechteck mit HandManuell ohne ITPaket verpacken
Receive TaskRechteck mit BriefWarten auf NachrichtAuf Bestätigung warten
Send TaskRechteck mit BriefNachricht sendenE-Mail senden

Gateways (Verzweigungen)

TypSymbolBeschreibungBeispiel
Exclusive GatewayDiamant (X)Exklusive VerzweigungJa/Nein Entscheidung
Parallel GatewayDiamant (+)Parallele AusführungGleichzeitig prüfen
Inclusive GatewayDiamant (O)Inklusive VerzweigungMehrere Bedingungen
Complex GatewayDiamand (*)Komplexe LogikMehrfachbedingungen

Swimlanes (Schwimmbahnen)

ElementBeschreibungVerwendung
PoolProzesscontainerGanzer Prozess einer Organisation
LaneVerantwortlichkeitsbereichAbteilung oder Rolle
ParticipantExterner PartnerKunde, Lieferant

BPMN-XML-Struktur

Grundstruktur

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
    <process id="prozess_id" name="Prozessname">
        <!-- BPMN-Elemente -->
        <startEvent id="start" name="Start"/>
        <sequenceFlow sourceRef="start" targetRef="task1"/>
        <userTask id="task1" name="Aufgabe"/>
        <endEvent id="end" name="Ende"/>
    </process>
</definitions>

Erweiterte Struktur

<definitions>
    <process id="prozess">
        <!-- Pools und Lanes -->
        <participant id="participant1" name="Organisation"/>
        <lane id="lane1" name="Abteilung">
            <flowNodeRef>task1</flowNodeRef>
        </lane>
        
        <!-- Datenobjekte -->
        <dataObject id="data1" name="Daten" itemSubjectRef="itemDef1"/>
        
        <!-- Artifacts -->
        <textAnnotation id="annotation1">
            <text>Hinweis</text>
        </textAnnotation>
    </process>
</definitions>

BPMN-Best Practices

Prozess-Design

  • Klarheit: Prozesse einfach und verständlich halten
  • Konsistenz: Einheitliche Notation und Benennung
  • Vollständigkeit: Alle relevanten Pfade modellieren
  • Validierung: Regelmäßige Überprüfung der Modelle

Namenskonventionen

  • Element-IDs: Technische Identifikatoren (keine Leerzeichen)
  • Element-Namen: Menschlich lesbare Beschreibungen
  • Prozess-Variablen: CamelCase mit technischem Fokus
  • Datenobjekte: Beschreibende Namen mit Datentyp

Performance-Optimierung

  • Parallelisierung: Möglichkeiten für parallele Ausführung nutzen
  • Automatisierung: Manuelle Tasks minimieren
  • Simplifikation: Unnötige Gateways vermeiden
  • Wiederverwendung: Sub-Prozesse für wiederkehrende Abläufe

Vorteile und Nachteile

Vorteile von BPMN

  • Standardisierung: Einheitliche Notation weltweit
  • Tool-Unterstützung: Viele BPMN-Tools verfügbar
  • Automatisierung: Direkte Umsetzung in BPM-Systemen
  • Kommunikation: Gemeinsames Verständnis aller Stakeholder
  • Analyse: Systematische Prozessverbesserung

Nachteile

  • Komplexität: Lernkurve für komplexe Prozesse
  • Overhead: Detaillierte Modellierung kann aufwändig sein
  • Interpretation: Verschiedene Tools können leicht abweichen
  • Wartung: Modelle müssen aktuell gehalten werden

Häufige Prüfungsfragen

  1. Was ist der Unterschied zwischen Pool und Lane? Pool ist der gesamte Prozesscontainer, Lane ist ein Verantwortlichkeitsbereich innerhalb eines Pools.

  2. Erklären Sie die verschiedenen Gateway-Typen! Exclusive (exklusiv), Parallel (gleichzeitig), Inclusive (mehrere Bedingungen), Complex (komplexe Logik).

  3. Wann verwendet man User Task vs Service Task? User Task für manuelle Aufgaben durch Benutzer, Service Task für automatisierte Systemaufgaben.

  4. Was ist der Zweck von BPMN-Datenobjekten? Darstellung von Informationen, die im Prozess fließen und verarbeitet werden.

Wichtigste Quellen

  1. https://www.bpmn.org/
  2. https://www.omg.org/spec/BPMN/2.0/
  3. https://de.wikipedia.org/wiki/Business_Process_Model_and_Notation
Zurück zum Blog
Share:

Ähnliche Beiträge