Drools als eine Rule Engine in Spring Boot
Drools ist eine Business Rule Engine, die eine einfache auf Java basierte Regelsprache verwendet und es so gut erlaubt, mit dem dahinterliegenden Code zu interagieren.
Hier wird bewusst drools statt z.B. Kogito verwendet, da es erlaubt, die Regeln zur Laufzeit ohne neues Deployment anzupassen.
Basierend auf diesem Beispiel wurden ein paar einfache Regeln gebaut.
rule "Herkunft"
no-loop
when
$s: Sorgfaltserklaerung ( placeOfOrigin in ("BR","ARG","PER"), $risiko : risiko)
then
$s.setRisiko($risiko +1);
update($s);
end
Durch no-loop
wird signalisiert, dass die Regel Herkunft
nur einmal angenwendet wird. Wenn placeOfOrigion
in der Sorgfaltserklärung in einem der angegebene Länderkürzel liegt, wird das $risiko
kopiert und im then
- Teil der Regel um einen erhöht.
Um drools in Spring boot einzusetzen, braucht man einen KieContainer
, über den man dann die Regeln ausführen kann. Eine Beispielkonfiguration:
@Configuration
public class DroolsConfig {
private static final String drlFile = "test.drl";
@Bean
public KieContainer kieContainer() {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
kieFileSystem.write(ResourceFactory.newClassPathResource(drlFile));
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
KieModule kieModule = kieBuilder.getKieModule();
return kieServices.newKieContainer(kieModule.getReleaseId());
}
}
Danach kann über den Container auf die Engine zugegriffen werden.
@Test
public void CoutryRisiko() {
Sorgfaltserklaerung s = new Sorgfaltserklaerung("BR");
s.setRisiko(1);
KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(s);
kieSession.fireAllRules(1);
kieSession.dispose();
assertEquals(s.getRisiko(), 2);
}
Als Nachteil empfinde ch hier nur, dass das Tooling für Fachabteilungen im Moment nicht so gut ist. Mir als Entwickler reicht die Drools LSP Extension