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

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

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

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

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

难道没有别的策略吗?

【问题讨论】:

    标签: drools rule-engine


    【解决方案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"))
    猜你喜欢
    • 2012-03-14
    • 2014-06-25
    • 1970-01-01
    • 2022-11-30
    • 2013-10-15
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多