Drools execution is slow at the first request because of classloading
Issue
- My application is heavily multi-threaded and spawns it's own threads in the web server to process the same request against multiple rule sets. After starting up the application it was observed that the first request takes exceptionally long in order to complete (ie: greater than 2 minutes). All subsequent requests are extremely fast, this only happens the first time. Thread dumps show that many threads are blocked at classloading.
BLOCKer thread
"pool-14-thread-13" #212 prio=5 os_prio=0 tid=0x000000001fcd4800 nid=0x1dfc runnable [0x00000000559ca000]
java.lang.Thread.State: RUNNABLE
at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:865)
at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:803)
at sun.misc.URLClassPath$JarLoader$3.run(URLClassPath.java:1057)
at sun.misc.URLClassPath$JarLoader$3.run(URLClassPath.java:1054)
at java.security.AccessController.doPrivileged(Native Method)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1053)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:1013)
at sun.misc.URLClassPath.getResource(URLClassPath.java:212)
at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.apache.axis2.deployment.DeploymentClassLoader.findClass(DeploymentClassLoader.java:82)
at org.apache.axis2.deployment.DeploymentClassLoader.loadClass(DeploymentClassLoader.java:282)
- locked <0x0000000684517130> (a org.apache.axis2.deployment.DeploymentClassLoader)
...
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
- locked <0x000000068d144ef0> (a org.drools.core.common.ProjectClassLoader)
at org.drools.core.common.ProjectClassLoader.internalLoadClass(ProjectClassLoader.java:162)
at org.drools.core.common.ProjectClassLoader.loadClass(ProjectClassLoader.java:141)
- locked <0x000000068d144ef0> (a org.drools.core.common.ProjectClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:646)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.mvel2.util.ParseTools.findInnerClass(ParseTools.java:2183)
at org.mvel2.util.ParseTools.forNameWithInner(ParseTools.java:2175)
at org.mvel2.ParserConfiguration.checkForDynamicImport(ParserConfiguration.java:168)
at org.mvel2.ParserConfiguration.hasImport(ParserConfiguration.java:187)
at org.mvel2.ParserContext.hasImport(ParserContext.java:373)
at org.mvel2.compiler.AbstractParser.createPropertyToken(AbstractParser.java:1392)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:896)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:111)
at org.mvel2.util.ParseTools.subCompileExpression(ParseTools.java:2059)
at org.mvel2.ast.Substatement.<init>(Substatement.java:38)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:1134)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:111)
at org.mvel2.util.ParseTools.subCompileExpression(ParseTools.java:2059)
at org.mvel2.ast.Negation.<init>(Negation.java:40)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:1242)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:111)
at org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:52)
at org.mvel2.MVEL.compileExpression(MVEL.java:810)
at org.drools.core.base.mvel.MVELCompilationUnit.compile(MVELCompilationUnit.java:451)
at org.drools.core.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:273)
at org.drools.core.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:265)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:249)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:215)
at org.drools.core.reteoo.AlphaNode.modifyObject(AlphaNode.java:146)
...
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1308)
...
One of BLOCKED threads
"pool-14-thread-24" #223 prio=5 os_prio=0 tid=0x000000001fcdd800 nid=0x1898 waiting for monitor entry [0x000000005867d000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.drools.core.common.ProjectClassLoader.loadClass(ProjectClassLoader.java:139)
- waiting to lock <0x000000068d144ef0> (a org.drools.core.common.ProjectClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.drools.core.rule.JavaDialectRuntimeData$PackageClassLoader.loadClass(JavaDialectRuntimeData.java:646)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.mvel2.util.ParseTools.findInnerClass(ParseTools.java:2183)
at org.mvel2.util.ParseTools.forNameWithInner(ParseTools.java:2175)
at org.mvel2.ParserConfiguration.checkForDynamicImport(ParserConfiguration.java:168)
at org.mvel2.ParserConfiguration.hasImport(ParserConfiguration.java:187)
at org.mvel2.ParserContext.hasImport(ParserContext.java:373)
at org.mvel2.compiler.AbstractParser.createPropertyToken(AbstractParser.java:1392)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:896)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:111)
at org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:52)
at org.mvel2.MVEL.compileExpression(MVEL.java:810)
at org.drools.core.base.mvel.MVELCompilationUnit.compile(MVELCompilationUnit.java:451)
at org.drools.core.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:273)
at org.drools.core.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:265)
at org.drools.core.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:249)
at org.drools.core.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:215)
at org.drools.core.phreak.PhreakAccumulateNode.evaluateResultConstraints(PhreakAccumulateNode.java:690)
...
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1308)
...
Environment
- Red Hat JBoss BRMS
- 6.3.0
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase of over 48,000 articles and solutions.
Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.
