[jboss-jira] [JBoss JIRA] (DROOLS-528) MVEL naked method calls are not enabled when using pre-compiled knowledge packages
Ravi Sanwal (JIRA)
issues at jboss.org
Tue Jun 17 19:33:24 EDT 2014
[ https://issues.jboss.org/browse/DROOLS-528?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ravi Sanwal updated DROOLS-528:
-------------------------------
Description:
We have a huge set of rules that we want to pre-compile. For this we create knowledge packages with rule text and serialize it to a binary file. This happens initially when rules are authored.
Later on for runtime use this binary file is used to re-create knowledge packages.
Some of our rules have expressions like Number(intValue > 4), this doesn't work with the loaded knowledge packages and fails with error like
{code}
[Error: could not access: intValue; in class: java.lang.Long]
[Near : {... intValue > 1 ....}]
^
[Line: 1, Column: 1]
{code}
With a stacktrace as below:
{code}
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:683)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanPropertyAO(ReflectiveAccessorOptimizer.java:465)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:370)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:140)
at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:114)
at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42)
at org.mvel2.MVEL.executeExpression(MVEL.java:930)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:67)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:52)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:217)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:174)
at org.drools.core.phreak.PhreakAccumulateNode.evaluateResultConstraints(PhreakAccumulateNode.java:700)
at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:89)
at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:562)
at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:533)
at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:334)
at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:200)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:67)
at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:935)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1200)
at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:957)
at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:931)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:256)
at org.drools.core.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:402)
{code}
Further investigation reveals that the mvel compiler property org.mvel2.MVEL.COMPILER_OPT_ALLOW_NAKED_METH_CALL (mvel2.compiler.allow_naked_meth_calls) is not enabled, which is enabled otherwise if the knowledge base is created straight from DRL.
We need this pre-compilation of knowledge packages to reduce startup times which is significant (of the order of 20 seconds for 3k rules, vs. 4 seconds for precompiled knowledge packages)
As a workaround we manually set the org.mvel2.MVEL.COMPILER_OPT_ALLOW_NAKED_METH_CALL property to true.
was:
We have a huge set of rules that we want to pre-compile. For this we create a knowledge packages with rule text and serialize it to a binary file. This happens initially when rules are authored.
Later on for runtime use this binary file is used to re-create knowledge packages.
Some of our rules have expressions like Number(intValue > 4), this doesn't work with the loaded knowledge packages and fails with error like
{code}
[Error: could not access: intValue; in class: java.lang.Long]
[Near : {... intValue > 1 ....}]
^
[Line: 1, Column: 1]
{code}
With a stacktrace as below:
{code}
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:683)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanPropertyAO(ReflectiveAccessorOptimizer.java:465)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:370)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:140)
at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:114)
at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42)
at org.mvel2.MVEL.executeExpression(MVEL.java:930)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:67)
at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:52)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:217)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:174)
at org.drools.core.phreak.PhreakAccumulateNode.evaluateResultConstraints(PhreakAccumulateNode.java:700)
at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:89)
at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:562)
at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:533)
at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:334)
at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:200)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:67)
at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:935)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1200)
at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:957)
at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:931)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:256)
at org.drools.core.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:402)
{code}
Further investigation reveals that the mvel compiler property org.mvel2.MVEL.COMPILER_OPT_ALLOW_NAKED_METH_CALL (mvel2.compiler.allow_naked_meth_calls) is not enabled, which is enabled otherwise if the knowledge base is created straight from DRL.
We need this pre-compilation of knowledge packages to reduce startup times which is significant (of the order of 20 seconds for 3k rules, vs. 4 seconds for precompiled knowledge packages)
As a workaround we manually set the org.mvel2.MVEL.COMPILER_OPT_ALLOW_NAKED_METH_CALL property to true.
> MVEL naked method calls are not enabled when using pre-compiled knowledge packages
> ----------------------------------------------------------------------------------
>
> Key: DROOLS-528
> URL: https://issues.jboss.org/browse/DROOLS-528
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Affects Versions: 5.6.0.Final, 6.0.1.Final, 6.1.0.CR1
> Reporter: Ravi Sanwal
> Assignee: Mark Proctor
>
> We have a huge set of rules that we want to pre-compile. For this we create knowledge packages with rule text and serialize it to a binary file. This happens initially when rules are authored.
> Later on for runtime use this binary file is used to re-create knowledge packages.
> Some of our rules have expressions like Number(intValue > 4), this doesn't work with the loaded knowledge packages and fails with error like
> {code}
> [Error: could not access: intValue; in class: java.lang.Long]
> [Near : {... intValue > 1 ....}]
> ^
> [Line: 1, Column: 1]
> {code}
> With a stacktrace as below:
> {code}
> at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:683)
> at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanPropertyAO(ReflectiveAccessorOptimizer.java:465)
> at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:370)
> at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:140)
> at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
> at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
> at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:114)
> at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42)
> at org.mvel2.MVEL.executeExpression(MVEL.java:930)
> at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:67)
> at org.drools.core.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:52)
> at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:217)
> at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:174)
> at org.drools.core.phreak.PhreakAccumulateNode.evaluateResultConstraints(PhreakAccumulateNode.java:700)
> at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:89)
> at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:562)
> at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:533)
> at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:334)
> at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
> at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
> at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:200)
> at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:67)
> at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:935)
> at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1200)
> at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:957)
> at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:931)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:256)
> at org.drools.core.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:402)
> {code}
> Further investigation reveals that the mvel compiler property org.mvel2.MVEL.COMPILER_OPT_ALLOW_NAKED_METH_CALL (mvel2.compiler.allow_naked_meth_calls) is not enabled, which is enabled otherwise if the knowledge base is created straight from DRL.
> We need this pre-compilation of knowledge packages to reduce startup times which is significant (of the order of 20 seconds for 3k rules, vs. 4 seconds for precompiled knowledge packages)
> As a workaround we manually set the org.mvel2.MVEL.COMPILER_OPT_ALLOW_NAKED_METH_CALL property to true.
--
This message was sent by Atlassian JIRA
(v6.2.6#6264)
More information about the jboss-jira
mailing list