2011-02-03 11 views
9

W aplikacji, nad którą teraz pracuję, muszę okresowo sprawdzać kwalifikowalność dziesiątek tysięcy obiektów do pewnego rodzaju usługi. Sam diagram decyzyjny jest w następującej formie, po prostu większy: Decision diagramDrzewa decyzyjne i silniki reguł (Drools)

W każdym z węzłów końcowych (okręgów) muszę uruchomić akcję (zmienić pole obiektu, informacje dziennika itd.). Próbowałem używać frameworka Drool Expert, ale w tym przypadku musiałbym napisać długą regułę dla każdej ścieżki na diagramie prowadzącej do węzła końcowego. Wydaje się, że Drools Flow również nie jest zbudowany na taki przypadek użycia - biorę obiekt, a następnie, w zależności od decyzji podejmowanych po drodze, trafiam do jednego z węzłów końcowych; a następnie ponownie dla innego obiektu. Albo to jest? Czy możesz podać mi przykłady/linki do takich rozwiązań?

UPDATE: nazywa

Drools przepływu może wyglądać następująco:

// load up the knowledge base 
KnowledgeBase kbase = readKnowledgeBase(); 
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 
Map<String, Object> params = new HashMap<String, Object>(); 

for(int i = 0; i < 10000; i++) { 

    Application app = somehowGetAppById(i); 

    // insert app into working memory 
    FactHandle appHandle = ksession.insert(app); 

    // app variable for action nodes 
    params.put("app", app); 

    // start a new process instance 
    ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params); 
    while(true) { 
     if(instance.getState() == instance.STATE_COMPLETED) { 
      break; 
     } 
    } 

    // remove object from working memory 
    ksession.retract(appHandle); 
} 

Czyli: zabrałbym obiektu Application, rozpocząć nowy proces za to, gdy proces zakończył (Ostatecznie, węzeł akcji zmodyfikuje aplikację w jakiś sposób), usunę obiekt z pamięci roboczej i powtórzę proces dla nowego obiektu aplikacji. Co sądzisz o tym rozwiązaniu?

ROZWIĄZANIE:
mam skończył przy użyciu Drools przepływu i została ona działa całkiem dobrze. Mój proces decyzyjny nie jest tak prosty, jak Drools Expert pyta i zależy od tego, gdzie w drzewie decyzyjnym jest proces ładowania list obiektów z bazy danych, transformowania ich, podejmowania decyzji, rejestrowania wszystkiego itd. Używam obiektu Process który jest przekazywany do procesu jako parametr i przechowuje wszystkie moje zmienne globalne (dla procesu) i pewne metody wygody, które są powtarzane w różnych punktach drzewa (ponieważ pisanie kodu Java w węzłach Script Task nie jest zbyt wygodne). Skończyłem też na używaniu Javy do podejmowania decyzji (a nie mvel lub reguł) - jest szybszy i powiedziałbym, że łatwiej kontrolować. Wszystkie obiekty, z którymi pracuję, są przekazywane jako parametry i używane jako normalne zmienne Java w kodzie.

Odpowiedz

12

Ekspert od drooli to zdecydowanie droga.

Jeśli chcesz uniknąć powtarzania się dla wyższych węzłów, to musisz użyć insertLogical (lub po prostu insert, jeśli jesteś w sesji bezstanowej) i zrozumieć, że reguły mogą wyzwalać reguły (To nie jest SQL twojego ojca pytanie). Na przykład:

// we just insert Customer objects in the WM 

rule "evaluateRetired" 
when 
    $c : Customer(age > 65) 
then 
    insertLogical(new Retiree($c)); 
end 

rule "evaluteRetireeIsFemale" 
when 
    $r : Retiree(customer.gender == Gender.FEMALE, $c : customer) 
then 
    ... 
end 

Jeśli schemat decyzja często zmienia (i chcesz nie-programistów, aby go edytować), zapoznać się z dokumentacją dotyczącą tabel decyzyjnych (i DSL). W takim przypadku prawdopodobnie powtarzasz całą ścieżkę dla każdej reguły, ale w większości przypadków jest to w porządku.

+0

Ponadto, wraz z rosnącym drzewem decyzyjnym, może się okazać, że niektóre węzły końcowe dzielą się działaniami (na przykład wszystkie potrzeby emeryta, bez znaczenia dla ich płci) i nieefektywne jest ponowne deklarowanie tego działania na węzeł końcowy. –

+0

A co z Drools Flow? Mogę modelować drzewo decyzyjne za pomocą tego, a następnie mogę umieścić jeden obiekt w pamięci roboczej, uruchomić proces i pozwolić mu zdecydować, który węzeł końcowy ma zostać użyty, a następnie usunąć obiekt, umieścić kolejny, uruchomić go ponownie itd. ? Czy to nie jest bardziej klarowne rozwiązanie? –

+0

Drools Flow nie ma sensu. Nie mówię, że to nie może działać, ale ponieważ podejmujesz decyzję, tabela decyzyjna zaimplementowana z silnikiem reguł wydaje się bardziej logiczna/naturalna. Próba dopasowania go do przepływu pracy jest dziwna: przepływ pracy jest długotrwały, każdy węzeł jest stanem. –

-1

Możesz wypróbować silnik reguł iLog.

+1

Dzięki, ale iLog wydaje się niepotrzebnie skomplikowany. Szukam szczuplejszego rozwiązania. –

+0

Co powiesz na temat Java Rules Engine API opartego na JSR 94? Jest też jeden o nazwie Jess. Możesz znaleźć listę pod tym linkiem: http://java-source.net/open-source/rule-engines – Sid

+2

Będziesz mieć takie same problemy z projektowaniem. Zmiana implementacji mechanizmu reguł nie pomoże. Drools implementuje JSR-94, ale interfejs JSR-94 API jest zbyt ograniczony dla większości rzeczywistych przypadków użycia. Nie rozwinęła się od lat. –

0

Miałem podobny problem i użyłem bazy danych węzła Neo4J jako prostego i bardzo elastycznego mechanizmu reguł. Można go używać z interfejsem usługi REST, więc jest niezależny od głównej aplikacji. Możesz także mieć osobną aplikację do konfiguracji reguł (nawet przez użytkowników końcowych).

Powiązane problemy