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代码是可以传变量的,该监听器还提供了变量的事项监听等。