9

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

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

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

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

没有别的策略吗?

4

2 回答 2

7

有几种方法可以解决这个问题,具体取决于您的要求和架构。

  • 一种方法是在不同的 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

于 2012-06-01T16:13:09.657 回答
1

您可以为工作记忆中某些事实的存在添加条件。就像是:

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

并禁用java代码中的规则:

ksession.insert( new RuleADisabled() );
于 2012-05-31T22:48:39.067 回答