[rules-dev] Exception in runtime

Edson Tirelli tirelli at post.com
Tue Jun 22 17:26:27 EDT 2010


   Done.

https://jira.jboss.org/browse/JBRULES-2556

<https://jira.jboss.org/browse/JBRULES-2556>   Let me know if you still see
any problem.

   Edson

2010/6/22 Edson Tirelli <tirelli at post.com>

>
>    Tom,
>
>    Looks like a bug and I have an idea why it is happening. Let me do some
> investigation here and I will get back to you.
>
>    Meanwhile, feel free to open a ticket to track this or I will do it
> myself later.
>
>     Edson
>
> 2010/6/22 <Tom.E.Murphy at wellsfargo.com>
>
>  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 at 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 at lists.jboss.org [mailto:
>> rules-dev-bounces at 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 at 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 at 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 at lists.jboss.org [mailto:
>> rules-dev-bounces at 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 at 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 at 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 at 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 at 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 at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-dev
>>
>>
>
>
> --
>  Edson Tirelli
>  JBoss Drools Core Development
>  JBoss by Red Hat @ www.jboss.com
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20100622/dd0d9167/attachment-0001.html 


More information about the rules-dev mailing list