[
http://jira.jboss.com/jira/browse/JBRULES-1392?page=comments#action_12399669 ]
Navaljit Bhasin commented on JBRULES-1392:
------------------------------------------
Hi Edson,
I am able to compile and create the jar files.
But it seems there is some issue with drools on linux platform.
I replaced the following jar files in my project with the corresponding snapshot jar
files.
10,293 drools-ant-4.0.3.jar
10,557 drools-ant-4.0.3.SNAPSHOT.jar
553,326 drools-compiler-4.0.3.jar
563,621 drools-compiler-4.0.3.SNAPSHOT.jar
1,066,794 drools-core-4.0.3.jar
1,083,609 drools-core-4.0.3.SNAPSHOT.jar
78,186 drools-decisiontables-4.0.3.jar
78,327 drools-decisiontables-4.0.3.SNAPSHOT.jar
23,496 drools-jsr94-4.0.3.jar
23,581 drools-jsr94-4.0.3.SNAPSHOT.jar
I removed above mentioned 4.0.3 from project ear file. ie the ear file has only
SNAPSHOT.jar versions.
The drl file compiles ok on local windows desktop. However on linux server ( where I am
testing multithreading), I am getting following compilation error. This exception is not
thrown if I rollback to 4.0.3 jar files. [But 4.0.3 had the multithreading issue ]
org.mvel.CompileException: Failed to compile:
[Error: can not resolve identifier: name]
[Near: { ... nam ... } ]
at
org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:193)
at org.mvel.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:58)
at org.mvel.TemplateInterpreter.execute(TemplateInterpreter.java:410)
at org.mvel.TemplateInterpreter.execute(TemplateInterpreter.java:345)
at org.mvel.TemplateInterpreter.eval(TemplateInterpreter.java:109)
at org.mvel.TemplateInterpreter.evalToString(TemplateInterpreter.java:74)
at
org.drools.rule.builder.dialect.java.JavaFunctionBuilder.build(JavaFunctionBuilder.java:96)
at org.drools.rule.builder.dialect.java.JavaDialect.addFunction(JavaDialect.java:436)
at org.drools.compiler.PackageBuilder.addFunction(PackageBuilder.java:406)
at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:289)
at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:167)
Any clues ?
Let me know if you have checked in a fix for this. I will recompile and retest.
Thanks a lot !
Rules behave incorrectly (randomly) in multi-threaded environment
-----------------------------------------------------------------
Key: JBRULES-1392
URL:
http://jira.jboss.com/jira/browse/JBRULES-1392
Project: JBoss Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: Reteoo
Affects Versions: 4.0.3
Reporter: Brian Stiles
Assigned To: Edson Tirelli
Priority: Blocker
Fix For: 5.0.0-M1, 4.0.5
Attachments: DroolsMVELFactoryProject.zip
Rules behave seemingly indeterminately when sessions are created from the same RuleBase
and executed in multiple threads. The problem is a bit difficult to reproduce. The
following code demonstrates the behavior in my environment (single processor PowerBook),
but not on every try. I've had up to 5 consecutive executions not exhibit the problem
before the failure was exhibited, so you may need to run the class a number of times to
see the problem. Also, I periodically get OutOfMemoryErrors when using the default heap
size (64m). I've had better success with -Xmx256m. That, by the way, is suspiciously
coincidental to the random nature of the incorrect rule firing problem.
I've experienced this behavior in my application, and it manifests by rules firing
from time to time that shouldn't have fired. I can't see a pattern to the rules
that fire inappropriately, and there absolutely were not facts asserted that would support
the firing of the rule.
Synchronizing the calls to insert, fireAllRules, and dispose on the session object seems
to get rid of the problem, giving further evidence to the guess that it's a
multithreading bug.
Please, please, please find a solution to this problem. This will be a serious
scalability problem for my application. I'm more than happy to help however I can.
I've stepped through Drools code before and found solutions, but I really don't
know where to go with this one.
Following is the code (self-contained class with main method) that I've used to
demonstrate the problem.
Thank you!
--
package sample;
import java.io.StringReader;
import java.util.ArrayList;
import org.drools.RuleBase;
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.compiler.PackageBuilder;
import org.drools.compiler.PackageBuilderConfiguration;
public class MultithreadedRuleBaseProblem {
public static void main(String[] args) throws Exception {
final PackageBuilderConfiguration packageBuilderConfiguration =
new PackageBuilderConfiguration();
final PackageBuilder packageBuilder = new
PackageBuilder(packageBuilderConfiguration);
packageBuilder.addPackageFromDrl(new StringReader("\n"
+ "package sample\n"
+ "\n"
+ "import java.lang.Integer;\n"
+ "global java.util.ArrayList shouldFireList;\n"
+ "global java.util.ArrayList shouldNotFireList;\n"
+ "\n"
+ "rule should_fire\n"
+ " when\n"
+ " $e : Integer(intValue == -1)\n"
+ " $f : Integer(intValue > $e)\n"
+ " then \n"
+ " shouldFireList.add($f);\n"
+ "end \n"
+ "\n"
+ "rule should_not_fire\n"
+ " when\n"
+ " $f : String()\n"
+ " then \n"
+ " shouldNotFireList.add($f);\n"
+ "end \n"));
final RuleBaseConfiguration ruleBaseConfiguration = new RuleBaseConfiguration();
final RuleBase ruleBase = RuleBaseFactory.newRuleBase(ruleBaseConfiguration);
ruleBase.addPackage(packageBuilder.getPackage());
final Exception[] exception = {
null
};
final Thread t[] = new Thread[50];
for (int i = 0; i < t.length; i++) {
final int count = i;
t[i] = new Thread(new Runnable() {
public void run() {
try {
System.out.println("Start " + count);
final int iterations = count * 15 + 3000;
final ArrayList shouldFireList = new ArrayList();
final ArrayList shouldNotFireList = new ArrayList();
final StatefulSession session2 = ruleBase.newStatefulSession();
session2.setGlobal("shouldFireList", shouldFireList);
session2.setGlobal("shouldNotFireList",
shouldNotFireList);
session2.insert(new Integer(- 1));
for (int k = 0; k < iterations; k++) {
session2.insert(new Integer(k));
}
session2.insert("foo");
System.out.println("Fire " + count);
session2.fireAllRules();
session2.dispose();
if (shouldFireList.size() != iterations) {
System.out.println("Thread "
+ count
+ " shouldFireList.size(): expected "
+ iterations
+ " was "
+ shouldFireList.size()
+ "\n!!!!! Thread "
+ count
+ " rule didn't fire as many times as it
should have!!!!!!!!!!!!!!!!!!");
}
} catch (Exception e) {
e.printStackTrace();
exception[0] = e;
}
System.out.println("Thread " + count + " done");
}
});
t[i].start();
}
for (int i = 0; i < t.length; i++) {
t[i].join();
}
System.out.println("done");
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira