Drools在运行时禁用规则

时间:2012-05-31 11:34:43

标签: drools rule-engine

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

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

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

我现在唯一的解决方案是转到guvnor,归档规则并对包含该规则的包进行构建+发布。

是不是还有另一种策略?

2 个答案:

答案 0 :(得分:6)

根据您的要求和架构,有几种方法可以解决这个问题。

  • 一种方法是在不同的guvnor包中定义规则的每个子集。在构建kbase时,您只能加载包含特定于该kbase的规则的包。

  • 另一种方式是始终加载所有规则,但使用“启用”表达式可以动态启用/禁用规则。请注意,仍然会评估此情况下的规则,但可以阻止它们激活。对于要根据插入会话的事实启用/禁用规则的情况,这是一种有用的技术。 E.g:

    规则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

答案 1 :(得分:0)

您可以在工作记忆中添加某些事实的条件。 类似的东西:

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

并禁用java代码中的规则:

ksession.insert( new RuleADisabled() );