drools 7.x-复杂事件处理入门

1.什么是drools fusion

它是drools用来进行事件处理的一个模块,做CEP系统,CEP(Complex Event Processing)是"复杂事件处理"的缩写,那cep到底又是什么,可以简单的理解为流式数据处理,每条数据看做一个事件,这些事件有时间上的顺序性。

2.规则

1.首先需要注意的是,用fusion,要把插入drools的数据声明为事件,drools处理数据有两种方式,云模式和流模式,默认是云模式,用fusion,需要设置为流模式,流模式和云模式的区别就是,流模式,插入的数据叫事件,有时间顺序,云模式没有,下图是设置流模式的一种方式:

 
    
        
    

2.需要注意的是,要把插入的数据声明为event,默认是fact,可以再规则文件中声明,如下图所示,另外图中的“@expires”用来显示设置事件的过期时间,也就是说过了这个时间,该事件就会从会话中移除,不能再使用

package com.rules

import entity.Person

declare  Person
   @role(event)     // 要把插入的数据声明为event,默认是fact,
   @expires(20s)    // 用来显示设置事件的过期时间,也就是说过了这个时间,该事件就会从会话中移除,不能再使用
end

rule "testComplexEvent"
    when
    	// 这一点只过滤最近3秒内的数据,多余3秒的数据,就丢掉了
        $p:Person() over window:time(3s)
    then
        System.out.println("---age---"+$p.getCount());
end

实体类

package entity;

import lombok.Data;

/**
 * Created by lcc on 2018/9/28.
 */
@Data
public class Person {
    private int id;
    private String name ;
    private int count;

    public Person(String name, int count) {
        this.name = name;
        this.count = count;
    }

    public Person(int id, String name, int count) {
        this.id = id;
        this.name = name;
        this.count = count;
    }
}

测试

 /**
     * 测试点:复杂事件处理
     *
     * 运行结果:
     *
     * ---age---30
     * 总执行了1条规则
     */
    @Test
    public void complex1() throws Exception{
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks =kc.newKieSession("test4");
//        ks.addEventListener( new DebugAgendaEventListener() );
//        ks.addEventListener( new DebugRuleRuntimeEventListener() );
        Person person1  =   new Person(1,"张三",10);
        Person person2  =   new Person(2,"张三",30);
        ks.insert(person1);
        Thread.sleep(4000);
        ks.insert(person2);
        int count = ks.fireAllRules();
        System.out.println("总执行了"+count+"条规则");
        ks.dispose();

    }


    /**
     * 测试点:复杂事件处理
     *
     * 运行结果:
     *
     * ---age---30
     * ---age---10
     * 总执行了2条规则
     */
    @Test
    public void complex2() throws Exception{
        KieServices kss = KieServices.Factory.get();
        KieContainer kc = kss.getKieClasspathContainer();
        KieSession ks =kc.newKieSession("test4");
//        ks.addEventListener( new DebugAgendaEventListener() );
//        ks.addEventListener( new DebugRuleRuntimeEventListener() );
        Person person1  =   new Person(1,"张三",10);
        Person person2  =   new Person(2,"张三",30);
        ks.insert(person1);
//        Thread.sleep(4000);
        ks.insert(person2);
        int count = ks.fireAllRules();
        System.out.println("总执行了"+count+"条规则");
        ks.dispose();

    }

可以看到第二个测试去除休眠40秒,所以事件person1没有被丢弃,第一个因为睡过头了,被丢弃了

你可能感兴趣的:(规则引擎-CEP,规则引擎)