为什么 Drools 规则引擎只运行一次条件为空的规则?

问题描述 投票:0回答:1

我设置了一个非常基本的 drools 规则引擎,仅插入了规则:

rule "Hello World"
    when
        
    then
        System.out.println("Hello World!");
end

我正在 Java 线程运行循环中运行该应用程序。循环的每次迭代我都会触发所有规则(使用有状态的 Kie 会话)。循环的第一次迭代产生“Hello World!”报表打印成功。但是,此后该规则不会再次触发。

这是运行函数:

@Override
public void run() {   
   // Fire the rules
   System.out.println("Firing rules");
   kSession.fireAllRules();           
}

这是我初始化 Kie 会话的方法:

KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kBase1 = kContainer.getKieBase("KBase1");         
kSession = kBase1.newKieSession();

这是为什么呢?我猜测这与应用程序完成的推断有关,但我在概念上对引擎的了解还不足以了解。

我正在使用 Maven 并具有以下依赖项:

  • drools-engine(版本9.44.0-最终版)
  • drools-xml-support(版本 9.44.0-最终版)
  • drools-mvel(版本 9.44.0-最终版)

我还使用以下插件:

  • kie-maven-plugin(版本9.44.0-最终版)

提前致谢!

java drools rule-engine
1个回答
0
投票

规则由 InitalFactImpl 激活。

InitalFactImpl事实是一个特殊的事实,始终存在于 PHREAK 网络中(但并不总是使用)。每次创建新的 KIE 会话时,都会自动将 InitalFactImpl 插入其中。这将允许评估诸如 not 条件元素之类的模式...

让我们考虑这样一种情况:当我们的会话中没有任何可疑操作时,无论

客户如何,我们都希望执行规则。该规则将写成如下:

rule "Sample Rule 1" when not (SuspiciousOperation()) then channels["audit-channel"].send("OK"); end
对于本例,使用 

InitalFactImpl 是因为我们没有任何可以触发规则的事实。

来源:掌握 JBoss Drools 6

(Mauricio Salatino、Mariano De Maio、Esteban Aliverti )

© www.soinside.com 2019 - 2024. All rights reserved.