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