Drools7 指定规则执行

Drools7 提供 AgendaFilter 接口,允许自定义规则执行。内置了 RuleNameEndsWithAgendaFilter、RuleNameEqualsAgendaFilter、RuleNameMatchesAgendaFilter 和 RuleNameStartsWithAgendaFilter 等过滤器,可以根据规则名称的后缀、全名、正则表达式和前缀来选择执行的规则。此外,还可以通过实现 AgendaFilter 接口创建自定义过滤器,如 RulePackageNameStartsWithAgendaFilter,根据规则包名前缀进行过滤。
AgendaFilter 接口
int fireAllRules(AgendaFilter agendaFilter);

在提交规则执行,如果不传参数,那么默认是将内存中的规则全部执行一遍。此外,也允许我们传递 AgendaFilter 参数。该参数是一个过滤器接口。允许使用者自行实现,Drools 也内置了几种过滤器。

/**
 * Fire all Matches on the Agenda
 *
 * @param agendaFilter
 *      filters the Matches that may fire
 * @return
 *      returns the number of rules fired
 */
int fireAllRules(AgendaFilter agendaFilter);

AgendaFilter 接口定义:

public interface AgendaFilter {
    /**
     * Determine if a given match should be fired.
     *
     * @param match
     *     The match that is requested to be fired
     * @return
     *     boolean value of "true" accepts the match for firing.
     */
    boolean accept(Match match);
}
RuleNameEndsWithAgendaFilter

指定以XXX结尾的规则,根据指定的规则名称后缀过滤器激活。RuleNameEndsWithAgendaFilter 实现了 AgendaFilter 接口, accept 函数获取了规则的名称并且进行后缀比较。

public boolean accept(Match activation) {
    if (activation.getRule().getName().endsWith(this.suffix)) {
        return this.accept;
    } else {
        return !this.accept;
    }
}
int i =ksession.fireAllRules(new RuleNameEndsWithAgendaFilter("xxx"));
RuleNameEqualsAgendaFilter

指定名称为XXX的规则,根据指定的规则名称过滤器激活。RuleNameEqualsAgendaFilter 实现了 AgendaFilter 接口, accept 函数获取了规则的名称并且进行全等比较。

public boolean accept(Match activation) {
    if (activation.getRule().getName().equals(this.name)) {
        return this.accept;
    } else {
        return !this.accept;
    }
}
int i =ksession.fireAllRules(new RuleNameEqualsAgendaFilter("xxx"));
RuleNameMatchesAgendaFilter

指定符合正则的规则,根据满足正则的过滤器激活。RuleNameMatchesAgendaFilter 实现了 AgendaFilter 接口, accept 函数获取了规则的名称并且进行正则匹配。

public boolean accept(Match activation) {
    Matcher matcher = this.getPattern().matcher(activation.getRule().getName());
    return !this.accept ^ matcher.matches();
}
int i =ksession.fireAllRules(new RuleNameMatchesAgendaFilter(\\w{0,5}[\\u4e00-\\u9fa5]{0,10}\\d));
RuleNameStartsWithAgendaFilter

指定xxx名称前缀的规则,根据指定的规则名称前缀过滤器激活。 RuleNameStartsWithAgendaFilter 实现了 AgendaFilter 接口, accept 函数获取了规则的名称并且进行前缀比较。

public boolean accept(Match activation) {
    if (activation.getRule().getName().startsWith(this.prefix)) {
        return this.accept;
    } else {
        return !this.accept;
    }
}
int i =ksession.fireAllRules(new RuleNameStartsWithAgendaFilter("xxx"));
自定义 AgendaFilter
RulePackageNameStartsWithAgendaFilter

指定xxx包名称前缀的规则,根据指定的包名中的规则过滤器激活。 RulePackageNameStartsWithAgendaFilter 实现了 AgendaFilter 接口, accept 函数获取了规则的所属包名并且进行前缀比较。

public class RulePackageNameStartsWithAgendaFilter implements AgendaFilter {
    private String packageNameStartsWith;

    public RulePackageNameStartsWithAgendaFilter() {
    }

    public RulePackageNameStartsWithAgendaFilter(String packageNameStartsWith) {
    }

    @Override
    public boolean accept(Match match) {
        Rule rule = match.getRule();
        String packageName = rule.getPackageName();
        return packageName.startsWith(packageNameStartsWith);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值