Wprowadzenie do silnika reguł Drools

Wprowadzenie do silnika reguł Drools

Aby zdefiniować czym jest silnik reguł biznesowych Drools należy doprecyzować pojęcie samej reguły biznesowej. Regułą biznesową nazywamy zestaw dwóch zbiorów. Pierwszy z nich to część decyzyjna – to w niej odbywa się sprawdzanie, czy po podanych faktach zachodzą przekazane warunki. Drugi natomiast to część operacyjna, w której odbywają się działania na danych. Silnik reguł biznesowych Drools zarządza regułami biznesowymi. Artykuł ten bazuje na wpisie https://www.javainuse.com/drools_hello. Wyobraźmy sobie sklep z biżuterią w którym zniżka przyznawana jest na podstawie typu biżuterii. Zniżka może zmieniać się każdego dnia co pociąga za sobą konsekwencje zmian w kodzie i angażowanie osoby technicznej. Rozwiązaniem tego problemu jest silnik reguł biznesowych Drools w którym definiujemy regułę która może być modyfikowana przez każdego. Utwórzmy nowy projekt z użyciem apache maven i dodajemy do pliku pom.xml zależność:

<dependencies>
	<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-compiler</artifactId>
	<version>6.0.1.Final</version>
	</dependency>
</dependencies>

Klasa Product:

@Getter
@Setter
public class Product {
    private String type;
    private int discount;
}

w katalogu ./resources tworzymy plik z rozszerzeniem *.drl który opisuje reguły biznesowe:

import pl.javalader.model.Product
 
rule "Offer for Diamond"
	when 
		productObject: Product(type=="diamond")
	then
		productObject.setDiscount(15);
	end
rule "Offer for Gold"
	when 
		productObject: Product(type=="gold")
	then
		productObject.setDiscount(25);
	end

Klasa startowa przedstawia się następująco:

public class Start {
 
    public static void main(String[] args) throws DroolsParserException, IOException {
        Start droolsTest = new Start();
        droolsTest.executeDrools();
    }
 
    public void executeDrools() throws DroolsParserException, IOException {
 
        PackageBuilder packageBuilder = new PackageBuilder();
 
        String ruleFile = "/rules/rules.drl";
        InputStream resourceAsStream = getClass().getResourceAsStream(ruleFile);
 
        Reader reader = new InputStreamReader(resourceAsStream);
        packageBuilder.addPackageFromDrl(reader);
        org.drools.core.rule.Package rulesPackage = packageBuilder.getPackage();
        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage(rulesPackage);
 
        WorkingMemory workingMemory = ruleBase.newStatefulSession();
 
        Product product = new Product();
        product.setType("gold");
 
        workingMemory.insert(product);
        workingMemory.fireAllRules();
 
        System.out.println("The discount for the product " + product.getType()
                + " is " + product.getDiscount());
    }
}

wynik to przyznana zniżka:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
The discount for the product gold is 25

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*