Teil 2: Prozessanwendung von Camunda BPM, Camunda Tasklist als Aufgabenliste & Prozessmonitoring

Workflows mit BPMN effektiv automatisieren [Teil 2]
Kommentare

BPMN ist der globale ISO-Standard für Prozessmodellierung und Workflowautomatisierung. Dabei geht es nicht darum, mit „Zero-Code“ die „lästigen Entwickler“ loszuwerden, sondern um fachlich lesbare Modelle, die mit technischen Attributen angereichert auf einer leichtgewichtigen Engine ausgeführt werden.

Nachdem wir uns in Teil 1 zunächst einer Einführung in BPMN gewidmet haben, die BPMN-Ausführbarkeit in .NET betrachtet und uns die Open-Source-BPM-Plattform von Camunda (inklusive deren Installation) angeschaut haben, blicken wir in Teil 2 auf die Prozessanwendung von Camunda BPM, geben Code-Beispiele und zeigen wie man die Webanwendung Camunda Tasklist als Aufgabenliste für Ihre Anwender produktiv verwenden kann. Außerdem schauen wir uns das Prozessmonitoring unter BPM an und erläutern, wie man eine eigene WPF-Aufgabenliste entwickelt.

BPMN: Prozessanwendung

Ist die Installation vollbracht, können wir unsere Prozessanwendung entwickeln. Eine Prozessanwendung enthält potenziell:

  • Modelle (BPMN, DMN, CMMN): Das Modell liegt als XML-Datei als Ressource im Projekt und kann direkt im Camunda Modeler bearbeitet werden. Der Modeler registriert sich beim ersten Start auf die Dateiendung .bpmn; damit ist das Arbeiten sowohl für Businessanalysten als auch für Entwickler sehr komfortabel.
  • Implementierungen für Servicetasks: Servicetasks in BPMN sprechen Services bzw. Programmlogik an. Damit wir ohne Java auskommen, nutzen wir so genannte „External-Tasks“. Dabei werden Aufgaben für automatisierte Worker von der Workflow Engine in so genannte Topics gelegt. Externe Worker holen sich neue Arbeitsaufträge über ein REST-API ab und melden dann auch Erfolg oder Fehler über ein REST-API zurück. Die Technologie der Worker kann völlig frei gewählt werden, in diesem Artikel benutzen wir dazu C#. Sie könnten aber auch Shellskripte schreiben, falls Sie ganz spezielle Worker brauchen, die z. B. Videokodierung anstoßen (diese Anwendungsfälle gibt es tatsächlich).
  • Oberflächen für Usertasks: Wird dem Mensch eine Aufgabe zugewiesen, so braucht er ein Formular zur Bearbeitung der Aufgabe. Ich werde zwei verschiedene Wege vorstellen um damit umzugehen: Einfache HTML-Formulare, die in der Camunda-Webanwendung angezeigt werden oder eine eigene WPF-Taskliste mit WPF-Formularen.

Im einfachsten Fall kann die Prozessanwendung eine simple Konsolenanwendung sein, die im Hintergrund per REST mit Camunda kommuniziert. Um die Verwendung von Camunda in C# etwas einfacher zu machen, habe ich eine beispielhafte Klassenbibliothek bereitgestellt, den „Camunda-Client“. Sie kapselt den Zugriff auf das REST-API, sucht und deployt Prozessmodelle aus dem Klassenpfad und enthält Logik zum regelmäßigen Pollen von External-Tasks. Diese Klassenbibliothek hat nicht den Anspruch, eine stabile, wiederverwendbare Komponente zu sein, kann aber als Vorlage für das eigene Projekt dienen. Sie verwendet unter der Haube Threads und den Web-API-Client. Dies ist schematisch in Abbildung 2 zu sehen.

Lesen Sie auch Teil 1 des Artikels „Workflows mit BPMN effektiv automatisieren„!

Codebeispiele

Alle hier gezeigten Codebeispiele sind in C# geschrieben und online zum Ausprobieren verfügbar.

Um eine neue Prozessinstanz zu starten, also einen Antrag zu bearbeiten, kann eine Prozessinstanz z. B. per REST-API gestartet werden. Dies könnte dann z. B. aus dem Shop passieren, in dem ich als Kunde den Antrag abgeschlossen habe. Dabei können beliebige Daten mitgegeben werden, die dann als so genannte Prozessvariablen gespeichert werden. Listing 1 zeigt einen REST-Aufruf, um einen neuen Versicherungsantrag zu starten, die Daten werden hier als JSON übergeben.

POST http://localhost:8080/engine-rest/engine/default/process-definition/key/versicherungsneuantrag/start
{
  "variables": {
    "name": {
      "value": "Bernd Rücker",
      "type": "String"
    },
    "email": {
      "value": "bernd.ruecker@camunda.com",
      "type": "String"
    }
  }
}

Zur schnellen Simulation kann eine Prozessinstanz aber auch einfach über die Camunda Tasklist mit einem Formular gestartet werden. Schauen wir uns die Camunda Tasklist einmal genauer an.

Camunda Tasklist

Sie können die bereitgestellte Webanwendung als Aufgabenliste für Ihre Anwender produktiv verwenden. Ein anderer Anwendungsfall ist das Rapid Prototyping, um sehr schnell Klickprototypen von Prozessmodellen zu erstellen. In diesem Fall können Sie sogar sehr einfache Formulare über den Camunda Modeler zusammenklicken. In den realen Projekten sind die Formulare aber meist etwas intelligenter.

Abbildung 3 zeigt die Camunda Tasklist mit einer geöffneten Aufgabe und dem dazugehörigen Formular. Diese Aufgabe ist innerhalb eines Usertasks während des Durchlaufs eines Versicherungsneuantrags entstanden. Der BPMN-Prozess wartet auf die Beendigung der Aufgabe durch den Sachbearbeiter, und man kann sich die aktuelle Position im Prozess auch grafisch anzeigen lassen. Dies visualisiert meist sehr gut die Idee einer Workflow-Engine, selbst wenn Sie diese Anzeige in der realen Anwendung nicht zur Verfügung stellen möchten. Die Tasklist bietet zudem die Möglichkeit, Filter zu definieren, Gruppenpostkörbe zu nutzen und mit Wiedervorlage, Fälligkeitsdatum oder auch Kommentaren zu arbeiten.

Abb. 3: Camunda Tasklist mit Formular für den Usertask

Abb. 3: Camunda Tasklist mit Formular für den Usertask

Stattdessen möchte ich auf das konkrete Formular fokussieren. In den häufigsten Fällen wird hier ein HTML-Formular verwendet, das in der Prozessanwendung selbst definiert wird. Beim Start der Konsolenanwendung wird dieses HTML, wie das BPMN-Prozessmodell selbst auch, in die Camunda-Datenbank deployt (via REST-API) und dort versioniert abgelegt. Die HTML-Fomulare sind einfach zu erstellen, vor allem, wenn man wie hier nur einfache Felder verwendet. Sie setzen aber keine Grenzen, wenn man mehr damit machen will.

Sehen Sie sich auch das Interview mit Bernd Rücker über das Erstellen einer Java-Workflow-Engine für die .NET-Welt an!

In den Formularen kann auch JavaScript verwendet werden. Zudem wird ein eigenes API bereitgestellt, um mit wichtigen Ressourcen und Services der Taskliste arbeiten zu können. Einfaches jQuery- und AngularJS-Know-how ist ausreichend, es wurde bewusst kein proprietärer Mechanismus eingeführt. Abbildung 4 zeigt ein Ausschnitt aus dem Quellcode des Formulars. Sie sehen, dass Sie sowohl Camunda-Abkürzungen verwenden können, um Prozessvariablen an das Formular zu binden (cam-variable-name), aber eben auch AngularJS (ng-model). Damit können auch erweiterte Anforderungen abgedeckt werden. Details entnehmen Sie am besten dem Quellcode des Projekts.

Abb. 4: HTML-Formulare sind sehr einfach gehalten, können aber dank JavaScript beliebig mächtig sein

Abb. 4: HTML-Formulare sind sehr einfach gehalten, können aber dank JavaScript beliebig mächtig sein

Das Formular wird am BPMN-Usertask referenziert (Abb. 5). Dabei wird der voll qualifizierte Pfad der HTML-Datei in der Prozessanwendung verwendet. Damit unsere Konsolenanwendung das HTML-Formular finden und deployen kann, muss es übrigens – wie ein BPMN-Modell auch, als eingebettete Ressource definiert werden. Sie können Formulare auch auf dem Startknoten definieren. Dadurch können Sie den Prozess mit einem Formular direkt in der Taskliste starten, wodurch wir sehr einfach neue Versicherungsantragsprozesse starten können.

Abb. 5: Das HTML-Formular liegt in der Prozessanwendung und wird im BPMN-Modell referenziert

Abb. 5: Das HTML-Formular liegt in der Prozessanwendung und wird im BPMN-Modell referenziert

[ExternalTaskVariableRequirements("name", "carType", "carManufacturer", "email", "approved", "policyId")] class SendEmailAdapter : IExternalTaskAdapter { public void Execute(ExternalTask externalTask, ref Dictionary<string, object> resultVariables) { string email = (string)externalTask.variables["email"].value; MailMessage mail = new MailMessage("demo@camunda.com", email); SmtpClient client = new SmtpClient(); //... client.Send(mail); resultVariables.Add("mailSendReport", "someInfoYouMightWantToRemeber")); } }

Über Attribute spezifizieren Sie das Topic, auf dem Arbeitsaufträge kommen (hier sendEmail). Dies ist die Verbindung zum BPMN-Modell (Abb. 6). Der Camunda-Client scannt den gesamten Klassenpfad nach Klassen mit diesem Attribut und startet automatisch Hintergrundthreads, die regelmäßig bei der Engine pollen.

Sie können über ein weiteres Attribut definieren, welche Prozessvariablen von der Engine mit abgerufen werden und zur Verfügung stehen sollen. Innerhalb des Workers können Sie dann beliebigen Code schreiben. Dabei ist es auch möglich, Ergebnisvariablen zu setzen, die an die Workflow Engine zurückgegeben und als Prozessvariablen gespeichert werden. Die Abarbeitung (oder der Fehlschlag) der Ausführung wird hinterher wieder via REST gemeldet. Auch dies ist im Client gekapselt.

Natürlich müssen Sie die Klassenbibliothek „Camunda Client“ nicht verwenden, Sie können auch direkt mit dem REST-API arbeiten, dazu lohnt dann ein Blick in die ausführliche Dokumentation.

Abb. 6: Service- und Send-Tasks können als External-Task konfiguriert werden, das Topic stellt die Verbindung zum Worker her, der dann auch in .NET entwickelt werden kann

Abb. 6: Service- und Send-Tasks können als External-Task konfiguriert werden, das Topic stellt die Verbindung zum Worker her, der dann auch in .NET entwickelt werden kann

Die Main-Methode der Konsolenanwendung muss nun nichts weiter machen, als den Camunda-Client zu starten (Listing 3). Der Client scannt im Hintergrund nach allen BPMN-Modellen sowie HTML-Formularen und deployt sie auf die Engine. Weiterhin werden alle External Task Workers gestartet, damit sie Arbeitsaufträge abholen und ausführen.

private static void Main(string[] args)
{
  CamundaEngineClient camunda = new CamundaEngineClient();
  camunda.Startup(); // Deploys all models to Camunda and Start all found ExternalTask-Workers
  Console.ReadLine(); // wait for ANY KEY
  camunda.Shutdown(); // Stop Task Workers
}

Prozessmonitoring

Wie bereits angesprochen, geht es bei Workflowautomatisierung mit BPMN auch immer um Transparenz. Dies kann man über das Monitoringtool Camunda Cockpit herstellen. Abbildung 7 zeigt beispielhaft eine Heatmap als Visualisierung statistischer Daten der Engine. In Prozessbereichen mit vielen Durchläufen ist es heiß, also rot, in anderen Bereichen sehr kalt.

Neben der Heatmap können weitere Statusinformationen visualisiert werden, zum Beispiel wo gerade wie viele Anträge warten und wie lange schon. Diese Informationen können bei der fachlichen Analyse des Prozessmodells helfen, sind aber auch essenziell um z. B. zu beantworten, warum gerade ein bestimmter Auftrag hängt. In Cockpit kann ein Administrator sogar eingreifen, um z. B. Daten zu verändern, den Zustand der Prozessinstanz zu modifizieren (oft als „Springen im Prozess“ bezeichnet) oder auch Versionsmigrationen durchzuführen. Für Details möchte ich auf die Dokumentation verweisen.

Abb. 7: Eine Workflow-Engine schreibt viele Daten, die statistisch ausgewertet und visualisiert werden können

Abb. 7: Eine Workflow-Engine schreibt viele Daten, die statistisch ausgewertet und visualisiert werden können

Eine eigene WPF-Aufgabenliste entwickeln

Eine Alternative zur Camunda Tasklist ist für viele Projekte eine Eigenentwicklung der Oberfläche. Das ist vor allem dann sinnvoll, wenn Sie die Aufgabenliste in Ihre eigene Umgebung einbetten möchten oder wenn Sie sehr spezielle Anforderungen haben.

Im Beispielprojekt zum Artikel habe ich ein einfaches WPF Window implementiert, das im Hintergrund via REST-API die Aufgaben lädt und anzeigt, wobei ich wieder den Camunda-Client verwende. Klickt man auf eine Aufgabe in der Tabelle, so wird rechts daneben eine WPF Page für das Formular nachgeladen und angezeigt. Als Formularreferenz im BPMN-Modell ist dann dieses Mal der C#-Klassennamen inkl. Namespace eingetragen.

Damit bleibt die Aufgabenliste selbst unabhängig vom konkreten Prozess und den dort verwendeten Formularen. Das Ergebnis ist in Abbildung 8 dargestellt. Natürlich könnte man hier noch an vielen technischen Feinheiten und der Optik feilen, aber die grundlegende technische Integration kann man im Quellcode zum Artikel gut erkennen.

Abb. 8: Eine WPF-Aufgabenliste mit WPF Pages als Formulare für Aufgaben

Abb. 8: Eine WPF-Aufgabenliste mit WPF Pages als Formulare für Aufgaben

Entscheidungstabellen mit DMN

Falls Sie sich übrigens noch fragen, warum ein Porsche 911 ein Risiko darstellt, möchte ich noch einen ganz kurzen Ausblick auf Entscheidungstabellen mit DMN geben, die in Camunda ebenfalls ausgeführt werden können. Abbildung 9 zeigt die im Antragsprozess verwendete Entscheidungstabelle.

Wir zeigen hier die Sicht in Camunda Cockpit auf eine in der Vergangenheit getroffene Entscheidung, nämlich genau zu einem Antrag eines 36-jährigen Fahrers auf einen Porsche 911. Die zutreffende Regel (=Zeile) der Tabelle ist farblich hervorgehoben. Das Ergebnis ist also ein gelbes Risiko. Entscheidungstabellen können ebenfalls mit dem Camunda Modeler erstellt werden und liegen als XML-Dateien neben den BPMN-Modellen im Projekt. Bei DMN ist es in Cockpit übrigens auch möglich, die Tabelle direkt live zu verändern, dies passiert in manchen Projekten sogar durch den Fachbereich selbst.

Abb. 9: Die Entscheidung über das Risiko wurde über eine DMN-Entscheidungstabelle getroffen

Abb. 9: Die Entscheidung über das Risiko wurde über eine DMN-Entscheidungstabelle getroffen

Fazit

BPMN ist ein spannender Standard zur Workflowmodellierung, der sich international stark verbreitet hat. Auch die in diesem Artikel nicht weiter vertieften Standards DMN, aber auch CMMN sollte man sich ansehen. Die grafischen Modelle können direkt ausgeführt werden. Auch in der .NET-Welt kann und sollte dieses mächtige Werkzeug genutzt werden, auch wenn Microsoft selbst keine Unterstützung anbietet.

Der Artikelzweiteiler hat gezeigt, wie einfach die Open-Source-BPM-Plattform mit der .NET-Welt verheiratet werden kann, ohne dass Sie mit Java zu tun haben müssen. Probieren Sie es doch einfach mal aus. Das Beispiel aus diesem Artikel inklusive beispielhaften Camunda-Client finden Sie online auf GitHub bereitgestellt.

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

 

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -