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
Show replies by date