2012-05-31 63 views
8

我开始一个项目whith Drools和Drools Guvnor。Drools在运行时禁用规则

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

这一切工作正常,我正在寻找的是在运行时禁用规则的解决方案。

我现在唯一的解决方案是去guvnor,存档规则并做一个包含该规则的包的build +版本。

难道还有另一种策略吗?

回答

5

有解决这个,这取决于你的需求和架构的几种方法。

  • 一种方式是定义在不同的Guvnor包你的规则每个子集。在构建您的kbase时,您只能加载包含特定kbase所需规则的包。

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

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

    上面的布尔表达式有从规则的条件访问变量绑定,以及规则属性,注释和明明可以如果您想定义激活DRL文件外部规则的条件,也可以访问helper类中的静态方法。

  • 第三种方式这样做是通过使用议程过滤器。在这种情况下,您将加载所有规则,使用事实创建会话,并在执行规则时使用议程过滤器。议程过滤器是您可以自行实施的界面,也可以使用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

+0

谢谢,实际上我尝试了第二种方式,就像在 上解释的那样:http://fusionspan.blogspot.com/2012/02/jboss-drools-disabling - 某些-rules.html。 当我的规则是从文件系统加载的,但在Guvnor中部署规则时没有效果。在这种情况下,我有一个NPE: 显示java.lang.NullPointerException 在org.drools.base.mvel.MVELCompilationUnit.createFactory(MVELCompilationUnit.java:262) 在org.drools.base.mvel.MVELCompilationUnit.getFactory(MVELCompilationUnit .java:276) –

+0

这是一个错误。它的工作原理应该与从哪里加载的地方无关。如果您可以在问题中打开票据以便修复问题,那将是非常好的。 –

+0

在jboss问题跟踪器中创建的错误:https://issues.jboss.org/browse/GUVNOR-1904 –

0

您可以在工作记忆中添加一些条件的存在。 喜欢的东西:

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

和禁用Java代码的规则:

ksession.insert(new RuleADisabled()); 
+0

谢谢,但这意味着对于每个新规则,我必须创建一个新的事实RuleNameDisabled。 每次我执行我的规则时,我首先必须插入禁用的规则事实。 –

+0

您可能只创建一种类型的事实,例如使用属性ruleName或多个规则的RuleDisabled可能取决于相同的事实,例如不是(RuleDisabled(group ==“groupX”)) –