2012-09-18 45 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