I have a class DroolsRuleLocator that fetches rules from the database, compiles and hands me back the RuleBase. At this time I have just one rule file with a bunch of rules in them. I do not experience any issues when I execute that in a single thread.
But when I load test my application and the client is passing in the request that requires *lookup and compilation of the same rule source in my server concurrently but on different threads,* it appears that my application is dead locked trying to compile the rules. Relevant Rule compilation code: RuleBase ruleBase = RuleBaseFactory.newRuleBase(); try { // Rule is a simple java bean containing the rule text. for (Rule rule : rules) { // ruleDefinition will contain the contents of the drl source. String ruleDefinition = rule.getRuleText(); PackageBuilder builder = new PackageBuilder(); // Parse and compile in one step builder.addPackageFromDrl(new StringReader(ruleDefinition)); if (builder.hasErrors()) { throw new RuntimeException("Unable to compile rule definition: "+ rule.getName()); } // Get the compiled package (which is serializable) Package pkg = builder.getPackage(); // Add the package to the created rulebase (deploy the rule package). ruleBase.addPackage(pkg); } } Remote attaching to the tomcat server and suspending the hanging threads shows the following trace. Daemon Thread [http-8080-58] (Suspended) owns: PhaseInterceptorChain (id=315) waiting for: StandardClassLoader (id=244) owned by: Daemon Thread [http-8080-62] (Running) StandardClassLoader(ClassLoader).loadClass(String, boolean) line: not available StandardClassLoader(ClassLoader).loadClass(String) line: not available WebappClassLoader.loadClass(String, boolean) line: 1349 WebappClassLoader.loadClass(String) line: 1208 ParserContext.checkForDynamicImport(String) line: 121 ParserContext.hasImport(String) line: 155 ExpressionCompiler(AbstractParser).createPropertyToken(int, int) line: 893 ExpressionCompiler(AbstractParser).nextToken() line: 836 ExpressionCompiler._compile() line: 80 ExpressionCompiler.compile(ParserContext) line: 44 MVELExprAnalyzer.analyzeExpression(RuleBuildContext, String, Set[], Map) line: 85 MVELDialect.analyzeExpression(RuleBuildContext, BaseDescr, Object, Map) line: 320 MVELDialect.analyzeExpression(RuleBuildContext, BaseDescr, Object) line: 308 MVELFromBuilder.build(RuleBuildContext, BaseDescr, Pattern) line: 71 MVELFromBuilder.build(RuleBuildContext, BaseDescr) line: 50 PatternBuilder.build(RuleBuildContext, BaseDescr, Pattern) line: 172 PatternBuilder.build(RuleBuildContext, BaseDescr) line: 87 GroupElementBuilder.build(RuleBuildContext, BaseDescr, Pattern) line: 69 RuleBuilder.build(RuleBuildContext) line: 53 PackageBuilder.addRule(RuleDescr) line: 446 PackageBuilder.addPackage(PackageDescr) line: 304 PackageBuilder.addPackageFromDrl(Reader) line: 167 DroolsRuleLocator.findRuleBase(long, String) line: 122 Can someone clarify if this dead lock scenario is a possibility. Currently I am sychronizing on the method that compiles and returns the RuleBase to avoid this situation. Thanks. - Krishna
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users