Activiti durch natives Java ersetzen

Activiti durch natives Java ersetzen

Vorgehen und Herausforderungen bei der Ablöse einer Business Process Engine durch nativen Code.


Hintergrund

Bestimmte Prozesse, etwa für die Archivierung von Urkunden, werden mittels BPMN-Diagrammen dargestellt und mittels einer Business Process Engine (Activiti) ausgeführt.

Die Entscheidung, die veraltete Activiti-Engine durch nativen Java-Code zu ersetzen, entstand aus der Notwendigkeit heraus, die Wartung und den Betrieb dieser Engine zu vermeiden. Die Nutzung einer Business Process Engine für drei vergleichsweise einfache Geschäftsprozesse war aus unserer Sicht nicht mehr sinnvoll, insbesondere, da ein Upgrade der Engine mit einem erheblichen Aufwand verbunden gewesen wäre.

Warum Activiti ersetzen?

Die drei betroffenen Geschäftsprozesse wurden ursprünglich als BPMN-Diagramme mit Activiti umgesetzt. Obwohl die Prozesse nicht sehr komplex waren, wurde Activiti verwendet, um sie zu automatisieren. Nach der Analyse stellten wir jedoch fest, dass der Aufwand für das Upgrade und die Wartung der Engine im Vergleich zur Komplexität und Anzahl der Prozesse nicht gerechtfertigt war. In der Vergangenheit kam es außerdem vor, dass Prozesse fehlschlugen und es keine Möglichkeit gab, diese fortzusetzen. Die Fehlersuche wurde durch die abstrahierte Abbildung mittels BPMN erschwert. Anstatt weiterhin auf die Engine zu setzen, haben wir uns entschieden, die Prozesse direkt in Java umzusetzen.

Wann eine Business Process Engine Sinn macht

Der Einsatz einer Business Process Engine wie Activiti lohnt sich, wenn Prozesse komplex, umfangreich und häufig auszuführen sind. Besonders sinnvoll ist sie, wenn viele Systeme, Abteilungen oder Personen beteiligt sind und Abläufe flexibel angepasst oder überwacht werden müssen. Auch bei einer hohen Anzahl an Prozessinstanzen oder wenn Nachvollziehbarkeit und Transparenz zentral sind, bringt eine BPE klare Vorteile.

Bei wenigen, einfachen und selten ausgeführten Prozessen ist der Nutzen dagegen gering. In solchen Fällen überwiegt der Aufwand für Betrieb, Wartung und mögliche Upgrades den Mehrwert der Engine. Dann ist eine direkte Implementierung – etwa in Java – meist die bessere Lösung.

Vorgehen bei der Ablöse

Der erste Schritt bestand darin, die bestehenden REST-Aufrufe nachzuvollziehen, um zu verstehen, wie die Prozesse gestartet werden und wo Antworten an den Nutzer zurückgesendet werden. Dabei konnten wir die relevanten Stellen im Code identifizieren, an denen Anpassungen notwendig waren.

Ursprünglicher Activiti-Prozess

Als nächstes fassten wir den bestehenden Activiti-Code zusammen. Anstatt viele kleine Methoden zu nutzen, stellten wir fest, dass sich einige der BPMN-Aktivitäten gut zu größeren Funktionen zusammenfassen ließen. So verringerten wir die Komplexität des Codes, indem wir die ursprünglich etwa zehn kleine auf drei große Methoden reduzierten. Außerdem dient dies als Grundlage für die folgenden Schritte.

Neuer Activiti-Prozess

Diese drei Methoden wurden dann vollständig ohne Bezug auf Activiti implementiert. Anstelle der Übergabe von Variablen an die Activiti-Engine speicherten wir den Zustand der Prozesse in einer Datenbanktabelle, die als “State” diente. Anstelle von Abfragen mit Activiti-Methoden wie createTaskQuery() wurden diese durch Abfragen mittels Hibernate und JPA ersetzt.

Dieser Prozess wurde für alle drei betroffenen Geschäftsprozesse wiederholt. Am Ende wurde der Code noch refactored.

Zeitaufwand

Die gesamte Umstellung dauerte etwa einen Monat. Trotz der scheinbar einfachen Anforderungen war der Aufwand nicht unerheblich. Besonders die Identifizierung und das Nachbilden von Funktionen, die zuvor von der Activiti-Engine übernommen wurden, sowie das Beheben von Bugs, nahmen viel Zeit in Anspruch.

Learnings und Herausforderungen

Anfangs gingen wir unkoordiniert und ohne detaillierte Planung vor. Dadurch verloren wir uns schnell in Details und es war schwer nachzuvollziehen, an welcher Stelle ein neugeschriebener Code nicht mehr funktionierte. Ein strukturierterer Ansatz, bei dem wir Schritt für Schritt vorgegangen wären, hätte uns anfangs viel Zeit gespart.

Ein weiteres Learning war, dass einige Funktionen von Activiti, wie etwa Timeouts oder das Handling mehrerer gleichzeitiger Prozesse, nachgebildet werden mussten. Auch die Fortsetzung der Ausführung bei Fehlern oder das Wiederholen eines Prozesses ab dem letzten erfolgreichen Status stellten eine Herausforderung dar.

Fazit

Die Ablöse der Activiti-Engine durch Java-Code war eine sinnvolle Entscheidung. Dadurch konnten wir die Komplexität reduzieren und den Wartungsaufwand erheblich verringern. Die Umstellung erforderte jedoch eine gründliche Planung und Strukturierung des Vorgehens. Durch die direkte Kontrolle über den Code konnten wir letztlich die Flexibilität, Nachvollziehbarkeit und Effizienz der Geschäftsprozesse deutlich steigern.