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
Leave a comment