MVELSalienceExpression not thread-safe
--------------------------------------
Key: JBRULES-1991
URL:
https://jira.jboss.org/jira/browse/JBRULES-1991
Project: JBoss Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core
Affects Versions: 4.0.7
Reporter: Ingomar Otter
Assignee: Mark Proctor
Fix For: 4.0.8, 5.0.0.CR1
Scenario:
* We are using Drools in a MT app with a shared rulebase and one WM per thread.
* We are using MVEL expressions to dynamically calculate salience from matched facts.
When runniing mutlithreaded, we could observe that expression would sometimes (1 in 500
times in our case) pick up the wrong salience value.
Looking at the source of MVELSalienceExpression.getValue() reveals that the method sets
the WM and then evaluates the MVEL expression.
I assume that the MVELSalienceExpression is part of the rulebase and thus shared accross
WMs. If this is true this is not thread-safe and may lead to the observed behaviour.
Adding a simple synchronized fixes the problem in our case:
{code}
public synchronized int getValue(final Tuple tuple, final WorkingMemory workingMemory) {
this.factory.setContext(tuple, null, null, workingMemory, null);
return ((Number) MVEL.executeExpression(this.expr, this.factory)).intValue();
}
{code}
However this may reduce overall concurrency in the application. A better solution might be
to increase locality, ie having a "thread local" factory.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira