2012-09-18 2 views
1

Drools의 초보자이며 슬라이딩 윈도우 개념을 시도하고 있습니다.Drools Fusion 슬라이딩 윈도우 샘플이 작동하지 않습니다.

내 문제는 적어도 2 개의 판매 이벤트에서 성공적인 거래가 발생했는지 감지하는 것입니다. 나는 그러한 사건이 발생했는지 여부와 관계없이 항상 "판매가 2 건의 사건 이상 발생했습니다"라는 결과를 얻고 있습니다.

------------- DRL ----------

declare Sale 
@role(event) 
end 

rule "Identify more than a single valid sale event" 

//The variable saleHappened would be set to Y if a successful transaction 

when sale: Sale (saleHappened == "Y") over window:length(2) from entry-point MyEntryPoint 

then 

System.out.println("A sale has happened over 2 events"); 

end 

------------- 코드 - ---------

public class DroolsTest { 

    public static final void main(String[] args) { 
     try { 

      // load up the knowledge base 
      KnowledgeBase kbase = readKnowledgeBase(); 

      StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

      WorkingMemoryEntryPoint entryPoint = ksession.getWorkingMemoryEntryPoint("MyEntryPoint"); 


      Sale sale = new Sale(); 

      sale.setSaleHappened("N"); 
      entryPoint.insert(sale); 


      Sale sale2 = new Sale(); 

      sale2.setSaleHappened("N"); 
      entryPoint.insert(sale2); 


      ksession.fireAllRules(); 

      ksession.dispose(); 

     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 


    private static KnowledgeBase readKnowledgeBase() throws Exception { 

     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
     kbuilder.add(ResourceFactory.newClassPathResource("Sample.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."); 
     } 

     final KnowledgeBaseConfiguration kbConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); 
     kbConfig.setOption(EventProcessingOption.STREAM); 
     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConfig); 
     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
     return kbase; 
    } 

    public static class Sale { 

     public Sale() { 

     } 

     public String getSaleHappened() { 
      return saleHappened; 
     } 

     public void setSaleHappened(String saleHappened) { 
      this.saleHappened = saleHappened; 
     } 

     private String saleHappened; 




    } 

} 

답변

1

이것은 Bug 787118 - Length sliding window keeps all events과 관련됩니다. 슬라이딩 윈도우 이벤트 발생의 개념과 이벤트가 윈도우에서 떨어지지 않는 방법은 bugzilla 항목에서 설명합니다. 다음과 같이

고정 할 수 있습니다

--------------drl-------------------- 

declare Sale 
@role(event) 
end 

declare window Ticks 
    Sale() 
     over window:length(5) 
     from entry-point MyEntryPoint 
end 


rule "More than 2 sale suceess in 5 events" 
when  Number($cnt : intValue,intValue > 2) 
from accumulate(Sale (saleHappened == "Y") from window Ticks, count(1)) 
then 
    System.out.println("A sale has happened over " + $cnt +" events"); 
end 
+1

안녕, 난 관련 질문이 있습니다. 자바 코드에서 관심있는 이벤트를 삽입 (insert)하고 나서 ksession.fireAllRules()를 호출 할 필요가있다. 그러나 이것은 진정한 ESP가 아닙니다. 나중에 이벤트를 삽입 할 수 있어야합니다. 'ksession.fireAllRules()'를 호출 한 후에도 계속 이벤트를 추가 할 수 있습니까? 고마워, 빅 – weima