Sbava usando regole da file Excel

1. Panoramica

Drools ha il supporto per la gestione delle regole aziendali in un formato foglio di calcolo.

In questo articolo, vedremo un rapido esempio di utilizzo di Drools per gestire le regole aziendali utilizzando un file Excel.

2. Dipendenze di Maven

Aggiungiamo le dipendenze Drools richieste nella nostra applicazione:

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

L'ultima versione di queste dipendenze può essere trovata su kie-ci e drools-decisiontables.

3. Definizione di regole in Excel

Per il nostro esempio, definiamo le regole per determinare lo sconto in base al tipo di cliente e al numero di anni come cliente:

  • I clienti individuali con più di 3 anni ottengono uno sconto del 15%
  • I clienti individuali con meno di 3 anni ottengono uno sconto del 5%
  • Tutti i clienti aziendali ottengono uno sconto del 20%

3.1. Il file Excel

Cominciamo con la creazione del nostro file excel secondo la struttura specifica e le parole chiave richieste da Drools:

Per il nostro semplice esempio, abbiamo utilizzato il set di parole chiave più pertinente:

  • RuleSet : indica l'inizio della tabella delle decisioni
  • Importa : classi Java utilizzate nelle regole
  • RuleTable : indica l'inizio del set di regole
  • Nome : nome della regola
  • CONDIZIONE : lo snippet di codice della condizione da verificare rispetto ai dati di input. Una regola dovrebbe contenere almeno una condizione
  • AZIONE - lo snippet di codice dell'azione da intraprendere se le condizioni della regola sono soddisfatte. Una regola dovrebbe contenere almeno un'azione. Nell'esempio, chiediamo setDiscount sul cliente oggetto

Inoltre, abbiamo utilizzato la classe Customer nel file Excel. Quindi, creiamolo ora.

3.2. La classe del cliente

Come si può vedere dalle CONDIZIONI e AZIONE nel foglio excel, stiamo utilizzando un oggetto della classe Cliente per i dati di input ( tipo e anni ) e per memorizzare il risultato ( sconto ).

La classe del cliente :

public class Customer { private CustomerType type; private int years; private int discount; // Standard getters and setters public enum CustomerType { INDIVIDUAL, BUSINESS; } }

4. Creazione dell'istanza del motore delle regole Drools

Prima di poter eseguire le regole che abbiamo definito, dobbiamo lavorare con un'istanza del motore di regole Drools. Per questo, dobbiamo usare i componenti principali di Kie.

4.1. KieServices

La classe KieServices fornisce l'accesso a tutte le funzionalità di compilazione e runtime di Kie. Fornisce diversi stabilimenti, servizi e metodi di utilità. Quindi, prima di tutto procuriamoci un'istanza di KieServices :

KieServices kieServices = KieServices.Factory.get();

Utilizzando i KieServices, creeremo nuove istanze di KieFileSystem , KieBuilder e KieContainer .

4.2. KieFileSystem

KieFileSystem è un file system virtuale. Aggiungiamo il nostro foglio di calcolo Excel ad esso:

Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt); 

4.3. KieBuilder

Ora, crea il contenuto di KieFileSystem passandolo a KieBuilder :

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); kieBuilder.buildAll();

Se costruito con successo, crea un KieModule ( qualsiasi jar prodotto da Maven con un kmodule.xml in esso, è un KieModule ).

4.4. KieRepository

Il framework aggiunge automaticamente il KieModule (risultante dalla build) a KieRepository :

KieRepository kieRepository = kieServices.getRepository();

4.5. KieContainer

È ora possibile creare un nuovo KieContainer con questo KieModule utilizzando il suo ReleaseId . In questo caso, Kie assegna un ReleaseId predefinito :

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId(); KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId);

4.6. KieSession

Ora possiamo ottenere KieSession dal KieContainer . La nostra applicazione interagisce con KieSession , che memorizza ed esegue sui dati di runtime:

KieSession kieSession = kieContainer.newKieSession();

5. Esecuzione delle regole

Infine, è il momento di fornire i dati di input e attivare le regole:

Customer customer = new Customer(CustomerType.BUSINESS, 2); kieSession.insert(customer); kieSession.fireAllRules();

6. Casi di prova

Aggiungiamo ora alcuni casi di test:

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. Risoluzione dei problemi

Drools converte la tabella decisionale in DRL. Per questo motivo, gestire errori e refusi nel file Excel può essere difficile. Spesso gli errori si riferiscono al contenuto del DRL. Quindi, per risolvere i problemi, aiuta a stampare e analizzare il DRL:

Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); DecisionTableProviderImpl decisionTableProvider = new DecisionTableProviderImpl(); String drl = decisionTableProvider.loadFromResource(dt, null);

8. Conclusione

In questo articolo, abbiamo visto un rapido esempio di utilizzo di Drools per gestire le regole aziendali in un foglio di calcolo Excel. Abbiamo visto la struttura e l'insieme minimo di parole chiave da utilizzare nella definizione delle regole in un file Excel. Successivamente, abbiamo utilizzato i componenti Kie per leggere e attivare le regole. Infine, abbiamo scritto casi di test per verificare i risultati.

Come sempre, l'esempio utilizzato in questo articolo può essere trovato nel progetto Github.