Drools Fusion滑动窗口样本不工作

Drools Fusion滑动窗口样本不工作,drools,sliding-window,drools-fusion,Drools,Sliding Window,Drools Fusion,我是个新手,喜欢流口水,尝试滑动窗口的概念 我的问题是检测两个销售事件中是否至少发生了成功的交易。我总是以“一次销售发生在两个事件上”的形式获得输出,即使这样的事件是否发生 -------------drl---------- -------------代码---------- 这是有关的。bugzilla条目解释了滑动窗口事件触发的概念以及事件如何不从窗口脱落 可按如下方式进行固定: --------------drl-------------------- declare Sale @ro

我是个新手,喜欢流口水,尝试滑动窗口的概念

我的问题是检测两个销售事件中是否至少发生了成功的交易。我总是以“一次销售发生在两个事件上”的形式获得输出,即使这样的事件是否发生

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

-------------代码----------

这是有关的。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

嗨,我有一个相关的问题。我看到在java代码中,我们需要“insert()”感兴趣的事件,然后调用
ksession.fireAllRules()
。但这不是真的,尤其是,我应该能够在以后插入事件。是否可以在调用
ksession.fireAllRules()
后继续添加事件谢谢,维姆
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;




    }

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