我正在开始一个 Drools 和 Drools Guvnor 的项目。
我的规则部署在 drools guvnor 中。当您进行软件包发布构建和发布时,我的规则引擎实例可以通过 drools Guvnor 公开的 pkg 文件访问这些规则。
这一切都很好,我正在寻找的是在运行时禁用规则的解决方案。
我现在唯一的解决方案是去 guvnor,归档规则,然后构建 + 发布包含该规则的包。
没有别的策略吗?
我正在开始一个 Drools 和 Drools Guvnor 的项目。
我的规则部署在 drools guvnor 中。当您进行软件包发布构建和发布时,我的规则引擎实例可以通过 drools Guvnor 公开的 pkg 文件访问这些规则。
这一切都很好,我正在寻找的是在运行时禁用规则的解决方案。
我现在唯一的解决方案是去 guvnor,归档规则,然后构建 + 发布包含该规则的包。
没有别的策略吗?
有几种方法可以解决这个问题,具体取决于您的要求和架构。
一种方法是在不同的 guvnor 包中定义规则的每个子集。在构建您的 kbase 时,您可以只加载具有您想要的 kbase 规则的包。
另一种方法是始终加载所有规则,但使用“启用”表达式动态启用/禁用规则。请注意,这种情况下的规则仍在评估中,但可以阻止它们激活。对于您希望根据插入会话的事实启用/禁用规则的情况,这是一种有用的技术。例如:
规则 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
您可以为工作记忆中某些事实的存在添加条件。就像是:
rule "RuleA"
when
not( RuleADisabled() )
....
then
....
end
并禁用java代码中的规则:
ksession.insert( new RuleADisabled() );