drools_08_event_listener
KieSession 除了提供豐富的API外, 還提供三個(gè)event listener, 方便對(duì)于規(guī)則執(zhí)行狀況的監(jiān)控.
AgendaEventListener
該接口可以監(jiān)控 rule 被fire, 所以這個(gè)listener最常用, 對(duì)于規(guī)則的計(jì)算, 我們很可能需要做logging, 常見的做法是在drl的RHS主動(dòng)做logging, 但這并不是很好的方式, 一來RHS代碼會(huì)變得冗長(zhǎng), 二來也可能會(huì)漏寫logging.
使用方法:
Drools 提供了一個(gè)缺省的 DefaultAgendaEventListener 類, 我們可以實(shí)例化一個(gè)這個(gè)類, 并重載一些我們關(guān)注的方法, beforeMatchFired() 方法是在規(guī)則執(zhí)行之前被調(diào)用;afterMatchFired() 方法是在規(guī)則執(zhí)行之后被調(diào)用; matchCreated() 方法是規(guī)則被放到agenda時(shí)被調(diào)用;
RuleRuntimeEventListener
可以監(jiān)聽哪些fact 被加到working memory中了, 不管這些fact是通過rule還是java端做的insert()/update()/delete() 都能觸發(fā) RuleRuntimeEventListener.
使用方法:
Drools 提供了一個(gè)缺省的 DefaultRuleRuntimeEventListener 類, 我們可以實(shí)例化一個(gè)這個(gè)類.
ProcessEventListener
這個(gè)監(jiān)聽的事件僅和jBPM相關(guān), 所以不需要關(guān)心.
示例代碼
- drl 規(guī)則文件:
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 測(cè)試文件:
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);
}
}
@Override
public void matchCreated(MatchCreatedEvent event) {
super.matchCreated(event);
System.out.println("The rule " + event.getMatch().getRule().getName() + " can be fired in agenda");
}
@Override
public void matchCancelled(MatchCancelledEvent event) {
super.matchCancelled(event);
System.out.println("The rule " + event.getMatch().getRule().getName()+ " cannot b in agenda");
}
});
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 objectInserted(ObjectInsertedEvent event) {
// TODO Auto-generated method stub
super.objectInserted(event);
System.out.println("inserted:" + event.getObject());
}
@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();
}
}

浙公網(wǎng)安備 33010602011771號(hào)