Mauricio –
Here’s the session set-up and rules code:
public void processDataWithRules(BeansLoader loader, Object pf, GlobalRulesFunctions gf)
throws ARGenTDataInsertionException, ARGenTRunTimeException, Exception
{
StatefulKnowledgeSession ksession = null;
try
{
if (kbase.getKnowledgePackages().size() == 0)
throw new ARGenTRunTimeException("There are no knowledge packages (Rules) in the rule base.");
ksession = kbase.newStatefulKnowledgeSession();
gf.setRulesSession(ksession);
ksession.setGlobal("functions", gf);
loader.Load(pf, (StatefulKnowledgeSessionImpl) ksession); // see below for code of this load operation
for (final KnowledgePackage kp : kbase.getKnowledgePackages())
for (final Process p : kp.getProcesses())
{
final String id = p.getId();
final Long lId = new Long(id);
if (this.topLevelFlowId == 0 || lId.longValue() == this.topLevelFlowId)
ksession.startProcess(id);
}
ksession.fireAllRules();
}
catch (Throwable t)
{
throw new ARGenTRunTimeException(t);
}
finally
{
gf.setRulesSession(null);
if (ksession != null)
ksession.dispose();
}
}
And here’s the object insertion code (BeansLoader). It is a recursive descent through a hierarchy of XmlBeans objects, inserting the interesting objects and suppressing others.
public void Load(Object toLoad, StatefulKnowledgeSessionImpl wm) throws ARGenTDataInsertionException
{
try
{
Class c = toLoad.getClass();
if (c.isPrimitive() || Suppress(c.getName()))
return;
wm.insert(toLoad); // insert the object into working memory
Method[] methods = c.getMethods();
for (Method mIter : methods)
{
if (mIter.getParameterTypes().length == 0
&& mIter.getName().startsWith("get")
&& !mIter.getName().startsWith("getIsSet")
&& !mIter.getName().endsWith("Bean"))
{
if (!mIter.getReturnType().isPrimitive()
&& !Suppress(mIter.getReturnType().getName()))
{
String testName = "getIsSet" + mIter.getName().substring(3);
Method mTester = null;
Method m = null;
try
{
m = c.getMethod(mIter.getName(),null);
mTester = c.getMethod(testName, null);
}
catch (Throwable t)
{
// ignore -- testing for null next
}
if (mTester != null)
{
Object test = mTester.invoke(toLoad, null);
Boolean b = false;
if (test != null && test.getClass().isInstance(b))
{
b = (Boolean)test;
if (!b)
continue;
}
}
if (m != null)
{
Object o = mIter.invoke(toLoad, null);
if (o != null)
{
Class co = o.getClass();
String className = co.getCanonicalName();
if (className.endsWith("[]")) // an array
{
Object [] os = (Object[])o;
for (Object o1 : os)
{
Load(o1,wm);
}
}
else if (o instanceof ArrayList)
{
ArrayList al = (ArrayList)o;
for (Object o2 : al)
Load(o2,wm);
}
else
{
Load(o,wm);
}
}
}
}
}
}
}
catch(Throwable t)
{
throw new ARGenTDataInsertionException(t);
}
}
Tom Murphy
Business Process Consultant
Wells Fargo HCFG - CORE Deal Decisioning Platform
800 S. Jordan Creek Parkway | West Des Moines, IA 50266
MAC: X2301-01B
Office: 515 324 4853 | Mobile: 515 423 4334
tom.e.murphy@wellsfargo.com
This transmission may contain information that is confidential and/or proprietary. If you are not the individual or entity to which it is addressed, note that any review, disclosure, copying, retransmission, or other use is strictly prohibited. If you received this transmission in error, please notify the sender immediately and delete the material from your system.
From: rules-dev-bounces@lists.jboss.org [mailto:rules-dev-bounces@lists.jboss.org] On Behalf Of Mauricio Salatino
Sent: Tuesday, June 22, 2010 9:09 AM
To: Rules Dev List
Subject: Re: [rules-dev] Exception in runtime
I'm not aware about Web Logic, but you can review what exactly are you doing the insertion. Can you share with us where do you have your ksession (inside a Stateless/Statefull session bean inside weblogic?), how you access that session to insert facts, etc.
Greetings.On Tue, Jun 22, 2010 at 11:03 AM, <Tom.E.Murphy@wellsfargo.com> wrote:
Maurice –
By design of our runtime components, a single stateful session is owned and managed by a single thread. Data is only inserted by that one thread into that session.
Unless maybe the Web Logic app server is doing something odd under the covers…
Tom Murphy
Business Process Consultant
Wells Fargo HCFG - CORE Deal Decisioning Platform
800 S. Jordan Creek Parkway | West Des Moines, IA 50266
MAC: X2301-01B
Office: 515 324 4853 | Mobile: 515 423 4334
tom.e.murphy@wellsfargo.com
This transmission may contain information that is confidential and/or proprietary. If you are not the individual or entity to which it is addressed, note that any review, disclosure, copying, retransmission, or other use is strictly prohibited. If you received this transmission in error, please notify the sender immediately and delete the material from your system.
From: rules-dev-bounces@lists.jboss.org [mailto:rules-dev-bounces@lists.jboss.org] On Behalf Of Mauricio Salatino
Sent: Tuesday, June 22, 2010 8:26 AM
To: Rules Dev List
Subject: Re: [rules-dev] Exception in runtime
Are you inserting facts from different threads in a statefull session?
On Tue, Jun 22, 2010 at 10:21 AM, <Tom.E.Murphy@wellsfargo.com> wrote:
Anybody have any ideas on this?
We are seeing ConcurrentModificationException while inserting objects into working memory. This happens occasionally, either at service start-up, where the first transaction is being submitted and the rules are loading for the first time, or sometimes under heavy loads with lots of transactions being processed by the service:
Drools 5.0.1-GA
AS: Web Logic
JVM: 1.5
Fragment of stack trace:
Caused by: java.util.ConcurrentModificationException
java.util.HashMap$HashIterator.nextEntry(HashMap.java:2117)
java.util.HashMap$ValueIterator.next(HashMap.java:2147)
org.drools.reteoo.EntryPointNode.updateSink(EntryPointNode.java:285)
org.drools.reteoo.ObjectTypeNode.attach(ObjectTypeNode.java:279)
org.drools.reteoo.builder.PatternBuilder.attachObjectTypeNode(PatternBuilder.java:234)
org.drools.reteoo.ClassObjectTypeConf.<init>(ClassObjectTypeConf.java:93)
org.drools.common.ObjectTypeConfigurationRegistry.getObjectTypeConf(ObjectTypeConfigurationRegistry.java:58)
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:849)
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:788)
org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:216)
com.wellsfargo.ARGenT.Execution.DefaultLoader.Load(DefaultLoader.java:16)
Tom Murphy
Business Process Consultant
Wells Fargo HCFG - CORE Deal Decisioning Platform
800 S. Jordan Creek Parkway | West Des Moines, IA 50266
MAC: X2301-01B
Office: 515 324 4853 | Mobile: 515 423 4334
tom.e.murphy@wellsfargo.com
This transmission may contain information that is confidential and/or proprietary. If you are not the individual or entity to which it is addressed, note that any review, disclosure, copying, retransmission, or other use is strictly prohibited. If you received this transmission in error, please notify the sender immediately and delete the material from your system.
_______________________________________________
rules-dev mailing list
rules-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev
--
- CTO @ http://www.plugtree.com
- MyJourney @ http://salaboy.wordpress.com
- Co-Founder @ http://www.jbug.com.ar
- Salatino "Salaboy" Mauricio -
_______________________________________________
rules-dev mailing list
rules-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev
--
- CTO @ http://www.plugtree.com
- MyJourney @ http://salaboy.wordpress.com
- Co-Founder @ http://www.jbug.com.ar
- Salatino "Salaboy" Mauricio -
_______________________________________________
rules-dev mailing list
rules-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev