Drools入门之事件监听

Drools提供了3种类型的监听器,分别是RuleRuntimeEventListener、AgendaEventListener和ProcessEventListener。

根据官方的说明使用事件监听主要分为两大类型,分别为配置文件和API code。配置文件可为分为kmodule.xml和Spring.xml两种。通过API code比较直观,而且相对比较通用,可扩展。

RuleRuntimeEventListener

RuleRuntimeEventListener为规则运行时的监听,它是一个接口类型,提供了3个接口方法。

public interface RuleRuntimeEventListener extends EventListener {
    void objectInserted(ObjectInsertedEvent event);

    void objectUpdated(ObjectUpdatedEvent event);

    void objectDeleted(ObjectDeletedEvent event);
}

这三个接口,监听的是insert、update、delete的操作。

通过测试用例分别来测试这3个接口,创建isRuleRunTime.drl文件。

package rules.isListener
import com.domain.Person;

rule "test_insert"
no-loop true

    when
       	
    then
        Person person = new Person("张三",50);
        insert(person);
        System.out.println(drools.getRule().getName());

end

rule "test_update"
no-loop true

    when
       $p:Person(name=="张三")
    then
        modify($p){
        	setName("李四")
        }
        System.out.println(drools.getRule().getName());
end

rule "test_delete"
no-loop true

    when
       $p:Person(name=="李四")
    then
        delete($p)
        System.out.println(drools.getRule().getName());
end

配置文件

<kbase name="listener" packages="rules.isListener">
    <ksession name="testListener"/>
</kbase>

实现监听方法

public class RunTimeListener implements RuleRuntimeEventListener{

	public void objectInserted(ObjectInsertedEvent event) {
		System.out.println("输出Insert监听方法");
	}

	public void objectUpdated(ObjectUpdatedEvent event) {
		System.out.println("输出Update监听方法");		
	}

	public void objectDeleted(ObjectDeletedEvent event) {
		System.out.println("输出Delete监听方法");
	}

}

测试方法

@Test
public void testListener() {
    KieServices kieService = KieServices.Factory.get();
    KieContainer kieContainer = kieService.getKieClasspathContainer();
    KieSession kieSession = kieContainer.newKieSession("testListener");
    kieSession.addEventListener(new RunTimeListener());

    kieSession.fireAllRules();
    kieSession.dispose();
}

运行测试方法后,运行日志

输出Insert监听方法
test_insert
输出Update监听方法
test_update
输出Delete监听方法
test_delete

监听方法会接收event对象,下面列举一些常用的接口。

event.getRule().getName():指执行的规则名。

event.getRule().getPackageName():指执行的规则名在package的路径。

event.getRule().getId():指执行的规则名rule的参数在同包下是唯一的。

event.getRule().getNamespace():指执行的规则名在package的路径。

event.getRule().getKnowledgeType():指知识库类型(目前来看,感觉没有什么太大的作用)。

event.getRule().getMetaData():指元数据相关的一些监听,返回值是一个map。

AgendaEventListener

AgendaEventListener:议程事项的监听。它是一个接口类型,提供了10个接口方法,详见以下代码:

public interface AgendaEventListener extends EventListener {
    void matchCreated(MatchCreatedEvent event);

    void matchCancelled(MatchCancelledEvent event);

    void beforeMatchFired(BeforeMatchFiredEvent event);

    void afterMatchFired(AfterMatchFiredEvent event);

    void agendaGroupPopped(AgendaGroupPoppedEvent event);

    void agendaGroupPushed(AgendaGroupPushedEvent event);

    void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);

    void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);

    void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);

    void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);
}

理解这个监听比较简单,直接通过接口方法名就能知道是做什么的,如调用规则前、调用规则后、监听规则流的调用前与调用后等。使用该监听器时需要注意,它与规则运行时的监听相似,就是在指定一些规则的激活分组、规则流属性时,部分接口方法才会被执行,这点至关重要。以规则流为例,如果规则体中没有规则流属性,那么又怎么会去监听规则流的调用前与调用后呢。

ProcessEventListener

ProcessEventListener:流程事项的监听。它是一个接口类型,提供了12个接口方法,详见以下代码:

public interface ProcessEventListener extends EventListener {

    void beforeProcessStarted(ProcessStartedEvent event);

   
    void afterProcessStarted(ProcessStartedEvent event);

   
    void beforeProcessCompleted(ProcessCompletedEvent event);

 
    void afterProcessCompleted(ProcessCompletedEvent event);


    void beforeNodeTriggered(ProcessNodeTriggeredEvent event);


    void afterNodeTriggered(ProcessNodeTriggeredEvent event);


    void beforeNodeLeft(ProcessNodeLeftEvent event);


    void afterNodeLeft(ProcessNodeLeftEvent event);


    void beforeVariableChanged(ProcessVariableChangedEvent event);


    void afterVariableChanged(ProcessVariableChangedEvent event);
    

    default void beforeSLAViolated(SLAViolatedEvent event){};


    default void afterSLAViolated(SLAViolatedEvent event){};

}

它主要是用来针对流程与流程中元素节点的监听,在规则流章节中,介绍过规则流的Java代码是可以传变量的,该监听器还提供了变量的事项监听等。


Drools入门之事件监听
https://www.zhaojun.inkhttps://www.zhaojun.ink/archives/drools-listener
作者
卑微幻想家
发布于
2022-08-03
许可协议