0

我对以下规则有疑问:

rule "Término sin Traducción"
    salience -100
    dialect "mvel"
    when
        traductor : TraductorDeEventosTratados()
            eventoGenerico : EventoGenerico() from traductor.eventoGenerico
    then
        System.out.println("Evento generico: " + eventoGenerico);
            traductor.setEventoGenerico( null );
            update( traductor );
            retract( eventoGenerico );
end

当收回“eventoGenerico”时,它会导致一个NullPointerException,就好像它不存在于工作内存中(它实际上存在,并且另一个规则将它设置eventoGenericotraductor之前):

Exception executing consequence for rule "Término sin Traducción" in RULA_PROV.SYSTEM_RULES: [Error: drools.retract( eventoGenerico ): null]
[Near : {... System.out.println("Evento gen ....}]
             ^
[Line: 1, Column: 1]
        at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297)

但是,如果我进行这个小改动,它就可以正常工作(这验证了 eventtoGenerico 确实存在于工作内存中):

rule "Término sin Traducción"
    salience -100
    dialect "mvel"
    when
        traductor : TraductorDeEventosTratados()
            eventoGenerico : EventoGenerico()
            eventoGenerico2 : EventoGenerico( this == eventoGenerico ) from traductor.eventoGenerico
    then
        System.out.println("Evento generico: " + eventoGenerico);
            traductor.setEventoGenerico( null );
            update( traductor );
            retract( eventoGenerico );
end

它看起来像一个错误,有什么想法吗?

提前致谢

4

2 回答 2

1

你可以收回(traductor),但不能收回Generico。

问题是 eventtoGenerico 是您的“traductor”事实的属性。你不能收回它,因为你没有在工作记忆中引用这个事实。

您确实插入了一个 EventoGenerico 对象作为一个单独的事实,但它只是在您引用它的第二个(工作)示例中,因此能够收回它。

于 2013-01-21T13:28:38.573 回答
1

这似乎是 Drools 5.5 中由使用 mvel 方言引起的错误。我设法使用这个简单的测试重现了您的错误:

爪哇:

Model model = new Model("Model A");
DataSample data = new DataSample(model);
ksession.insert(model);
ksession.insert(data);

ksession.fireAllRules();

流口水:

rule "Rule 1"
dialect "mvel"
when
    $d: DataSample()
    $m: Model() from $d.model
then
    $d.setModel(null);
    update($d);
    retract($m);
end

如果您删除方言“mvel”修饰符,该规则将按预期工作。最近在 Drools 的邮件列表中有一些关于 mvel 的错误报告。也许这就是其中之一。

最好的祝福,

于 2013-01-23T10:04:18.753 回答