Drools 在运行时禁用规则

Posted

技术标签:

【中文标题】Drools 在运行时禁用规则【英文标题】:Drools disable a rule at runtime 【发布时间】:2012-06-05 15:52:56 【问题描述】:

我正在使用 Drools 和 Drools Guvnor 开始一个项目。

我的规则部署在 drools guvnor 中。当您进行软件包发布构建和发布时,我的规则引擎实例可以通过 drools Guvnor 公开的 pkg 文件访问这些规则。

这一切都很好,我正在寻找的是在运行时禁用规则的解决方案。

我现在唯一的解决方案是去 guvnor,归档规则,然后构建 + 发布包含该规则的包。

难道没有别的策略吗?

【问题讨论】:

【参考方案1】:

有几种方法可以解决这个问题,具体取决于您的要求和架构。

一种方法是在不同的 guvnor 包中定义规则的每个子集。在构建您的 kbase 时,您可以只加载具有您想要的 kbase 规则的包。

另一种方式是始终加载所有规则,但使用“启用”表达式动态启用/禁用规则。请注意,这种情况下的规则仍在评估中,但可以阻止它们激活。对于您希望根据插入会话的事实启用/禁用规则的情况,这是一种有用的技术。例如:

规则 X 启用() 然后 ...

上面的布尔表达式可以访问来自规则条件的变量绑定,以及规则属性、注释,如果你想定义条件来激活外部规则,显然你也可以访问帮助类中的静态方法到 DRL 文件。

第三种方法是使用议程过滤器。在这种情况下,您加载所有规则,使用事实创建会话,并在执行规则时使用议程过滤器。议程过滤器是您可以自己实现的接口,也可以使用 Drools 附带的一些过滤器。在触发每个规则之前调用过滤器,然后可以否决或允许引擎执行规则。请注意,在这种情况下,所有规则都会被评估和激活,但只有过滤器允许触发的规则才会被触发。例如,如果您只想触发名称以“X”开头的规则,则可以使用以下代码行:

ksession.fireAllRules(new RuleNameStartsWithAgendaFilter("x"));

更多信息,这里是界面:

https://github.com/droolsjbpm/droolsjbpm-knowledge/blob/master/knowledge-api/src/main/java/org/drools/runtime/rule/AgendaFilter.java

这是文档(向下滚动到主题 3.3.3.4.1):

http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_single/index.html#d0e2792

【讨论】:

谢谢,实际上我尝试了你提出的第二种方式,就像这篇博文中解释的那样:fusionspan.blogspot.com/2012/02/…。当我的规则从文件系统加载时它工作正常,但当规则部署在 Guvnor 时却不行。在那种情况下,我在 org.drools.base.mvel.MVELCompilationUnit.getFactory(MVELCompilationUnit.java:276) 有一个 NPE: ) 这是一个错误。无论从哪里加载,它都应该工作相同。如果您可以针对您的问题开一张票以便解决问题,那就太好了。 能否提供一个在 enabled() 函数中使用规则自己的注解的例子? 我从 Drools 源 (test_enabledExpressions.drl) 得到一个例子:enabled ( rule.metaData["ruleID"] == "1234" )【参考方案2】:

你可以为工作记忆中某些事实的存在添加条件。 比如:

rule "RuleA"
when
  not( RuleADisabled() )
  ....
then
  ....
end

并在 java 代码中禁用该规则:

ksession.insert( new RuleADisabled() );

【讨论】:

谢谢,但这意味着我必须为每个新规则创建一个新类型的事实 RuleNameDisabled。每次我将执行我的规则时,我首先必须插入禁用的规则事实。 您只能创建一种类型的事实,例如带有属性 ruleName 的 RuleDisabled 或多个规则可能取决于相同的事实,例如不是(RuleDisabled( group=="groupX"))

以上是关于Drools 在运行时禁用规则的主要内容,如果未能解决你的问题,请参考以下文章

将drools引导决策表编译成规则

在 Drools 6 中以编程方式创建新的 drools 规则的新接受方式是啥?

Drools 规则流程设计

Drools应用实例

Drools 规则中的全局变量

决策树和规则引擎 (Drools)