栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Drools-如何找出所有匹配的规则?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Drools-如何找出所有匹配的规则?

请注意,此答案对不超过5.x的Drools版本有效。 如果您已升至6或更高,请查看@
melchoir55的修改后答案。我还没有亲自测试过,但是我相信它会起作用。

若要跟踪规则激活,可以使用AgendaEventListener。下面是一个示例,可在此处找到:

https://github.com/gratiartis/sctrcd-payment-validation-
web/blob/master/src/main/java/com/sctrcd/drools/util/TrackingAgendaEventListener.java

您只需要创建这样的侦听器并将其附加到会话即可,如下所示:

ksession = kbase.newStatefulKnowledgeSession();AgendaEventListener agendaEventListener = new TrackingAgendaEventListener();ksession.addEventListener(agendaEventListener);//...ksession.fireAllRules();//...List<Activation> activations = agendaEventListener.getActivationList();

请注意,还有WorkingMemoryEventListener,使您可以跟踪事实的插入,更新和撤回。

跟踪和记录AgendaEventListener的代码:

package com.sctrcd.drools.util;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.drools.definition.rule.Rule;import org.drools.event.rule.DefaultAgendaEventListener;import org.drools.event.rule.AfterActivationFiredEvent;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TrackingAgendaEventListener extends DefaultAgendaEventListener {    private static Logger log = LoggerFactory.getLogger(TrackingAgendaEventListener.class);    private List<Activation> activationList = new ArrayList<Activation>();    @Override    public void afterActivationFired(AfterActivationFiredEvent event) {        Rule rule = event.getActivation().getRule();        String ruleName = rule.getName();        Map<String, Object> rulemetaDataMap = rule.getmetaData();        activationList.add(new Activation(ruleName));        StringBuilder sb = new StringBuilder("Rule fired: " + ruleName);        if (rulemetaDataMap.size() > 0) { sb.append("n  With [" + rulemetaDataMap.size() + "] meta-data:"); for (String key : rulemetaDataMap.keySet()) {     sb.append("n    key=" + key + ", value="  + rulemetaDataMap.get(key)); }        }        log.debug(sb.toString());    }    public boolean isRuleFired(String ruleName) {        for (Activation a : activationList) { if (a.getRuleName().equals(ruleName)) {     return true; }        }        return false;    }    public void reset() {        activationList.clear();    }    public final List<Activation> getActivationList() {        return activationList;    }    public String activationsToString() {        if (activationList.size() == 0) { return "No activations occurred.";        } else { StringBuilder sb = new StringBuilder("Activations: "); for (Activation activation : activationList) {     sb.append("n  rule: ").append(activation.getRuleName()); } return sb.toString();        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398362.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号