2011-02-03 5 views
9

지금 작업하고있는 응용 프로그램에서 일종의 서비스에 대한 수만 가지 개체의 적합성을 주기적으로 확인해야합니다. 의사 결정 다이어그램 그 자체는 다음과 같은 형태로되어 있습니다. Decision diagram의사 결정 트리 및 규칙 엔진 (Drools)

각 끝 노드 (원)에서 동작 (개체 필드, 로그 정보 등 변경)을 실행해야합니다. Drool Expert 프레임 워크를 사용해 보았습니다. 그러나이 경우 다이어그램의 모든 경로에 대해 긴 노드를 작성해야합니다. Drools Flow는 이러한 유스 케이스를 위해 구축 된 것 같지 않습니다 - 객체를 가져온 다음 결정 과정에 따라 최종 노드 중 하나에서 끝납니다. 다른 객체에 대해 다시 아니면 그렇지? 그러한 솔루션에 대한 몇 가지 예/링크를 제공해 주시겠습니까?

UPDATE :

Drools가 흐름은 다음과 같을 수 호출 : 나는 그것을 위해 새로운 프로세스를 응용 프로그램 개체을 시작했으면, 프로세스가 완료되는 때이다

// 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); 
} 

(최종, 작업 노드가 어떻게 든 응용 프로그램을 수정할 것입니다) 작업 메모리에서 객체를 제거하고 새 App 객체에 대한 프로세스를 반복합니다. 이 솔루션에 대해 어떻게 생각하십니까?

해결 방법 :
나는 Drools가 흐름을 사용하여 종료했는데 꽤 잘 작동되었습니다. 내 결정 과정은 Drools Expert가 묻는 것처럼 간단하지 않으며 의사 결정 트리에서 데이터베이스의 개체 목록을로드하고 변환하며 결정을 내리고 모든 것을 기록해야합니다. 프로세스 개체를 사용합니다. 이것은 매개 변수로 프로세스에 전달되고 내 전역 변수 (프로세스 용)와 트리의 다른 지점에서 반복되는 일부 편리한 메소드를 저장합니다. Script Task 노드의 Java 코드 작성은 그다지 편리하지 않습니다. 또한 결정을 내리기 위해 Java를 사용하는 것으로 끝났습니다 (mvel 또는 규칙이 아님) - 더 빠르고 더 쉽게 제어 할 수 있습니다. 내가 작업하는 모든 객체는 매개 변수로 전달되고 코드에서 일반적인 Java 변수로 사용됩니다.

답변

12

Drools 전문가은 확실히 방법입니다.

더 높은 노드에 대해 반복하지 않으려면, insertLogical (또는 무 상태 세션에있는 경우 insert)을 사용하고 규칙이 규칙을 트리거 할 수 있음을 이해해야합니다 (아버지의 SQL 질문). 예를 들어 결정 다이어그램은 자주 변경 (당신이 프로그래머가 아닌 그것을 편집 할) 경우

// 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 

, 의사 결정 테이블 (및 DSL)에 대한 문서를보십시오. 이 경우 각 규칙에 대해 전체 경로를 반복 할 수 있지만 대부분의 경우 실제로 괜찮습니다.

+0

또한 의사 결정 트리가 커짐에 따라 일부 종말점이 행동을 공유한다는 것을 알 수 있습니다 (예 : 퇴직자가 성별과 상관없이 연금을받을 필요가 있음). 종말마다 해당 행동을 다시 선언하는 것은 비효율적입니다. –

+0

Drools Flow는 어떻게됩니까? 나는 그것을 사용하여 의사 결정 트리를 모델링 할 수 있습니다. 그리고 나서 하나의 객체를 작업 메모리에 넣고, 프로세스를 시작하고, 어떤 노드를 가지고 갈지 결정한 다음, 객체를 꺼내고, 다른 객체를 넣고, 다시 시작하는 등의 작업을 할 수 있습니다. ? 그게 더 명확한 해결책이 아닌가? –

+0

Drools Flow가 의미가 없습니다. 그것이 작동하지 않는다고 말하는 것은 아니지만 결정을 내려야하기 때문에 규칙 엔진으로 구현 된 결정 테이블은 훨씬 더 논리적/자연적으로 느껴집니다. 워크 플로우에 맞추려고 노력합니다. 워크 플로우가 오래 지속되며, 각 노드는 상태입니다. –

-1

iLog 프레임 워크 룰 엔진을 사용해 볼 수 있습니다.

+1

감사합니다. 그러나 iLog는 불필요하게 복잡해 보입니다. 나는 더 희박한 해결책을 찾고있다. –

+0

JSR 94 기반의 Java Rules Engine API는 어떻습니까? Jess라고하는 사람도 있습니다. 다음 링크에서 목록을 찾을 수 있습니다. http://java-source.net/open-source/rule-engines – Sid

+2

동일한 디자인 문제가 있습니다. 룰 엔진 구현을 전환하는 것은 도움이되지 않습니다. Drools는 JSR-94를 구현하지만 JSR-94 API는 대부분의 실제 사용 사례에 너무 제한되어 있습니다. 몇 년 동안 진화하지 않았습니다. –

0

비슷한 문제가있어서 간단하고 매우 유연한 규칙 엔진으로 Neo4J 노드 데이터베이스를 사용했습니다. REST 서비스 인터페이스와 함께 사용할 수 있으므로 기본 응용 프로그램과 독립적입니다. 규칙을 구성하는 별도의 응용 프로그램 (최종 사용자도 포함)을 가질 수도 있습니다.

관련 문제