我正在开始一个Drools和Drools Guvnor的项目。
我的规则部署在drools guvnor中。当您执行包发布构建和发布时,我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则。
这一切都运行正常,我正在寻找的是一种在运行时禁用规则的解决方案。
我现在唯一的解决方案是转到guvnor,归档规则并对包含该规则的包进行构建+发布。
是不是还有另一种策略?
答案 0 :(得分:6)
根据您的要求和架构,有几种方法可以解决这个问题。
一种方法是在不同的guvnor包中定义规则的每个子集。在构建kbase时,您只能加载包含特定于该kbase的规则的包。
另一种方式是始终加载所有规则,但使用“启用”表达式可以动态启用/禁用规则。请注意,仍然会评估此情况下的规则,但可以阻止它们激活。对于要根据插入会话的事实启用/禁用规则的情况,这是一种有用的技术。 E.g:
规则X. 启用() 然后 ...
上面的布尔表达式可以访问规则条件中的变量绑定,以及规则属性,注释,如果要定义激活外部规则的条件,显然也可以访问辅助类中的静态方法到DRL文件。
第三种方式这样做是通过使用议程过滤器。在这种情况下,您加载所有规则,使用事实创建会话,并在执行规则时使用议程筛选器。议程过滤器是您可以自己实现的界面,或者您可以使用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
答案 1 :(得分:0)
您可以在工作记忆中添加某些事实的条件。 类似的东西:
rule "RuleA"
when
not( RuleADisabled() )
....
then
....
end
并禁用java代码中的规则:
ksession.insert( new RuleADisabled() );