<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Dear All,<br>
<br>
We're using Drools in our project and we've been hitting a sporadic
error when we insert Objects in a stateful session. Unfortunately we
haven't been able to reproduce it in a constant way. We tried quite a
lot of things but we haven't been able to track it to the core, but we
found a way to "avoid" it, but we would love to know why this error is
being triggered.<br>
<br>
>From time to time we get the following stack trace and usually after
this the rulebase gets broken (all the stateful sessions we generate
with it get unusable) and we can't run anything else in it (we have to
restart the app in order to create a new rule base object).<br>
<br>
<font face="Arial" size="2">org.mvel.CompileException: cannot invoke
method<br>
&nbsp;&nbsp;&nbsp; at
org.mvel.optimizers.impl.refl.MethodAccessor.getValue(MethodAccessor.java:68)<br>
&nbsp;&nbsp;&nbsp; at
org.mvel.optimizers.impl.refl.VariableAccessor.getValue(VariableAccessor.java:39)<br>
&nbsp;&nbsp;&nbsp; at
org.mvel.ast.VariableDeepPropertyNode.getReducedValueAccelerated(VariableDeepPropertyNode.java:22)<br>
&nbsp;&nbsp;&nbsp; at
org.mvel.ast.PropertyASTNode.getReducedValueAccelerated(PropertyASTNode.java:21)<br>
&nbsp;&nbsp;&nbsp; at org.mvel.MVELRuntime.execute(MVELRuntime.java:88)<br>
&nbsp;&nbsp;&nbsp; at org.mvel.CompiledExpression.getValue(CompiledExpression.java:111)<br>
&nbsp;&nbsp;&nbsp; at org.mvel.MVEL.executeExpression(MVEL.java:252)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.base.dataproviders.MVELDataProvider.getResults(MVELDataProvider.java:45)<br>
&nbsp;&nbsp;&nbsp; at org.drools.reteoo.FromNode.assertTuple(FromNode.java:64)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.SingleTupleSinkAdapter.createAndPropagateAssertTuple(SingleTupleSinkAdapter.java:55)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:116)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:22)<br>
&nbsp;&nbsp;&nbsp; at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:140)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:318)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:153)<br>
&nbsp;&nbsp;&nbsp; at org.drools.reteoo.Rete.assertObject(Rete.java:175)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:71)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:909)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:881)<br>
&nbsp;&nbsp;&nbsp; at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:682)<br>
&nbsp;&nbsp;&nbsp; at
uk.co.vodco.sherbet.ccp.rules.availability.AvailabilityRulesEngineImpl.addProgramme(AvailabilityRulesEngineImpl.java:27)<br>
[removed a few lines]<br>
Caused by: java.lang.IllegalArgumentException: <a
 href="mailto:java.lang.ClassCastException@1366d44">java.lang.ClassCastException@1366d44</a><br>
&nbsp;&nbsp;&nbsp; at sun.reflect.GeneratedMethodAccessor194.invoke(Unknown Source)<br>
&nbsp;&nbsp;&nbsp; at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br>
&nbsp;&nbsp;&nbsp; at java.lang.reflect.Method.invoke(Method.java:585)<br>
&nbsp;&nbsp;&nbsp; at
org.mvel.optimizers.impl.refl.MethodAccessor.getValue(MethodAccessor.java:64)<br>
&nbsp;&nbsp;&nbsp; ... 69 common frames omitted<br>
<br>
</font>We found that adding a line to a few rules like the following
one removed the error:<br>
<div><span class="359350211-09062008"><font color="#808000" size="2">
<p># given the version, add the programme if it does not exist<br>
<b><font color="#960000" size="2">rule</font></b><font size="2"> </font><font
 color="#008000" size="2">"insertion of programme given a version"<br>
</font><b><font color="#960000" size="2">ruleflow-group</font></b><font
 size="2"> </font><font color="#008000" size="2">"source-defaults"</font><br>
<b><font color="#960000" size="2">&nbsp;&nbsp;&nbsp; when</font></b><br>
<font size="2">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $v: ProgrammeVersion()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $p: Programme() </font><b><font color="#960000" size="2">from</font></b><font
 size="2"> $v.getProgramme()</font><br>
<b><font color="#960000" size="2">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; not</font></b><font size="2">
Programme(</font><b><font color="#960000" size="2">this</font></b><font
 size="2"> == $p)</font><br>
<b><font color="#960000" size="2">&nbsp;&nbsp;&nbsp; then<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; insert</font></b><font size="2"> ($p);</font><br>
<b><font color="#960000" size="2">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; update</font></b><font
 size="2"> ($v); <font color="#ff0000"><b>&lt;-- Added Line</b></font><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; LoggerFactory.getLogger(</font><font color="#008000" size="2">"factinsertion.drl"</font><font
 size="2">).info(</font><font color="#008000" size="2">"Entered:
insertion of programme given version"</font><font size="2">);</font><br>
<b><font color="#960000" size="2">end</font></b></p>
</font><b><font color="#960000" size="2"></font></b><font size="2">
</font><font size="2"></font><font size="2">
</font>
<font size="2">
</font>
<b><font color="#960000" size="2"></font></b></span></div>
<br>
Does anyone have an idea of what can be causing this error? We suppose
it's related to the <b>from</b> clause in the condition. Because we're
taking the object we're inserting in the working memory ($p) from the
object $v, so in the end, for some reason, we also need to update $v.<br>
<br>
<br>
Thanks in advance!<br>
Augusto<br>
</body>
</html>