Java Drools 7.2:构建规则引擎(监控模式和高性能)

Java Drools 7.2:构建规则引擎(监控模式和高性能),java,drools,rule-engine,kie,Java,Drools,Rule Engine,Kie,我正在构建一个规则引擎,它在匹配第一条规则后退出。规则的排序是使用显著性、锁定活动(防止重新匹配)和激活组来完成的,一旦输入匹配第一条规则,激活组就会退出 业务现在对监控模式有了新的要求,其中引擎必须继续将输入与不处于监控模式的规则相匹配 例如: Object(attr1 = 1, attr2 = 2) monitor Rule 1: if (attr1 = 1) non-monitor Rule 2: if(attr = 1 and attr2= 2) non-monitor Ru

我正在构建一个规则引擎,它在匹配第一条规则后退出。规则的排序是使用显著性、锁定活动(防止重新匹配)和激活组来完成的,一旦输入匹配第一条规则,激活组就会退出

业务现在对监控模式有了新的要求,其中引擎必须继续将输入与不处于监控模式的规则相匹配

例如:

Object(attr1 = 1, attr2 = 2)

monitor     Rule 1: if (attr1 = 1) 
non-monitor Rule 2: if(attr = 1 and attr2= 2)
non-monitor Rule 3: ..
在这里,它应该同时匹配规则1和规则2,但必须(为了更高的性能)在匹配规则2后立即退出,因为它处于非监视模式。监控模式规则只是用来查看它们是否得到评估,我们是否出于业务目的在后端触发事件

我目前正在使用PackageDescBuilder、RuleDescrBuilder等从数据库动态加载规则。一个简单的会话用于在谓词中作为RHS的一部分计算和存储结果

    KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());
    StatelessKieSession kieSession = kContainer.newStatelessKieSession();
    kieSession.execute(predicate);
问:如何建立新规则?为此,我应该探讨哪些概念

我在这里指的是这份文件:

谢谢

如果在规则触发之前需要触发任意数量的“监视器”规则,并且在第一个“非监视器”规则触发后应停止触发,最简单的方法是在第一个“非监视器”规则触发后,在会话上调用
fireUntilHalt
并调用
halt()

在每个“非监视器”规则的末尾放置一个
halt()
,或者使用一个侦听器。

如果在规则触发之前需要触发任意数量的“监视器”规则,那么在第一个“非监视器”规则之后应该停止触发,最简单的方法是在第一个“非监视器”规则之后的会话上调用
fireunthlat
并调用
halt()
“非监视器”已启动


在每个“非监视器”的末尾放置一个
halt()
“规则或使用侦听器。

如果我正确理解了问题,另一个解决方案可能是在两个不同的议程组中分离监视器和非监视器规则。受监控的规则将不具有任何
激活组
属性,而未受监控的规则将共享相同的
激活组
(就像您今天拥有的一样)

然后,在执行规则时,请确保设置了议程组的正确顺序,以便受监控的规则将在未受监控的规则之前触发

在这种方法中,您还可以使用劳提到的
fireUntilHalt()
halt()
方法。我认为这种方法存在以下问题:

  • 如果不使用
    议程组
    ,则需要确保所有受监控的规则比未受监控的规则具有更高的显著性
  • 您需要在
    halt()
    中添加一个具有尽可能低的显著性的规则,以便在您的非监控规则上没有任何匹配项的情况下使用

希望有帮助,

如果我正确理解了这个问题,另一个解决方案可能是在两个不同的议程组中分离监控和非监控规则。受监控的规则将不具有任何
激活组
属性,而未受监控的规则将共享相同的
激活组
(就像您今天拥有的一样)

然后,在执行规则时,请确保设置了议程组的正确顺序,以便受监控的规则将在未受监控的规则之前触发

在这种方法中,您还可以使用劳提到的
fireUntilHalt()
halt()
方法。我认为这种方法存在以下问题:

  • 如果不使用
    议程组
    ,则需要确保所有受监控的规则比未受监控的规则具有更高的显著性
  • 您需要在
    halt()
    中添加一个具有尽可能低的显著性的规则,以便在您的非监控规则上没有任何匹配项的情况下使用

希望有帮助,

在第一条规则被触发后调用
fireAllRules(1)
停止会更简单。在第一条规则被触发后调用
fireAllRules(1)
停止会更简单。这应该会起作用。。我很抱歉,我会检查一下。但是,我必须从无状态切换到有状态会话。再次感谢。问:我们能在这里实现并行性吗?kContainer.newKieSession()是处理多个请求的唯一方法,还是通过使用kContainer.newStatelessKieSession(kieseconfiguration)创建一个kieSession来重复使用同一个会话;这应该行得通。。我很抱歉,我会检查一下。但是,我必须从无状态切换到有状态会话。再次感谢。问:我们能在这里实现并行性吗?kContainer.newKieSession()是处理多个请求的唯一方法,还是通过使用kContainer.newStatelessKieSession(kieseconfiguration)创建一个kieSession来重复使用同一个会话;监控规则和非监控规则的顺序可以混合,因此它们不能在不同的议程组中。尽管如此,您提到的最后一个默认规则无论如何都需要暂停是正确的。谢谢监控规则和非监控规则的顺序可以混合,因此它们不能在不同的议程组中。尽管如此,您提到的最后一个默认规则无论如何都需要暂停是正确的。谢谢