Celem niniejszego dokumentu jest analiza możliwości zastosowania silnika reguł Drools w projektach informatycznych
Drools jest bibliotekę programistyczną (zestaw plików jar) napisaną w języku Java. Bibliotekę tą można dołączyć do tworzonego projektu, który również musi być tworzony w technologii Java (to nie do końca prawda ponieważ istnieje projekt Drools pod technologię .Net oczywiście komponenty tych bibliotek są niewymienialne miedzy sobą)
Silnik reguł biznesowych Drools (w odróżnieniu od projektów klasy Workflow) nie umożliwia (albo umożliwia w niewielkim stopniu) sterowanie przepływem wykonania. Raczej jest to zupełnie inne podejście opisujące nie jak coś ma być zrobione ale raczej co ma być zrobione. Reguły opisują jakie warunki mają spełniać obiekty biznesowe oraz jakie działania mają zostać podjęte w wypadku ich spełniania, najczęściej jest to modyfikacja tych samych obiektów biznesowych które sprawdzane były regułami tak aby stan obiektów po przejściu przez reguły był zgodny z oczekiwaniami.
W rozwiązaniu projektu Drools opisując to dosyć prostym językiem (tak to rozumiem) wygląda to tak że mamy plik tekstowy „drl” (oraz ewentualnie plik szablonu dsl opisujący reguły ludzkim jezykiem) lub Excel „xls” (tak naprawdę zamieniany potem i tak na plik opisu drl) opisujący reguły (można je definiować również z poziomu kodu), plik ten następnie jest przekazywany do silnika reguł (obiekt specjalnego typu), dane te stanowią wtedy pamięć reguł. Jakby z drugiej strony możemy sobie zdefiniować obiekty biznesowe (definiowane oczywiście na podstawie odpowiednich klas Javy) opisujące procesy biznesowe. Obiekty te posiadają jakieś właściwości i metody i można powiedzieć że są w określonym stanie początkowym. Obiekty te, (a właściwie referencje do nich) są również przekazywane do silnika reguł, stanowi to jakby pamięć faktów. Następnie wywoływana jest metoda silnika reguł powodująca sprawdzenie wszystkich obiektów biznesowych (pamięć fakt??w) pod kątem spełniania reguł. Jeśli reguła znajdzie dopasowanie ze stanem obiektu wtedy, wywoływana jest akcja zdefiniowana w regule i stan obiektu (jego właściwości) zostają zmienione. Po zakończeniu procesu mamy ten sam zestaw obiektów biznesowych z właściwościami ustawionymi według wzorca opisanego w pliku reguł.
Jest pewna możliwość sterowania przepływem wykonania, polegająca np. na ustawieniu w regule polecenia „update(obiekt)” umożliwiającego ponowne zastosowanie reguł do obiektów już raz przetworzonych regułami co można uznać za proste sterowanie przepływem. Dodatkowo można dzięki mechanizmowi „Agend” grupować reguły (agenda-group „nazwa”) i sterować z poziomu akcji danej reguły której agendy reguły mają się wykonywać dalej (goto agenda „nazwa”) a które nie (stop agenda”nazwa”). Ten mechanizm można wykorzystać do sterowania konfliktami w przypadku jeśli mamy kilka reguł wykluczających się wzajemnie.
Możemy także sterować priorytetem ważności reguł dzięki atrybutowi reguły o nazwie (silance „wartość”) im wyższa wartość tego atrybutu tym ważniejsza jest określona reguła i jeśli są dwie reguły o takich samych warunkach wynik wykonania wywołany będzie dla reguły o wyższym priorytecie.
Projekt Drools choć rozwijany przez firmę JBoss to jednak rozprowadzany jest na licencji Apache (firma zarabia tylko na wsparciu).
Oprogramowanie silnika reguł Drools dostępne jest na stronie http://www.jboss.org/drools/downloads skąd można ściągnąć bogatą dokumentację projektu kody źródłowe skompilowane biblioteki (jar) binariów oraz kilka projektów powstałych wokół tego projektu jak np. Guvnor czyli GUI w postaci aplikacji jsp umożliwiającej zarządzanie i projektowanie reguł biznesowych. Poza tym ponieważ Drools jest to projekt napisany w Javie trzeba posiadać środowisko programistyczne Java JDK najlepiej zintegrowane z IDE eclipse. Ze strony producenta można również pobrać plug-in do tegoż środowiska ułatwiającego (troszkę) oprogramowywanie tej biblioteki.
Aby projekt oparty na tej technologii działał musi mieć dołączone (classpath) pliki jar z pakietu „drools-5.1.1-bin’ dostępnej obecnie wersji (09-2010) na stronie producenta.
W środowisku Eclipse można albo ręcznie podpiąć te pliki jako „Build path library” lub prościej zakładając (po zainstalowania wtyczki) projekt typu Drools (to chyba tylko raczej jako zabawa z regułami).
Reguły można definiować na dwa sposoby, albo jako plik tekstowy „drl” (po zastosowaniu szablonów DSL plik ten może przyjąć bardziej „ludzki” opis) albo jako plik xls (Excel, openoffice). Oto przykład reguły a zaraz wszystko stanie się jasne.
rule "amount more then 200" when p : Product( amount >= 200) then p.setPrice(1.2f); end
rule "amount more then 100" when p:Product(amount >= 100) then p.setPrice(1.3f); end
Obie powyższe reguły sprawdzają czy obiekt wywodzący się z klasy „Product” istnieje w pamięci faktów ( czy silnik reguł dostał do niego referencję) i reguły te są uczulone na właściwość obiektu o nazwie „amount” w tym akurat przypadku opisującą ilość jakiegoś towaru zamawianego przez klienta. Jeśli klient zamawia więcej niż 200 sztuk towaru to cenę jednostkową tego towaru ustawiamy na 1.2 (wywołując metodę akcesora tego obiektu) a jeśli zamawia tylko 100 sztuk to upust jest mniejszy i cenę ustalamy aż na 1.3. Tak to z grubsza działa. Te same reguły możemy ustawić również (ale trzeba to oczywiście oprogramować po stronie kodu) w pliku xls i wtedy analogiczna reguła będzie wyglądała następująco
W najprostszym przypadku kod odpowiedzialny za obsługę takiego prostego mechanizmu może zamknąć się w kilkunastu linijkach kodu języka Java odpowiedzialnych za pobranie treści z pliku reguł zaczytanie takiego stringa do obiektu silnika reguł oraz za utworzenie obiektów biznesowych (faktów) i przekazanie ich referencji do silnika reguł. Zostanie jeszcze tylko wywołanie przetwarzania reguł i gotowe.
Obiekt obiekt = new Obiekt(); //obiekt biznesowy (pamięć faktów) PackageBuilder builder = new PackageBuilder(); RuleBase ruleBase = RuleBaseFactory.newRuleBase(); StatefulSession session = ruleBase.newStatefulSession(); //obiekt przetw. reguły Reader inputStreamReader = new FileReader(“rules.drl”); //pobranie pliku reguł builder.addPackageFromDrl(inputStreamReader); Package pkg = builder.getPackage(); ruleBase.addPackage(pkg); session.insert(obiekt); //dodajemy obiekt do pamięci faktów session.fireAllRules(); //uruchomienie przetwarzania reguł
Bardziej skomplikowany projekt (ale też prosty) jako projekt Eclipse zostanie dołączony do tego dokumentu.
Po doświadczeniach z tą biblioteką jestem pod wrażeniem jej możliwości biorąc pod uwagę jej jakże niską cenę ?. Jednocześnie jej wymagania są bardzo niewielkie. Nie jest potrzebne instalowanie żadnego rezydującego w pamięci serwera do obsługi jej wywołań. Mechanizmy obsługi można zamknąć we własnym projekcie języka java przez proste dołączenie kilku plików bibliotecznych jar. Jednocześnie trzeba sobie zdawać sprawę z ograniczeń tej biblioteki w odniesieniu do możliwości sterowania przepływem, raczej nie wyobrażam sobie jej w tej roli, co powoduje konieczność użycia dodatkowego mechanizmu klasy „Workflow” albo sterowania po prostu przy pomocy kodów natywnych języka programowania. Liberalna licencja (Apache) bogata dokumentacja oraz ugruntowana pozycja na rynku, czego dowodem jest występowanie wielu wpisów w świadku branżowych forów internetowych na jej temat, powodują że silnik reguł biznesowych Drools jest wiodącym projektem w swojej klasie rozwiązań i w mojej ocenie spełni swoja rolę w każdym projekcie wymagającym tego typu rozwiązania.
Plik projektu myDrools.zip (do uruchomienia wymagany pakiet biblioteki drools-5.1.1-bin lub wtyczka do Eclipse drools-5.1.1-eclipse-all.zip (nr.ver. z 09 2010) do ściągnięcia ze strony producenta http://www.jboss.org/drools/downloads)