Drools在运行时禁用规则

Fre*_*ose 8 rule-engine drools

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

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

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

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

是不是有另一种策略?

Eds*_*lli 6

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

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