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 -