KieSession 除了提供丰富的API外, 还提供三个event listener, 方便对于规则执行状况的监控.
AgendaEventListener
该接口可以监控 rule 被fire, 所以这个listener最常用, 对于规则的计算, 我们很可能需要做logging, 常见的做法是在drl的RHS主动做logging, 但这并不是很好的方式, 一来RHS代码会变得冗长, 二来也可能会漏写logging.
使用方法:
Drools 提供了一个缺省的 DefaultAgendaEventListener
类, 我们可以实例化一个这个类, 并重载beforeMatchFired() 和 afterMatchFired() 方法.
RuleRuntimeEventListener
可以监听哪些fact是在rule 通过 insert()/update()/delete() 宏函数重触发了规则计算.
关于 update() 宏函数的重新触发, 如果一个规则的LHS部分用到的对象属性, 在规则的RHS做了修改, 那么执行update()宏函数会重复触发该规则, 如果修改的属性不涉及LHS部分, 本规则将不会被重新触发.
使用方法:
Drools 提供了一个缺省的 DefaultRuleRuntimeEventListener
类, 我们可以实例化一个这个类.
ProcessEventListener
这个监听的事件仅和jBPM相关, 所以不需要关心.
示例代码
- drl 规则文件:
package com.sample.rules
import com.sample.Order;
rule "not_worry_loop"
when
$order:Order(originalPrice>0)
then
$order.setAmount(100);
update($order) ; //trigger DefaultRuleRuntimeEventListener
end
- java 测试文件:
package com.sample;
import java.util.List;
import org.drools.core.event.DefaultAgendaEventListener;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.DefaultRuleRuntimeEventListener;
import org.kie.api.event.rule.ObjectDeletedEvent;
import org.kie.api.event.rule.ObjectUpdatedEvent;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class UnitTest {
@Test
public void test() {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
kSession.addEventListener(new DefaultAgendaEventListener() {
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
// TODO Auto-generated method stub
super.afterMatchFired(event);
System.out.println("=============");
List<Object> orders = event.getMatch().getObjects();
for (Object order : orders) {
System.out.println(order);
}
}
});
kSession.addEventListener(new DefaultRuleRuntimeEventListener() {
@Override
public void objectDeleted(ObjectDeletedEvent event) {
// TODO Auto-generated method stub
super.objectDeleted(event);
System.out.println("deleted:" + event.getOldObject());
}
@Override
public void objectUpdated(ObjectUpdatedEvent event) {
// TODO Auto-generated method stub
super.objectUpdated(event);
System.out.println("update:" + event.getObject());
}
});
Order order = null;
order = new Order();
order.setAmount(2);
order.setOriginalPrice(0.2D);
kSession.insert(order);
order = new Order();
order.setAmount(20);
order.setOriginalPrice(2.0D);
kSession.insert(order);
kSession.fireAllRules();
kSession.dispose();
}
}