Im ersten Teil der Serie zum Einsatz von DMN-Engines in Enterprise Projekten habe ich euch den Gedanken der Entscheidungstabellen als dynamische Geschäftslogik versucht ein wenig näher zu bringen. Im zweiten Teil wollen wir diese Entscheidungstabellen nun in unsere Anwendung einbauen.
Die kleine Beispielanwendung ist eine Quarkus-Anwendung, die eine Integration der Camunda DMN-Engine nutzt. Ich habe mich an dieser Stelle für den Einsatz der Camunda Version 7 entschieden, da diese sehr einfach in eine Anwendung eingebunden werden kann. Wir starten natürlich ebenfalls mit einer Entscheidungstabelle, die ich mit Hilfe des Camunda Modelers erstellt habe. Das Beispiel ist ebenfalls sehr einfach gehalten. Auf Basis der Anzahl von getätigten Bestellungen soll ein Rabatt für die aktuelle Bestellung ermittelt werden.
Diese Entscheidungstabelle ist mit Hilfe der Decision Model and Notation (DMN) erstellt worden. Dabei handelt es sich um eine Spezifikation der Object Management Group (OMG). Die technische Basis bildet die DMN-Datei, welche die Entscheidungstabelle im XML-Format enthält. Um diesen Beitrag nicht unnötig aufzublähen, beschränke ich mich an dieser Stelle nur auf die Entscheidungstabellen. Im Modeler wird diese Notation entsprechend in eine grafische Form gebracht, damit eine Modellierung auch von nicht technik-affinen Personen erfolgen kann.
Um nun die so erstellte DMN-Datei auch in unserer Anwendung nutzen zu können, habe ich eine Java-Klasse implementiert, in der ich zunächst die DMN-Engine erzeuge und mit der DMN-Datei initialisiere. Anschließend kann ich mir dann die eigentliche Entscheidungstabelle aus dieser Datei geben lassen.
private DmnEngine dmnEngine;
private DmnDecision discountDecision;
@PostConstruct
void init() {
dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
discountDecision = dmnEngine.parseDecision("discount", this.getClass().getResourceAsStream("/shop.dmn"));
}
Für die Ermittlung des Rabattes nutze ich nun keinen Code, der in einer Java-Methode implementiert wurde, sondern die Entscheidungstabelle. Auch diese verwendet Eingabeparameter um ein Ergebnis liefern zu können. Diese werden über eine Variablen Map in die DMN-Engine übergeben.
var variableMap = Variables.createVariables()
.putValue("orders", numberOfOrders);
var decisionResult = dmnEngine.evaluateDecision(discountDecision, variableMap);
Durch den Einsatz der Entscheidungstabelle habe ich die notwendige Implementierung der Geschäftslogik ausgelagert. Diese Logik kann nun durch den Einsatz des Modellers auch von Personen aus der Fachabteilung gepflegt werden. Ändern sich die Anforderungen ist es jederzeit möglich die Tabelle entsprechend anzupassen und diese ohne eine weitere Codeanpassung in der Anwendung zu nutzen. Ich hoffe ich konnte an diesem kleinen Beispiel die Möglichkeiten dieser Technologie zeigen. Die Beispielanwendung ist hier zu finden.