Hi Rules Users,
I'm experiencing an issue with a Drools 4.0.7 rule.
Here is a clip of the exception that is thrown:
Caused by: org.mvel.CompileException: cannot invoke method
at
org.mvel.optimizers.impl.refl.MethodAccessor.getValue(MethodAccessor.java:54)
at
org.mvel.optimizers.impl.refl.VariableAccessor.getValue(VariableAccessor.java:39)
at
org.mvel.ast.VariableDeepPropertyNode.getReducedValueAccelerated(VariableDeepPropertyNode.java:22)
at
org.mvel.ast.PropertyASTNode.getReducedValueAccelerated(PropertyASTNode.java:21)
at org.mvel.MVELRuntime.execute(MVELRuntime.java:90)
at
org.mvel.CompiledExpression.getValue(CompiledExpression.java:111)
at org.mvel.MVEL.executeExpression(MVEL.java:235)
at
org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:48)
at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:554)
... 80 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor412.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.mvel.optimizers.impl.refl.MethodAccessor.getValue(MethodAccessor.java:46)
... 88 more
Caused by: org.drools.RuntimeDroolsException:
java.lang.ClassCastException: com.demo.Rule_My_Rule_0$Accumulate0
at org.drools.rule.Accumulate.accumulate(Accumulate.java:131)
at
org.drools.reteoo.AccumulateNode.modifyTuple(AccumulateNode.java:352)
at
org.drools.reteoo.AccumulateNode.assertObject(AccumulateNode.java:248)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:318)
at
org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:162)
at org.drools.reteoo.Rete.assertObject(Rete.java:175)
at
org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)
at
org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:71)
at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:911)
at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:883)
at
org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:67)
at
org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:61)
... 92 more
Caused by: java.lang.ClassCastException:
com.demo.Rule_My_Rule_0$Accumulate0
at
com.demo.Rule_My_Rule_0Accumulate0Invoker.accumulate(Rule_My_Rule_0Accumulate0Invoker.java:43)
at org.drools.rule.Accumulate.accumulate(Accumulate.java:123)
... 103 more
The actually rule name and package are a lot longer, I changed them here
for brevity and because I don't believe the names themselves are relevant.
This exception is being thrown intermittently when this rule, which
contains an accumulate function is called. I say intermittently because
it does not happen every time the rule is run. As far as I can tell the
ClassCastExceptions only happens when the computer that the rules are
running on is under load.
A few more details before I post the rule itself. The rule base that I am
building consists of 2 drl files. Both of the files have the same package
declaration at the top. The 2 packages are built separately using
PackageBuilder then combined using RuleBase.addPackage() on both packages.
Also, I'm not sure if this is relevant, but this scenario takes place in
a web application where the two package objects are only built once (for
performance) but each user session creates a new RuleBase and adds the
packages. The individual sessions then create stateful sessions from the
rule base.
This is the rule that I believe is causing the issue.
rule "My Rule"
salience 50
dialect "java"
no-loop true
when
$module : Module( selected == false, required > 1, $size :
required )
$list : ArrayList( )
from accumulate( PotentialMatch( module == $module, $slot
: slot ),
init( List result = new ArrayList(); ),
action( result.add($slot); ),
reverse( result.remove((Integer)$slot ); ),
result( result ) )
eval( countThem($list, $size) != $module.setMatchCount() )
then
modify( $module ) { setMatchCount(countThem($list, $size)) };
end
As I'm typing this I realize that there is another way to write this rule
using collect. I'm not sure why it was written this way, but since I have
already come this far, has anyone had any experience with the Drools 4
generated code throwing ClassCastExceptions?
Thanks,
Steve Ronderos