我正在尝试在规则中使用变量初始化。 虽然以下简化的drl不起作用,因为“init”规则在“有计算机”规则之后执行。
package org.drools
import example.brms.Dossier;
global example.brms.Session session;
global java.lang.String TCOMPUTER;
rule "init"
salience 10000
when
then
session.set("TCOMPUTER", "440949");
System.out.println("all set!");
end
rule "has computer"
when
$dossier : Dossier( objects.group("T3").type(TCOMPUTER).exists() )
then
session.info("GOT-COMPUTER", $dossier, TCOMPUTER.getClass());
end
session.set(“TCOMPUTER”,“440949”);在内部调用ksession.setGobal(...)。
我插入2个档案事实并触发规则:
log.debug("Inserting " + facts.size() + " facts");
for (Object fact : facts) {
ksession.insert(fact);
}
/** GO! **/
log.debug("ksession.fireAllRules()");
ksession.fireAllRules();
我在控制台中得到了这个:
Starting Engine in PHREAK mode
Inserting 2 facts
Reducing to types null <-- why these to lines before fireAllRules ?
Reducing to types null <-/
ksession.fireAllRules()
Setting ksession global TCOMPUTER to 440949
all set!
Dossier的types()方法(objects.group(“T3”)。 type (TCOMPUTER).exists())打印“Reducing to types null”。
所以似乎规则“有计算机”在ksession.fireAllRules()被调用之前被执行,而规则“init”被调用。这会导致变量无法设置。
为什么会这样?
答案 0 :(得分:1)
只要插入了一个事实,引擎就可以自由地评估这个事实所涉及的条件元素和约束。在此过程中评估的方法引起的副作用以某种随机顺序出现,除了引擎的奇想之外什么都没有控制。即使在通过调用fireAllRules或类似函数完全释放Engine之前,也会发生这种情况。只有这样才会发生右侧执行,其顺序可能会受到诸如显着性等规则属性的影响。
设置全局变量应该由启动Drools机器的应用程序完成。