今天有朋友加我微信好友(微信号:541075754),咨询如何通过API获取规则名称,准确得说应该是规则列表。

针对这个问题通常有两个场景,第一个场景为执行规则之外的代码中获得规则名称的列表;第二个场景为触发的规则中获取规则名称。

DRL文件中获取规则名称

首先来看第二种形式的获取,也就是在DRL文件中(通常是then中)获取当前被触发的规则的名称。

这种情况采用drools内置的drools对象即可获取,比如在规则文件的then中直接通过如下形式便可获取Rule名称。

drools.getRule().getName();

上述代码没错,直接使用drools即可,不用定义和获取,直接拿来就用。

这样虽然能够获得规则名称,但前提条件是规则得触发,然后获得名称之后,通过一定形式的Fact对象即可返回到调用方。但如果在执行之前就想获得规则的列表信息呢?

这就回到了第一种情况:获得规则列表。

获得规则名称列表

这里我们以KieSession为对象的入口来进行获取,对应的代码片段如下:

Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
        for (KiePackage kiePackage : kiePackages) {
            Collection<Rule> rules = kiePackage.getRules();
            for (Rule rule : rules) {
                System.out.println(rule.getPackageName() + " : " + rule.getName());
            }
        }

也就是说通过KieSession获得KIEBase,然后获得所有的packages,在KiePackage对象中存储了它下面的规则(Rule)列表信息。

然后再对Rule列表进行遍历,即可获得对应的规则及规则所在的包等信息。

当然,如果你还想获得其他时机的规则名称,也可以通过添加监听器(Listener)来进行监听,同时获得事件触发前后对应的规则情况。



Drools规则引擎如何获取规则名称和列表插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2021/01/11/drools-rule-names/