我开始一个项目whith Drools和Drools Guvnor。Drools在运行时禁用规则
我的规则部署在drools guvnor。我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则,当您执行包发布构建和发布时。
这一切工作正常,我正在寻找的是在运行时禁用规则的解决方案。
我现在唯一的解决方案是去guvnor,存档规则并做一个包含该规则的包的build +版本。
难道还有另一种策略吗?
我开始一个项目whith Drools和Drools Guvnor。Drools在运行时禁用规则
我的规则部署在drools guvnor。我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则,当您执行包发布构建和发布时。
这一切工作正常,我正在寻找的是在运行时禁用规则的解决方案。
我现在唯一的解决方案是去guvnor,存档规则并做一个包含该规则的包的build +版本。
难道还有另一种策略吗?
有解决这个,这取决于你的需求和架构的几种方法。
一种方式是定义在不同的Guvnor包你的规则每个子集。在构建您的kbase时,您只能加载包含特定kbase所需规则的包。
另一种方式是总是加载所有规则,但使用“启用”表达式动态启用/禁用规则。请注意,这种情况下的规则仍在评估中,但可以阻止它们的激活。对于想要根据插入到会话中的事实启用/禁用规则的情况,这是一种有用的技巧。例如:
规则X 启用() 然后 ...
上面的布尔表达式有从规则的条件访问变量绑定,以及规则属性,注释和明明可以如果您想定义激活DRL文件外部规则的条件,也可以访问helper类中的静态方法。
第三种方式这样做是通过使用议程过滤器。在这种情况下,您将加载所有规则,使用事实创建会话,并在执行规则时使用议程过滤器。议程过滤器是您可以自行实施的界面,也可以使用Drools附带的一些过滤器。在触发每个规则之前调用过滤器,然后可以否决或允许引擎执行规则。请注意,在这种情况下,所有规则都会被评估和激活,但只有过滤器允许触发的规则才会被触发。例如,如果只想触发具有以“X”开头的名称的规则,则可以使用以下代码行:
ksession。fireAllRules(new RuleNameStartsWithAgendaFilter(“x”));
欲了解更多信息,这里是接口:
这里是文件(向下滚动主题3.3.3.4.1):
http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_single/index.html#d0e2792
您可以在工作记忆中添加一些条件的存在。 喜欢的东西:
rule "RuleA"
when
not(RuleADisabled())
....
then
....
end
和禁用Java代码的规则:
ksession.insert(new RuleADisabled());
谢谢,但这意味着对于每个新规则,我必须创建一个新的事实RuleNameDisabled。 每次我执行我的规则时,我首先必须插入禁用的规则事实。 –
您可能只创建一种类型的事实,例如使用属性ruleName或多个规则的RuleDisabled可能取决于相同的事实,例如不是(RuleDisabled(group ==“groupX”)) –
谢谢,实际上我尝试了第二种方式,就像在 上解释的那样: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) –
这是一个错误。它的工作原理应该与从哪里加载的地方无关。如果您可以在问题中打开票据以便修复问题,那将是非常好的。 –
在jboss问题跟踪器中创建的错误:https://issues.jboss.org/browse/GUVNOR-1904 –