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: Drzewa 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.
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. –
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? –
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. –