Einführung in Drools

1. Übersicht

Drools ist eine BRMS-Lösung (Business Rule Management System). Es bietet eine Regelengine, die Fakten verarbeitet und als Ergebnis der Verarbeitung von Regeln und Fakten eine Ausgabe erzeugt. Durch die Zentralisierung der Geschäftslogik können Änderungen schnell und kostengünstig eingeführt werden.

Es schließt auch die Lücke zwischen dem Business- und dem Technical-Team, indem es die Möglichkeit bietet, die Regeln in einem leicht verständlichen Format zu schreiben.

2. Maven-Abhängigkeiten

Um mit Drools zu beginnen, müssen wir zuerst einige Abhängigkeiten in unsere pom.xml einfügen :

 org.kie kie-ci 7.1.0.Beta1   org.drools drools-decisiontables 7.1.0.Beta1 

Die neueste Version beider Abhängigkeiten ist im Maven Central Repository als Kie-CI- und Drools-Entscheidungstabelle verfügbar.

3. Sabols Grundlagen

Wir werden uns die Grundkonzepte von Drools ansehen:

  • Fakten - repräsentiert Daten, die als Eingabe für Regeln dienen
  • Arbeitsspeicher - ein Speicher mit Fakten, in dem sie für den Mustervergleich verwendet werden und geändert, eingefügt und entfernt werden können
  • Regel - stellt eine einzelne Regel dar, die Fakten mit übereinstimmenden Aktionenverknüpft. Es kann in Drools Rule Language in den DRL- Dateien oder als Entscheidungstabelle in einer Excel-Tabelle geschrieben werden
  • Wissenssitzung - enthält alle Ressourcen, die zum Auslösen von Regeln erforderlich sind. Alle Fakten werden in die Sitzung eingefügt, und dann werden übereinstimmende Regeln ausgelöst
  • Wissensdatenbank - stellt das Wissen im Drools-Ökosystem dar, enthält Informationen zu den Ressourcen, in denen Regeln gefunden werden, und erstellt die Wissenssitzung
  • Modul - Ein Modul enthält mehrere Wissensdatenbanken, die unterschiedliche Sitzungen enthalten können

4. Java-Konfiguration

Um Regeln für bestimmte Daten auszulösen, müssen wir die vom Framework bereitgestellten Klassen mit Informationen zum Speicherort von Regeldateien und den Fakten instanziieren :

4.1. KieFileSystem

Zuerst müssen wir die KieFileSystem- Bean setzen. Dies ist ein speicherinternes Dateisystem, das vom Framework bereitgestellt wird. Der folgende Code bietet den Container zum programmgesteuerten Definieren der Drools-Ressourcen wie Regeldateien und Entscheidungstabellen:

public KieFileSystem kieFileSystem() throws IOException { KieFileSystem kieFileSystem = getKieServices().newKieFileSystem(); for (Resource file : getRuleFiles()) { kieFileSystem.write( ResourceFactory.newClassPathResource( RULES_PATH + file.getFilename(), "UTF-8")); } return kieFileSystem; }

Hier bezeichnet RULES_PATH den Speicherort von Regeldateien im Dateisystem. Hier lesen wir die Dateien aus dem Klassenpfad, der im Fall eines Maven-Projekts normalerweise / src / main / resources ist .

4.2. KieContainer

Als nächstes müssen wir den KieContainer festlegen, der ein Platzhalter für alle KieBases für ein bestimmtes KieModule ist. KieContainer wird mit Hilfe anderer Beans wie KieFileSystem, KieModule und KieBuilder erstellt.

Die in KieBuilder aufgerufene buildAll () -Methode erstellt alle Ressourcen und bindet sie an KieBase. Es wird nur dann erfolgreich ausgeführt, wenn alle Regeldateien gefunden und überprüft werden können:

public KieContainer kieContainer() throws IOException { KieRepository kieRepository = getKieServices().getRepository(); kieRepository.addKieModule(new KieModule() { public ReleaseId getReleaseId() { return kieRepository.getDefaultReleaseId(); } }); KieBuilder kieBuilder = getKieServices() .newKieBuilder(kieFileSystem()) .buildAll(); return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId()); }

4.3. KieSession

Die Regeln werden durch Öffnen einer KieSession- Bean ausgelöst , die von KieContainer abgerufen werden kann:

public KieSession kieSession() throws IOException { return kieContainer().newKieSession(); }

5. Regeln umsetzen

Nachdem wir mit dem Setup fertig sind, werfen wir einen Blick auf einige Optionen zum Erstellen von Regeln.

Wir werden die Regelimplementierung anhand eines Beispiels für die Kategorisierung eines Bewerbers für eine bestimmte Rolle anhand seines aktuellen Gehalts und seiner jahrelangen Erfahrung untersuchen.

5.1. Drools Rule File ( .drl )

Einfach ausgedrückt enthält die Drools-Regeldatei alle Geschäftsregeln.

Eine Regel enthält ein Wann-Dann- Konstrukt . Hier listet der Abschnitt Wann die zu prüfende Bedingung und der Abschnitt Dann die Aktion auf, die ausgeführt werden muss, wenn die Bedingung erfüllt ist:

package com.baeldung.drools.rules; import com.baeldung.drools.model.Applicant; global com.baeldung.drools.model.SuggestedRole suggestedRole; dialect "mvel" rule "Suggest Manager Role" when Applicant(experienceInYears > 10) Applicant(currentSalary > 1000000 && currentSalary <= 2500000) then suggestedRole.setRole("Manager"); end

Diese Regel kann durch Einfügen der Fakten zum Antragsteller und zur vorgeschlagenen Rolle in KieSession ausgelöst werden:

public SuggestedRole suggestARoleForApplicant( Applicant applicant,SuggestedRole suggestedRole){ KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(applicant); kieSession.setGlobal("suggestedRole",suggestedRole); kieSession.fireAllRules(); // ... }

Es testet zwei Bedingungen für die Applicant- Instanz und legt dann basierend auf der Erfüllung beider Bedingungen das Feld Rolle im SuggestedRole- Objekt fest.

Dies kann durch Ausführen des Tests überprüft werden:

@Test public void whenCriteriaMatching_ThenSuggestManagerRole(){ Applicant applicant = new Applicant("David", 37, 1600000.0,11); SuggestedRole suggestedRole = new SuggestedRole(); applicantService.suggestARoleForApplicant(applicant, suggestedRole); assertEquals("Manager", suggestedRole.getRole()); }

In diesem Beispiel haben wir nur wenige von Drools bereitgestellte Schlüsselwörter verwendet. Lassen Sie uns ihre Verwendung verstehen:

  • package - Dies ist der Paketname, den wir in derDatei kmodule.xml angeben. Die Regeldatei befindet sich in diesem Paket
  • import - Dies ähnelt der Java- Importanweisung . Hier müssen wir die Klassen angeben, die wir in die KnowledgeSession einfügen
  • global - Hiermit wird eine Variable auf globaler Ebene für eine Sitzung definiert. Dies kann verwendet werden, um Eingabeparameter zu übergeben oder um einen Ausgabeparameter abzurufen, um die Informationen für eine Sitzung zusammenzufassen
  • Dialekt - Ein Dialekt gibt die Syntax an, die in den Ausdrücken im Bedingungs- oder Aktionsabschnitt verwendet wird. Standardmäßig ist der Dialekt Java. Drools unterstützen auch Dialekt mvel ; Es ist eine Ausdruckssprache für Java-basierte Anwendungen. Es unterstützt den Feld- und Methoden- / Getter-Zugriff
  • Regel - Dies definiert einen Regelblock mit einem Regelnamen
  • Wenn - dies eine Regelbedingung angibt, sind in diesem Beispiel die Bedingungen, die überprüft werden, Antragsteller mit Erfahrung in Jahren von mehr als zehn Jahren und aktuelles Gehalt in einem bestimmten Bereich
  • then - Dieser Block führt die Aktion aus, wenn die Bedingungen im when- Block erfüllt sind. In diesem Beispiel wird dieRolledes Antragstellers als Manager festgelegt

5.2. Entscheidungstabellen

Eine Entscheidungstabelle bietet die Möglichkeit, Regeln in einer vorformatierten Excel-Tabelle zu definieren. Der Vorteil der von Drools bereitgestellten Entscheidungstabelle besteht darin, dass sie selbst für eine nicht technische Person leicht zu verstehen sind.

Es ist auch nützlich, wenn es ähnliche Regeln gibt, aber mit unterschiedlichen Werten. In diesem Fall ist es einfacher, eine neue Zeile auf dem Excel-Blatt hinzuzufügen, als eine neue Regel einzuschreiben. DRL- Dateien. Sehen wir uns die Struktur einer Entscheidungstabelle anhand eines Beispiels für das Anbringen des Etiketts auf einem Produkt basierend auf dem Produkttyp an:

Die Entscheidungstabelle ist in verschiedene Abschnitte unterteilt. Der obere Abschnitt ähnelt einem Header-Abschnitt, in dem das RuleSet (dh das Paket, in dem sich Regeldateien befinden), Import (zu importierende Java-Klassen) und Notes (Kommentare zum Zweck von Regeln) angegeben werden.

Der zentrale Abschnitt, in dem wir Regeln definieren, heißt RuleTable und gruppiert die Regeln, die auf dasselbe Domänenobjekt angewendet werden.

In der nächsten Zeile haben wir die Spaltentypen CONDITION und ACTION . Innerhalb dieser Spalten können wir auf die Eigenschaften des in einer Zeile genannten Domänenobjekts und deren Werte in den nachfolgenden Zeilen zugreifen.

Der Mechanismus zum Auslösen der Regeln ähnelt dem, den wir bei DRL- Dateien gesehen haben.

Wir können das Ergebnis der Anwendung dieser Regeln überprüfen, indem wir den Test ausführen:

@Test public void whenProductTypeElectronic_ThenLabelBarcode() { Product product = new Product("Microwave", "Electronic"); product = productService.applyLabelToProduct(product); assertEquals("BarCode", product.getLabel()); }

6. Fazit

In diesem kurzen Artikel haben wir uns mit der Verwendung von Drools als Geschäftsregel-Engine in unserer Anwendung befasst. Wir haben auch die verschiedenen Möglichkeiten gesehen, wie wir die Regeln in der Drools-Regelsprache sowie in leicht verständlicher Sprache in Tabellenkalkulationen schreiben können.

Wie immer ist der vollständige Code für diesen Artikel auf GitHub verfügbar.