2012-09-18 43 views
1

是一個新手Drools和嘗試滑動窗口的概念。Drools融合滑動窗口樣本不工作

我的問題是要檢測是否至少有一個成功的交易發生在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

嗨,我有一個相關的問題。我看到在java代碼中,我們需要'插入()'感興趣的事件,然後調用'ksession.fireAllRules()'。但這不是真正的ESP。我應該可以在稍後的時間插入事件。即使在調用'ksession.fireAllRules()'後,是否可以繼續添加事件? - 謝謝,Vimal – weima