Die BPM-Entwicklung ist nicht einfach. Dies liegt daran, dass der Prozess für den Kunden lesbar und verständlich sein muss und nicht nur aus technischer Sicht korrekt sein muss.
Nicht bei allen Tools zur Entwicklung von Geschäftsprozessen können Sie einen Kompromiss zwischen einer klaren Beschreibung und technischen Funktionen finden. Viele fortschrittliche Entwicklungstools und Prozessbeschreibungen haben oft einen weiteren Nachteil: Sie sind so cool, leistungsstark und komplex, dass die Technologien während ihrer Erstellung einen großen Schritt nach vorne machten und die Entwicklung mit einem solchen Tool irrelevant wurde.
2018 hat unseren Ansatz zur Entwicklung von Geschäftsprozessen grundlegend geändert. Im Folgenden erfahren Sie, wie sich dieser Ansatz entwickelt hat und wie wir uns geändert haben.
Anstelle eines Prologs
Unsere Abteilung befasst sich mit der Entwicklung von Geschäftsprozessen - von klein und klein bis groß und äußerst profitabel. Bis vor kurzem haben wir ein Produkt von IBM für die Entwicklung verwendet, mit dem wir schnell einen funktionierenden Geschäftsprozess in der Produktion starten können.
IBM BPM ist eine leistungsstarke Plattform, die eine Vielzahl von Funktionen enthält, z. B. eine Beschreibung der Prozesse selbst, UI-Formulare und Integrationsmodule. Darüber hinaus hat diese Plattform eine relativ niedrige Einstiegsschwelle, die es unerfahrenen Entwicklern ermöglicht, sofort in das Projekt einzutauchen. Dieses Produkt hat aber auch Nachteile, die, wenn sie die Entwicklung nicht hemmen, sicherlich nicht zu Geschwindigkeit und Qualität beitragen:
- Es gibt keine vernünftige Versionskontrolle. IBM BPM bietet einfach nicht die Möglichkeit, Prozesse (Code) ordnungsgemäß im Repository zu speichern, und verwendet ein eigenes Repository, das kein Konzept wie beispielsweise Zusammenführen kennt.
- Entwickeln in Java 6. Vielleicht ist es zum Zeitpunkt dieses Schreibens bereits möglich, in Java 7 zu entwickeln, aber 2019 ist dies ein wenig beruhigend.
- IBM BPM dreht sich auf WebSphere. Daher müssen Entwickler bei jedem Update ihres Moduls Geduld haben. Darüber hinaus ist dies ein zusätzliches Problem für Administratoren, die dieses Monster regelmäßig wieder zum Leben erwecken müssen, wenn es hängt.
- Die Entwicklung von Integrationsmodulen in der Umgebung von Integration Designer, die in der Tat nicht für die bessere Eclipse verdeckt ist.
- Es gibt keine normalen Unit-Test-Funktionen.
- Die hohen Kosten der Plattform.
Diese Mängel haben zusätzlich zu den rein technischen Unannehmlichkeiten der Entwicklung ein weiteres Problem geschaffen, das vielleicht viel schwerwiegender ist als alle oben genannten. In den Tagen von Java 12, Kotlin, Microservices und anderen Modetrends und -stücken demotivieren all diese Nuancen das Team sehr. Es ist schwer, die Freude an der Entwicklung im ständig hängenden Integration Designer für Java 6 im Jahr 2019 zu erleben.

Bei all diesen Einschränkungen ist es schwierig, über Wasser zu bleiben. Vor etwas weniger als einem Jahr gab es ein Angebot, die Camunda-Engine zur Beschreibung von Geschäftsprozessen auszuprobieren. Zunächst wurde ein nicht sehr umfangreiches, aber eher wichtiges Verfahren zur Registrierung von Terminals für juristische Personen ausgewählt.
Da wir es komplett neu geschrieben haben, gab es fast keinen alten Code, wir konnten uns praktisch nicht auf irgendetwas beschränken, und deshalb haben wir Kotlin als Entwicklungssprache gewählt. Es war interessant, diese neue Sprache auszuprobieren, die vor allem wegen positiver Bewertungen gehört wurde. Bei einigen anderen Projekten in unserer Abteilung gab es eine erfolgreiche Implementierungserfahrung. Der letzte Stapel stellte sich wie folgt heraus: Camunda, Spring Boot 2, Kotlin, Postgre.
Was ist Camunda?

Camunda ist eine Open-Source-Plattform zur Modellierung von Geschäftsprozessen, die in Java geschrieben ist und Java als Entwicklungssprache verwendet. Es handelt sich um eine Reihe von Bibliotheken, mit denen Sie die beschriebenen Prozesse ausführen können. Um Camunda in ein Projekt zu integrieren, fügen Sie einfach einige Abhängigkeiten hinzu. Zum Speichern von Prozessen können Sie je nach Aufgabe zwischen speicherinternem oder persistentem DBMS wählen. Wir haben uns für Postgre entschieden, weil uns die Geschichte für die "Nachbesprechung" wichtig ist. Standardmäßig wird die Plattform auf H2 bereitgestellt.
Die Entwicklung besteht aus zwei Teilen: Erstellen eines Ablaufprozesses in einem speziellen Dienstprogramm von Camunda Modeler und Schreiben von Java-Code, der die im Diagramm beschriebenen Prozessschritte verarbeitet. Um Java-Code aus dem Prozess aufzurufen, reicht es aus, die JavaDelegate-Schnittstelle zu implementieren, diese Bean (Sie können delagate durch den vollständigen Namen angeben, aber über die Bean ist es bequemer und flexibler) im Kontext anzugeben und ihre ID im gewünschten Prozessschritt anzugeben. Bei Kotlin sieht der Delegierte noch prägnanter aus. Die Logik der Delegierten ist recht einfach: Sie subtrahierten etwas vom Kontext, führten einige Aktionen aus und setzten es wieder in den Kontext.
Popup-Fenster von Camunda ModelerBeispiel für einen Java-Delegaten:
import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; public class JavaExampleDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) { String someVar = (String) execution.getVariable("someVariable");
Beispiel für einen Kotlin-Delegierten:
import org.camunda.bpm.engine.delegate.DelegateExecution import org.camunda.bpm.engine.delegate.JavaDelegate class KotlinExampleDelegate: JavaDelegate { override fun execute(execution: DelegateExecution) { val someVar = execution.getVariable("someVariable")
Im Delegaten können Sie Geschäftslogik, Integration und alles beschreiben, was Ihr Herz begehrt.
Wir versuchen, eine Ebene in Form einer Geschäftskomponente mit Logik zu erstellen und den Delegaten nur als Verknüpfung zum Prozessfluss zu verwenden, um den Code und den Prozess so wenig wie möglich zu mischen.
In den meisten Fällen ist dieser Ansatz praktisch und funktioniert erfolgreich. Die Interaktion mit dem Prozess erfolgt über DelegateExecution, mit der beispielsweise mit Kontext, Vorfällen usw. gearbeitet werden kann.
Wollten wir das?
Gleich zu Beginn suchten wir bei der Auswahl eines Werkzeugs nach einer Lösung mit folgenden Merkmalen:
- Wiederherstellung des Prozesses genau an dem Ort, an dem der Fehler aufgetreten ist, und es ist wünschenswert, dass er sofort einsatzbereit ist.
- Einige GUI, wo Sie sehen können, was mit dem Prozess im Allgemeinen passiert.
- Die Fähigkeit, Komponententests nicht nur für Logik und Integration, sondern auch für den Prozess selbst zu schreiben.
- Java 8 und höher.
- Entwickelte Community.
Camunda ist in Ordnung mit Fehlerbehebung und -analyse.
Eine gut lesbare Ablaufverfolgung, die Möglichkeit, die Anzahl der Versuche festzulegen, einen Schritt vor dem Sturz auszuführen, ein benutzerdefinierter Handler beim Fallen - beispielsweise, wenn während eines Sturzes der Status einer Entität in "Fehler" geändert werden soll. Letzteres ist einfach durch die Implementierung von DefaultIncidentHandler zu erreichen. Es stimmt, es gibt einen lustigen Moment, in dem dieser Handler funktioniert: Der Fehlerbehebungscode wird jedes Mal ausgelöst, wenn Sie den Prozessschritt eingeben. Ich kann nicht sagen, dass dies ein Superbug oder ein Problem ist. Vielmehr müssen Sie sich bei der Entwicklung nur daran erinnern und dies berücksichtigen.
Wir haben es so gelöst:
override fun resolveIncident(context: IncidentContext) { val incidentList = Context.getCommandContext().incidentManager.findIncidentByConfiguration(context.configuration) if (incidentList.isNotEmpty()) {
Camunda hat eine grafische Benutzeroberfläche und es ist nicht schlecht.
Wenn Sie jedoch etwas mehr möchten, z. B. die Migration von Instanzen zwischen Prozessversionen, müssen Sie hart arbeiten. Die Standard-Benutzeroberfläche bietet nur minimale Funktionen, aber es gibt eine sehr leistungsstarke Rest-API, mit der Sie Ihr eigenes Admin-Panel erstellen können - cool und raffiniert.
Auf dem Weg unseres Admin-Panels sind wir gegangen. Unser Geschäftsprozessarchitekt hat es in relativ kurzer Zeit erledigt, einschließlich der Funktionen zum Anzeigen des Verlaufs bereits abgeschlossener Prozesse, der Migration zwischen Versionen usw.
Camunda's Rest ist wirklich leistungsstark und ermöglicht es Ihnen, fast alles mit Prozessen zu tun. Beispielsweise können Sie einen Prozess mit
/ process-definition / key / aProcessDefinitionKey / start mit einer so einfachen Anforderung
starten :
{ "variables": { "aVariable" : { "value" : "aStringValue", "type": "String" }, "anotherVariable" : { "value" : true, "type": "Boolean" } }, "businessKey" : "myBusinessKey" }
Das Beispiel stammt aus der offiziellen Dokumentation, die eine ausführliche Beschreibung der verschiedenen Fälle der Verwendung dieser API enthält.
Für Unit-Tests verwenden wir das übliche Junit. Außerdem gibt es eine ziemlich interessante Bibliothek zum Testen des Prozesses selbst - 'org.camunda.bpm.extension', Name: 'camunda-bpm-assert'. Damit können Sie Tests beschreiben, um den Ablaufprozess zu überprüfen.
Dies ist sehr praktisch, da es oft schwieriger ist, nach Problemen mit Fehlern im Fluss zu suchen als im Code. Solche Tests schützen zum Beispiel vor ungenauem Refactoring und haben uns mehrmals wirklich geholfen.
Die Notwendigkeit für Java 8 ist teilweise verschwunden, da die Verwendung von Kotlin in vielen Prozessen die Notwendigkeit für G8 beseitigt hat. Kotlin passt sehr gut zum Projekt und ermöglicht es Ihnen, sich nur auf das Schreiben von Geschäftslogik zu konzentrieren. Es ist kaum zu glauben, aber im Grunde ist alles, was Kotlin über Coolness sagt, wahr. Entitäten mit einer großen Anzahl von Feldern, die für fast alle Anwendungen mit Integrationen bekannt sind, sehen jetzt nicht mehr so beängstigend aus, und die Zuordnungen zwischen Entitäten sind viel besser lesbar geworden. Oft kritisierte Nullsicherheit funktioniert wirklich und hilft in den meisten Fällen.
Die Gemeinschaft in Camunda ist ziemlich entwickelt. Dies wird durch die Tatsache belegt, dass ständig neue Bibliotheken auf GitHub zum Testen und für Metriken angezeigt werden.
Es ist schön, dass sich Camunda perfekt in Spring integriert. Fügen Sie die erforderlichen Abhängigkeiten, ein paar Anmerkungen und ein paar Konfigurations-Beans hinzu - das ist die ganze Integration! Aus diesem Grund schreiben wir eine regelmäßige Frühjahrsanwendung, an die jeder gewöhnt ist, und fügen den Ablauf eines Geschäftsprozesses hinzu. Die Interaktion erfolgt über die Java-API, mit der Sie Prozesse aus Java-Code bearbeiten können.
Sie können den Prozess beispielsweise mit nur einem Befehl starten:
runtimeService.startProcessInstanceByKey( "MyTestProcess", "MyBusinessKey", mapOf( "key1" to "value1", "key2" to "value2", ) )
Hier ist MyTestProcess die Id-Shnik des Prozesses, nicht die Instanz. MyBusinessKey ist ein eindeutiger Schlüssel für eine laufende Prozessinstanz. Für dieses Feld verwenden wir normalerweise einen geschäftlichen Wert - für eine schnellere Navigation zwischen Instanzen und Suche.
Auf die gleiche Weise können Sie einen „schläfrigen“ Prozess aktivieren.
Insbesondere erkennbare Minuspunkte oder Probleme, auf die wir gestoßen sind, können nicht zurückgerufen werden. Infolgedessen stellte sich heraus, dass es sich für einen relativ kurzen Zeitraum um einen vollständig funktionierenden Prozess handelte, der sicher in die Produktion gebracht werden konnte. Andere Prozesse werden auf der Plattform und recht erfolgreich implementiert. Jetzt haben wir auf Camunda ungefähr 15 Anwendungen gestartet, auf denen ungefähr 100.000 Prozesse gleichzeitig laufen.

Anstelle eines Nachworts
Hier sind einige Ressourcen aufgeführt, die bei der Implementierung des oben beschriebenen Stacks hilfreich waren. Ich empfehle Ihnen, diese zu lesen, wenn Sie an zusätzlichen Informationen zum Thema interessiert sind.