[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