在drools drl中初始化变量失败

时间:2015-01-16 14:51:40

标签: variables drools

我正在尝试在规则中使用变量初始化。 虽然以下简化的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”被调用。这会导致变量无法设置。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

只要插入了一个事实,引擎就可以自由地评估这个事实所涉及的条件元素和约束。在此过程中评估的方法引起的副作用以某种随机顺序出现,除了引擎的奇想之外什么都没有控制。即使在通过调用fireAllRules或类似函数完全释放Engine之前,也会发生这种情况。只有这样才会发生右侧执行,其顺序可能会受到诸如显着性等规则属性的影响。

设置全局变量应该由启动Drools机器的应用程序完成。