如何通过drools引擎执行特定规则集?

2026-05-25 04:301阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计906个文字,预计阅读时间需要4分钟。

如何通过drools引擎执行特定规则集?

目录 + 1. 背景 + 2. 案例分析 + 2.1 使用AgendaFilter实现 + 2.2 使用entry-point实现 + 3. 实现步骤 + 3.1 需求 + 3.2 DRL文件编写 + 3.3 部分Java代码 + 3.4 运行结果 + 4. 完整代码 + 1. 背景 + 在我们编写drools规则文件的实践中...

目录
  • 1、背景
  • 2、方案
    • 2.1 通过AgendaFilter来实现
    • 2.2 通过entry-point来实现
  • 3、实现
    • 3.1 需求
    • 3.2 drl 文件编写
    • 3.3 部分java代码
    • 3.4 运行结果
  • 4、完整代码

1、背景

在我们编写drools规则文件的过程中,可能会编写好多规则。drools引擎在模式匹配的时候,可能一下子激活了好多规则,但是我只想执行某个指定的规则,那么这个时候该怎么操作呢?

2、方案 2.1 通过AgendaFilter来实现

我们知道,在drools模式匹配的时候,会将所有的规则进行匹配,匹配成功的规则会放入到Agenda(议程)中,而fireAllRules(AgendaFilter)方法,可以传递一个AgendaFilterAgenda中的激活的规则进行过滤。

2.2 通过entry-point来实现

使用entry-point可以定义模式的数据源对应的入口点或事件流。这个不能完全实现,只是提供一个思路。

举个例子:

Api(api == "/users/info" ) from entry-point "first-entry-point"

Api api = new Api("/users/info", 100); EntryPoint entryPoint = kieSession.getEntryPoint("second-entry-point"); entryPoint.insert(api); kieSession.fireAllRules();

上面这个例子,虽然工作内存中存在Api这个对象,但是由于 规则中的 entry-point和java代码中的entry-point不一致,规则是没有匹配成功的。

3、实现

此处我们通过 AgendaFilter来实现具体调用某个具体的规则。

3.1 需求

我们存在一个Api(api,invokedCnt)对象

规则一:工作内存中存在Api对象,且属性api=="/users/info"
规则二:工作内存中存在Api对象,且属性invokedCnt > 10

我们向工作内存中插入一个 Api("/users/info",100),此时规则一和规则二都会匹配到,但是我只想执行规则二。

3.2 drl 文件编写

package rules import com.huan.drools.Api rule "rule_agenda_filter_01" when $api: Api(api == "/users/info" ) then System.out.println("当前执行的规则是: " + drools.getRule().getName()); end rule "rule_agenda_filter_02" when $api: Api(invokedCnt > 10) then System.out.println("当前执行的规则是: " + drools.getRule().getName()); end 3.3 部分java代码

Api api = new Api("/users/info", 100); kieSession.insert(api); // 所有模式匹配成功后的规则回进入到agenda中,然后通过AgendaFilter过滤出需要执行的规则 kieSession.fireAllRules(new AgendaFilter() { @Override public boolean accept(Match match) { String ruleName = match.getRule().getName(); return Objects.equals(ruleName, "rule_agenda_filter_02"); } });

可以看到此处通过AgendaFilter进行了规则的过滤,只执行rule_agenda_filter_02规则。

注意: 此处虽然是一个过滤,但是并不意味着只有rule_agenda_filter_02规则是激活的,而是所有满足条件的规则都是激活的。

3.4 运行结果

当前执行的规则是: rule_agenda_filter_02

可以看到实现了我们想要的结果。

如何通过drools引擎执行特定规则集?

4、完整代码

gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-invoked-specify-rule

本文共计906个文字,预计阅读时间需要4分钟。

如何通过drools引擎执行特定规则集?

目录 + 1. 背景 + 2. 案例分析 + 2.1 使用AgendaFilter实现 + 2.2 使用entry-point实现 + 3. 实现步骤 + 3.1 需求 + 3.2 DRL文件编写 + 3.3 部分Java代码 + 3.4 运行结果 + 4. 完整代码 + 1. 背景 + 在我们编写drools规则文件的实践中...

目录
  • 1、背景
  • 2、方案
    • 2.1 通过AgendaFilter来实现
    • 2.2 通过entry-point来实现
  • 3、实现
    • 3.1 需求
    • 3.2 drl 文件编写
    • 3.3 部分java代码
    • 3.4 运行结果
  • 4、完整代码

1、背景

在我们编写drools规则文件的过程中,可能会编写好多规则。drools引擎在模式匹配的时候,可能一下子激活了好多规则,但是我只想执行某个指定的规则,那么这个时候该怎么操作呢?

2、方案 2.1 通过AgendaFilter来实现

我们知道,在drools模式匹配的时候,会将所有的规则进行匹配,匹配成功的规则会放入到Agenda(议程)中,而fireAllRules(AgendaFilter)方法,可以传递一个AgendaFilterAgenda中的激活的规则进行过滤。

2.2 通过entry-point来实现

使用entry-point可以定义模式的数据源对应的入口点或事件流。这个不能完全实现,只是提供一个思路。

举个例子:

Api(api == "/users/info" ) from entry-point "first-entry-point"

Api api = new Api("/users/info", 100); EntryPoint entryPoint = kieSession.getEntryPoint("second-entry-point"); entryPoint.insert(api); kieSession.fireAllRules();

上面这个例子,虽然工作内存中存在Api这个对象,但是由于 规则中的 entry-point和java代码中的entry-point不一致,规则是没有匹配成功的。

3、实现

此处我们通过 AgendaFilter来实现具体调用某个具体的规则。

3.1 需求

我们存在一个Api(api,invokedCnt)对象

规则一:工作内存中存在Api对象,且属性api=="/users/info"
规则二:工作内存中存在Api对象,且属性invokedCnt > 10

我们向工作内存中插入一个 Api("/users/info",100),此时规则一和规则二都会匹配到,但是我只想执行规则二。

3.2 drl 文件编写

package rules import com.huan.drools.Api rule "rule_agenda_filter_01" when $api: Api(api == "/users/info" ) then System.out.println("当前执行的规则是: " + drools.getRule().getName()); end rule "rule_agenda_filter_02" when $api: Api(invokedCnt > 10) then System.out.println("当前执行的规则是: " + drools.getRule().getName()); end 3.3 部分java代码

Api api = new Api("/users/info", 100); kieSession.insert(api); // 所有模式匹配成功后的规则回进入到agenda中,然后通过AgendaFilter过滤出需要执行的规则 kieSession.fireAllRules(new AgendaFilter() { @Override public boolean accept(Match match) { String ruleName = match.getRule().getName(); return Objects.equals(ruleName, "rule_agenda_filter_02"); } });

可以看到此处通过AgendaFilter进行了规则的过滤,只执行rule_agenda_filter_02规则。

注意: 此处虽然是一个过滤,但是并不意味着只有rule_agenda_filter_02规则是激活的,而是所有满足条件的规则都是激活的。

3.4 运行结果

当前执行的规则是: rule_agenda_filter_02

可以看到实现了我们想要的结果。

如何通过drools引擎执行特定规则集?

4、完整代码

gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-invoked-specify-rule