我遇到以下规则的问题:
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
,就好像它在工作内存中不存在(它实际存在,而另一条规则将eventoGenerico
设置为traductor
先前):
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)
但是,如果我做了这个小改动就可以正常工作(这证明了eventoGenerico确实存在于工作内存中):
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
它看起来像一个错误,任何想法?
提前致谢
答案 0 :(得分:1)
你可以收回(traductor),但不能收回eventoGenerico。
问题是eventoGenerico是你的“traductor”事实的属性。你不能收回它,因为你没有在工作记忆中引用这个事实。
您确实插入了一个EventoGenerico对象作为一个单独的事实,但它仅在您引用它的第二个(工作)示例中,因此能够撤消它。
答案 1 :(得分:1)
这似乎是由于使用mvel方言导致的Drools 5.5中的错误。我设法使用这个简单的测试重现您的错误:
爪哇:
Model model = new Model("Model A");
DataSample data = new DataSample(model);
ksession.insert(model);
ksession.insert(data);
ksession.fireAllRules();
Drools的:
rule "Rule 1"
dialect "mvel"
when
$d: DataSample()
$m: Model() from $d.model
then
$d.setModel(null);
update($d);
retract($m);
end
如果删除 dialect“mvel”修饰符,则规则将按预期工作。最近在Drools的邮件列表中有一些关于mvel的错误报告。也许这就是其中之一。
最诚挚的问候,