2011-05-03 2 views
8

배경 : I이 샘은 규칙 세트에 기초하여 두 개의 출력 개체 중 하나에 입력 객체 변환 애플리케이션에 일하고런타임시 Drools DRL에서 작업 메모리에 팩트를 추가하고 상태 비 저장 세션의 실행 결과에서 팩트를 검색하려면 어떻게합니까?

. 출력 개체는 런타임까지 알 수 없으며 실행할 첫 번째 규칙에서 만들어집니다. 규칙을 호출하는 코드 여기

rule "Initialization" 
    dialect "java" 
    salience 1000 
    no-loop true 
    when 
     t : Trade() 
    then 
     if(t.getTran().getInsType().equalsIgnoreCase("EEO") || 
      t.getTran().getInsType().equalsIgnoreCase("EEF")) 
     { 
      insert(new Option()); 
     } 
     else 
     { 
      insert(new Swap()); 
     } 
end 

rule "Example Rule" 
    dialect "java" 
    when 
     t : Trade() 
     opt : Option() 
    then 
     opt.setCounterpartyName(t.getTran().getCParty()); 
end 

된다 :

private void test(){ 
    for(File xmlFile : getXmlFilesFromDirectory(XML_DIRECTORY)) 
    { 
     Trade trade = (Trade)unmarshall(xmlFile, Trade.class); 

     KnowledgeBase kbase = readKnowledgeBase(); 

     StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession(); 
     KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession); 

     List<Command> commands = new ArrayList<Command>(); 
     commands.add(CommandFactory.newInsert(trade, "trade")); 
     commands.add(CommandFactory.newFireAllRules()); 

     ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(commands)); 
     logger.close(); 
    } 
} 

private static KnowledgeBase readKnowledgeBase() throws Exception 
{ 
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
    kbuilder.add(ResourceFactory.newClassPathResource("security-transformation.drl"), ResourceType.DRL); 
    KnowledgeBuilderErrors errors = kbuilder.getErrors(); 
    if (errors.size() > 0) 
    { 
     for (KnowledgeBuilderError error: errors) 
     { 
      System.err.println(error); 
     } 

     throw new IllegalArgumentException("Could not parse knowledge."); 
    } 

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
    return kbase; 
} 

문제점 :

여기

출력 객체 및 예시 변환 규칙을 생성하는 룰이며

규칙을 실행할 때 반환 된 사실에 출력 개체를받지 못합니다. 무역 객체를 다시 받지만 첫 번째 규칙에 따라 작업 메모리에 추가 된 Option 또는 Swap 객체가 반환되지 않습니다.

질문 :

어떻게이 DRL에서 런타임에 작업 메모리에 사실을 추가하고 stateless 세션의 실행 결과를 검색 할 수 있습니까?

편집 : drools 쿼리를 사용해야합니까?

+0

이 질문에 suugest하시기 바랍니다. 감사. http://stackoverflow.com/questions/20158726/dialect-error-message-drool – Kumar

답변

10

나는 drools 쿼리를 사용했다. 나는 다른 사람을 위해 코드를 올릴 것이다.

쿼리 (객체가 BaseTrade을 확장) 위의 규칙에 추가 :

query "GetOutputObj" 
    baseTrade: BaseTrade() 
end 

코드 실행 결과에서 쿼리 결과를 검색 :

StatelessKnowledgeSession ksession = this.kbase.newStatelessKnowledgeSession(); 

    KnowledgeRuntimeLogger klogger = configureKnowledgeRuntimeLogger(ksession); 

    List<Command> commands = new ArrayList<Command>(); 
    commands.add(CommandFactory.newInsert(inputObj, "inputObj")); 
    commands.add(CommandFactory.newFireAllRules()); 
    commands.add(CommandFactory.newQuery("outputObj", "GetOutputObj")); 

    ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(commands)); 

    QueryResults queryResults = ((NativeQueryResults)results.getValue("baseTrade")).getResults(); 

    try 
    { 
     Iterator iter = queryResults.iterator(); 
     while(iter.hasNext()) 
     { 
      QueryResult result = iter.next(); 

      //There can be only one... just like Highlander 
      //Could switch this up and return a list, but we only expect one thing from here. 
      return (BaseTrade) result.get("baseTrade"); 
     } 
    } 
    finally 
    { 
     if(klogger != null) 
     { 
      klogger.close(); 
     } 
    } 
+0

귀중한 게시물 @ gwhitake 주셔서 감사합니다. 첫 번째 타이머를 명확하게하기 위해 솔루션의 일부만 편집하십시오. identifier가있는 객체를 가져옵니다. "baseTrade"대신 "outputObj"를 사용하십시오. QueryResults queryResults = ((NativeQueryResults) results.getValue ("outputObj")). getResults(); –

관련 문제