Abläufe mit Regeln aus Excel-Dateien

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>

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).