1. Überblick
In diesem Artikel finden Sie ein schnelles Beispiel für die Verwendung von Drools zum Verwalten von Geschäftsregeln mithilfe einer Excel-Datei.
2. Abhängigkeiten von Maven
Fügen wir der Anwendung die erforderlichen Drools-Abhängigkeiten hinzu:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>7.1.0.Beta2</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.1.0.Beta2</version>
</dependency>
Die neueste Version dieser Abhängigkeiten finden Sie unter kie-ci und https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.drools%22%20AND%20a%3A%22drools-decisiontables%22 ].
3. Regeln in Excel definieren
In unserem Beispiel definieren wir Regeln, um den Rabatt basierend auf dem Kundentyp und der Anzahl der Jahre als Kunde zu bestimmen:
-
Einzelkunden mit mehr als 3 Jahren erhalten 15% Rabatt
-
Einzelkunden mit weniger als 3 Jahren erhalten 5% Rabatt
-
Alle Geschäftskunden erhalten 20% Rabatt
3.1. Die Excel-Datei
Beginnen wir mit dem Erstellen unserer excel-Datei gemäß der spezifischen Struktur und Schlüsselwörter, die von Drools benötigt werden:
Für unser einfaches Beispiel haben wir die relevantesten Keywords verwendet:
-
RuleSet - gibt den Anfang der Entscheidungstabelle an
-
Import - Java-Klassen, die in den Regeln verwendet werden
-
RuleTable - gibt den Beginn des Regelwerks an
-
Name - Name der Regel
-
CONDITION - das Codefragment der Bedingung, gegen die geprüft werden soll
die Eingangsdaten. Eine Regel sollte mindestens eine Bedingung enthalten ** ACTION - der Codeausschnitt der auszuführenden Aktion, wenn der
Bedingungen der Regel sind erfüllt. Eine Regel sollte mindestens eine Aktion enthalten. Im Beispiel rufen wir setDiscount für das Customer -Objekt auf
Außerdem haben wir die Customer -Klasse in der Excel-Datei verwendet. Also lassen Sie uns das jetzt schaffen.
3.2. Die __Kundenklasse
Wie aus CONDITIONs und ACTION im Excel-Blatt ersichtlich, verwenden wir ein Objekt der Klasse Customer für die Eingabedaten ( type und years ) und zum Speichern des Ergebnisses ( discount ).
Die Customer -Klasse:
public class Customer {
private CustomerType type;
private int years;
private int discount;
//Standard getters and setters
public enum CustomerType {
INDIVIDUAL,
BUSINESS;
}
}
4. Erstellen von Drools-Regelmodul-Instanz
Bevor wir die definierten Regeln ausführen können, müssen wir mit einer Instanz der Drools-Regelengine arbeiten. Dafür müssen wir Kie-Kernkomponenten verwenden.
4.1. KieServices
KieServices kieServices = KieServices.Factory.get();
Mit den KieServices erstellen wir neue Instanzen von KieFileSystem , KieBuilder und KieContainer .
4.2. KieFileSystem
KieFileSystem ist ein virtuelles Dateisystem. Fügen wir Ihre Excel-Tabelle hinzu:
Resource dt
= ResourceFactory
.newClassPathResource("com/baeldung/drools/rules/Discount.xls",
getClass());
KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);
4.3. KieBuilder
Erstellen Sie nun den Inhalt des KieFileSystem , indem Sie ihn an KieBuilder übergeben:
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
Bei erfolgreicher Erstellung wird ein _KieModule erstellt ( jedes von Maven produzierte Glas mit der Datei kmodule.xml ist ein KieModule_ ).
4.4. KieRepository
Das Framework fügt automatisch das KieModule (aus dem Build) zu KieRepository hinzu:
KieRepository kieRepository = kieServices.getRepository();
4.5. KieContainer
Es ist jetzt möglich, einen neuen KieContainer mit diesem KieModule mit seiner ReleaseId zu erstellen. In diesem Fall weist Kie eine Standard- ReleaseId zu:
ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer
= kieServices.newKieContainer(krDefaultReleaseId);
4.6. KieSession
Wir können jetzt KieSession vom KieContainer erhalten. Unsere Anwendung interagiert mit der KieSession , die die Laufzeitdaten speichert und ausführt:
KieSession kieSession = kieContainer.newKieSession();
5. Regeln ausführen
Schließlich ist es Zeit, Eingabedaten bereitzustellen und die Regeln auszulösen:
Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);
kieSession.fireAllRules();
6. Testfälle
Lassen Sie uns nun einige Testfälle hinzufügen:
public class DiscountExcelIntegrationTest {
private KieSession kSession;
@Before
public void setup() {
Resource dt
= ResourceFactory
.newClassPathResource("com/baeldung/drools/rules/Discount.xls",
getClass());
kSession = new DroolsBeanFactory().getKieSession(dt);
}
@Test
public void
giveIndvidualLongStanding__whenFireRule__thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
kSession.insert(customer);
kSession.fireAllRules();
assertEquals(customer.getDiscount(), 15);
}
@Test
public void
giveIndvidualRecent__whenFireRule__thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
kSession.insert(customer);
kSession.fireAllRules();
assertEquals(customer.getDiscount(), 5);
}
@Test
public void
giveBusinessAny__whenFireRule__thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.BUSINESS, 0);
kSession.insert(customer);
kSession.fireAllRules();
assertEquals(customer.getDiscount(), 20);
}
}
7. Fehlerbehebung
Drools konvertiert die Entscheidungstabelle in eine Verknüpfung:/drools[DRL]. Aus diesem Grund kann der Umgang mit Fehlern und Tippfehlern in der Excel-Datei schwierig sein. Häufig beziehen sich die Fehler auf den Inhalt der DRL. Zur Problembehandlung hilft es daher, die DRL zu drucken und zu analysieren:
Resource dt
= ResourceFactory
.newClassPathResource("com/baeldung/drools/rules/Discount.xls",
getClass());
DecisionTableProviderImpl decisionTableProvider
= new DecisionTableProviderImpl();
String drl = decisionTableProvider.loadFromResource(dt, null);
8. Fazit
In diesem Artikel haben wir ein schnelles Beispiel für die Verwendung von Drools zum Verwalten von Geschäftsregeln in einer Excel-Tabelle gesehen. Wir haben die Struktur und den minimalen Satz von Schlüsselwörtern gesehen, die zum Definieren von Regeln in einer Excel-Datei verwendet werden sollen. Als Nächstes haben wir Kie-Komponenten zum Lesen und Auslösen der Regeln verwendet.
Schließlich haben wir Testfälle geschrieben, um die Ergebnisse zu überprüfen.
Das in diesem Artikel verwendete Beispiel befindet sich wie immer unter https://github.com/eugenp/tutorials/tree/master/logging-modules/log-mdc (Projekt Github).