[rules-users] NPE in Drools JPA Persistence with rules that use Flow

Shannon Hastings shannon.hastings at inventrio.com
Thu May 26 11:44:28 EDT 2011


Ya, 

session = JPAKnowledgeService.loadStatefulKnowledgeSession(
						map.getSessionId(), getKnowledgeBase(), null, env);

On May 26, 2011, at 11:40 AM, Mauricio Salatino wrote:

> Are you using the JPAKnowledgeService? 
> 
> 2011/5/26 Shannon Hastings <shannon.hastings at inventrio.com>
> It is actually null.  I dont pass any config in when constructing the session.
> 
> 
> On May 26, 2011, at 11:13 AM, Mauricio Salatino wrote:
> 
>> Can you share the ksession configuration?
>> 
>> 
>> 2011/5/26 Shannon Hastings <shannon.hastings at inventrio.com>
>> My session is persistent, i can query the sessioninfo in the DB and see the data.  My beans are searializable and I can see that the fact has been deserialized.  
>> 
>> 
>> On May 26, 2011, at 11:05 AM, Mauricio Salatino wrote:
>> 
>>> Ok, assuming that your session is persistent, are your POJOs serializables?
>>> Cheers
>>> 
>>> 2011/5/26 Shannon Hastings <shannon.hastings at inventrio.com>
>>> Nope, no change, i am pulling the same drl from guvnor every time.  It only has three rules as show below in the thread. I can restore the session without error so long as the session does not have any facts in it.  Once I drop a fact in and store, then i cannot restore.
>>> 
>>> 
>>> On May 26, 2011, at 10:55 AM, Mauricio Salatino wrote:
>>> 
>>>> Ok, so did you check that you didn't change anything from the moment you store the ksession and the moment when you restore it?
>>>> I usually find this problem when you change a rule and try to restore the session using the new version of the rule or when you change a business process definition or the session state from different threads. Can you check that please?
>>>> You will find this unmarshalling problems and it will be very difficult to debug at that level, when the problem is being caused by some modification on your code. Greetings
>>>> 
>>>> 2011/5/26 Shannon Hastings <shannon.hastings at inventrio.com>
>>>> I have debugged into this and found this issue.  The NPE comes when the session unmarsheller runs into a node that does not have a sink or the sink is null. In the debugger i can see the fact and the fact looks right, has all the data from the pojo i sent in. However, it does not have a sink, but it does have a node id.  This looks like a bug that was reportedly fixed before in 5.1.  I dont know enough about the storing of the facts in the working memory or the model that is being used under the hood, however, all i have to do to create the problem is create a session, send an object to it, and then try to restore it.  And the objects i am sending to it are simple pojo's and in the debugger I can see that it was able to read them back out just fine.  Below is an exerpt from the "InputMarshaller" class.  In the debugger The readlefttuples operation shows the nodeId = 12 and the sink  = null and the facthandleId = 1.  he it calls readLeftTuple() and the obvious NPE will be thrown because the ParentLeftTuple has a null sink and when you call "sink.getType()" you get the NPE.  Is this a known bug.
>>>> 
>>>>   public static void readLeftTuples(MarshallerReaderContext context) throws IOException,
>>>>                                                                       ClassNotFoundException {
>>>>         ObjectInputStream stream = context.stream;
>>>> 
>>>>         while ( stream.readShort() == PersisterEnums.LEFT_TUPLE ) {
>>>>             int nodeId = stream.readInt();
>>>>             LeftTupleSink sink = (LeftTupleSink) context.sinks.get( nodeId );
>>>>             int factHandleId = stream.readInt();
>>>>             LeftTuple leftTuple = new LeftTuple( context.handles.get( factHandleId ),
>>>>                                                  sink,
>>>>                                                  true );
>>>>             readLeftTuple( leftTuple,
>>>>                            context );
>>>>         }
>>>>     }
>>>> 
>>>>     public static void readLeftTuple(LeftTuple parentLeftTuple,
>>>>                                      MarshallerReaderContext context) throws IOException,
>>>>                                                                      ClassNotFoundException {
>>>>         ObjectInputStream stream = context.stream;
>>>>         Map<Integer, BaseNode> sinks = context.sinks;
>>>> 
>>>>         LeftTupleSink sink = parentLeftTuple.getLeftTupleSink();
>>>> 
>>>>         switch ( sink.getType() ) {
>>>> 
>>>> 
>>>> On May 24, 2011, at 9:06 AM, Edson Tirelli wrote:
>>>> 
>>>>> 
>>>>>     Shannon,
>>>>> 
>>>>>     What is the following method doing?
>>>>> 
>>>>> engine.process(reading);
>>>>> 
>>>>>     Can you please open a JIRA and attach your test case or point me to the jira reporting this problem if it exists already?
>>>>> 
>>>>>     Thanks,
>>>>>         Edson
>>>>> 
>>>>> 
>>>>> 2011/5/23 Shannon Hastings <shannon.hastings at inventrio.com>
>>>>> I am using drools 5.2.0.M2 and I still get this error:
>>>>> 
>>>>> Caused by: java.lang.NullPointerException
>>>>> 	at org.drools.marshalling.impl.InputMarshaller.readLeftTuple(InputMarshaller.java:469)
>>>>> 
>>>>> Which was reported on drools 5.1.0 JIRA and claimed to be fixed.  I see the error when trying to load a session that was persisted that had objects inserted that  are time depended and cause rules to fire that use terms from flow such as "after".  I only see this error if create a new session, submit some facts to it, close it, and then try to reload.  If i do not submit any facts to it I do not get the error.  I.E.  If all i do is create the KB with my rules I can reload a session from the DB no problem, but if i submit some facts and persist the session, then i cannot reload it.  This seems to be an issue with the JPA loading of the session that has facts in it that use Flow (JBPM).  Any help would be greatly appreciated.  Below are my simple rules followed by the test code used to submit the facts:
>>>>> 
>>>>> package com.inventrio.rules.readings
>>>>>  
>>>>> import com.inventrio.healthmonitoring.model.*;
>>>>> 
>>>>> declare Reading
>>>>>     @role(event)
>>>>>     @timestamp(readingTime)
>>>>> end
>>>>> 
>>>>> rule "High Blood Pressure"
>>>>> 	when
>>>>> 		$eventA :  Reading(readingType.name == "BPMETER")
>>>>> 		$systolic : Value( this.valueType.name == "SYSTOLIC"  ) from $eventA.values
>>>>> 		$diastolic : Value( this.valueType.name == "DIASTOLIC"  ) from $eventA.values
>>>>> 		eval( $systolic.getLongValue() > 180 && $diastolic.getLongValue() > 120 )
>>>>> 	then
>>>>> 		System.out.println("HIGH BLOOD PRESSURE" );  
>>>>> end
>>>>> 
>>>>> rule "Weight Trending Up"
>>>>> 	when
>>>>> 		$eventC :  Reading(readingType.name == "WEIGHT" )
>>>>> 		$eventB  : Reading( readingType.name == "WEIGHT" , this after[5s, 1m] $eventC )
>>>>> 		$eventA  : Reading( readingType.name == "WEIGHT" , this after[5s, 1m] $eventB )
>>>>> 		$weight3 : Value( this.valueType.name == "WEIGHT"  ) from $eventC.values
>>>>> 		$weight2 : Value( this.valueType.name == "WEIGHT"  ) from $eventB.values
>>>>> 		$weight1 : Value( this.valueType.name == "WEIGHT"  ) from $eventA.values
>>>>> 		eval(  $weight3.getDoubleValue().doubleValue() < $weight2.getDoubleValue().doubleValue() + 1.0  && $weight2.getDoubleValue().doubleValue() < $weight1.getDoubleValue().doubleValue() + 1.0 )
>>>>> 	then
>>>>> 		System.out.println("WEIGHT IS GOING UP" ); 
>>>>> end
>>>>> 
>>>>> rule "Weight Trending Down"
>>>>> 	when
>>>>> 		$eventC :  Reading(readingType.name == "WEIGHT" )
>>>>> 		$eventB  : Reading( readingType.name == "WEIGHT" , this after[5s, 1m] $eventC )
>>>>> 		$eventA  : Reading( readingType.name == "WEIGHT" , this after[5s, 1m] $eventB )
>>>>> 		$weight3 : Value( this.valueType.name == "WEIGHT"  ) from $eventC.values
>>>>> 		$weight2 : Value( this.valueType.name == "WEIGHT"  ) from $eventB.values
>>>>> 		$weight1 : Value( this.valueType.name == "WEIGHT"  ) from $eventA.values
>>>>> 		eval(  $weight3.getDoubleValue().doubleValue() > $weight2.getDoubleValue().doubleValue() + 1.0  && $weight2.getDoubleValue().doubleValue() > $weight1.getDoubleValue().doubleValue() + 1.0 )
>>>>> 	then
>>>>> 		System.out.println("WEIGHT IS GOING DOWN" ); 
>>>>> end
>>>>> 
>>>>> 
>>>>> 
>>>>> And next is my object i insert before closeing and then trying to reload the session.
>>>>> 
>>>>> 	public void testWeightRules() {
>>>>> 		try {
>>>>> 
>>>>> 			Reading reading = new Reading();
>>>>> 			reading.setReadingTime(new Date(System.currentTimeMillis()));
>>>>> 			ReadingType type = new ReadingType();
>>>>> 			type.setName("WEIGHT");
>>>>> 			type.setDescription("");
>>>>> 			reading.setReadingType(type);
>>>>> 			Value value = new Value();
>>>>> 			value.setDoubleValue(140.0);
>>>>> 			ValueType valueType = new ValueType();
>>>>> 			valueType.setName("WEIGHT");
>>>>> 			valueType.setDataType(ValueDataType.DOUBLE);
>>>>> 			value.setValueType(valueType);
>>>>> 			reading.getValues().add(value);
>>>>> 			reading.setReadingType(type);
>>>>> 			engine.process(reading);
>>>>> 
>>>>> 			Thread.sleep(7000);
>>>>> 
>>>>> 			reading = new Reading();
>>>>> 			reading.setReadingTime(new Date(System.currentTimeMillis()));
>>>>> 			type = new ReadingType();
>>>>> 			type.setName("WEIGHT");
>>>>> 			type.setDescription("");
>>>>> 			reading.setReadingType(type);
>>>>> 			value = new Value();
>>>>> 			value.setDoubleValue(142.0);
>>>>> 			valueType = new ValueType();
>>>>> 			valueType.setName("WEIGHT");
>>>>> 			valueType.setDataType(ValueDataType.DOUBLE);
>>>>> 			value.setValueType(valueType);
>>>>> 			reading.getValues().add(value);
>>>>> 			reading.setReadingType(type);
>>>>> 			engine.process(reading);
>>>>> 
>>>>> 			Thread.sleep(7000);
>>>>> 
>>>>> 			reading = new Reading();
>>>>> 			reading.setReadingTime(new Date(System.currentTimeMillis()));
>>>>> 			type = new ReadingType();
>>>>> 			type.setName("WEIGHT");
>>>>> 			type.setDescription("");
>>>>> 			reading.setReadingType(type);
>>>>> 			value = new Value();
>>>>> 			value.setDoubleValue(144.0);
>>>>> 			valueType = new ValueType();
>>>>> 			valueType.setName("WEIGHT");
>>>>> 			valueType.setDataType(ValueDataType.DOUBLE);
>>>>> 			value.setValueType(valueType);
>>>>> 			reading.getValues().add(value);
>>>>> 			reading.setReadingType(type);
>>>>> 			engine.process(reading);
>>>>> 
>>>>> 		} catch (Throwable t) {
>>>>> 			t.printStackTrace();
>>>>> 		}
>>>>> 	}
>>>>> 
>>>>> Shannon Hastings
>>>>> 
>>>>> Inventrio
>>>>> 545 Metro Place South, Suite 475
>>>>> Dublin, OH 43017
>>>>> Phone: (614) 389-2795 x101
>>>>> Fax: (614) 522-6249
>>>>> Email: shannon.hastings at inventrio.com
>>>>> http://www.inventrio.com
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>>   Edson Tirelli
>>>>>   JBoss Drools Core Development
>>>>>   JBoss by Red Hat @ www.jboss.com
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>> 
>>>> 
>>>> Shannon Hastings
>>>> 
>>>> Inventrio
>>>> 545 Metro Place South, Suite 475
>>>> Dublin, OH 43017
>>>> Phone: (614) 389-2795 x101
>>>> Fax: (614) 522-6249
>>>> Email: shannon.hastings at inventrio.com
>>>> http://www.inventrio.com
>>>> 
>>>> 
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>> 
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>>  - CTO @ http://www.plugtree.com  
>>>>  - MyJourney @ http://salaboy.wordpress.com
>>>>  - Co-Founder @ http://www.jbug.com.ar
>>>>  
>>>>  - Salatino "Salaboy" Mauricio -
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>> 
>>> Shannon Hastings
>>> 
>>> Inventrio
>>> 545 Metro Place South, Suite 475
>>> Dublin, OH 43017
>>> Phone: (614) 389-2795 x101
>>> Fax: (614) 522-6249
>>> Email: shannon.hastings at inventrio.com
>>> http://www.inventrio.com
>>> 
>>> 
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>>  - CTO @ http://www.plugtree.com  
>>>  - MyJourney @ http://salaboy.wordpress.com
>>>  - Co-Founder @ http://www.jbug.com.ar
>>>  
>>>  - Salatino "Salaboy" Mauricio -
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
>> Shannon Hastings
>> 
>> Inventrio
>> 545 Metro Place South, Suite 475
>> Dublin, OH 43017
>> Phone: (614) 389-2795 x101
>> Fax: (614) 522-6249
>> Email: shannon.hastings at inventrio.com
>> http://www.inventrio.com
>> 
>> 
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
>> 
>> 
>> 
>> -- 
>>  - CTO @ http://www.plugtree.com  
>>  - MyJourney @ http://salaboy.wordpress.com
>>  - Co-Founder @ http://www.jbug.com.ar
>>  
>>  - Salatino "Salaboy" Mauricio -
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> Shannon Hastings
> 
> Inventrio
> 545 Metro Place South, Suite 475
> Dublin, OH 43017
> Phone: (614) 389-2795 x101
> Fax: (614) 522-6249
> Email: shannon.hastings at inventrio.com
> http://www.inventrio.com
> 
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> 
> 
> 
> -- 
>  - CTO @ http://www.plugtree.com  
>  - MyJourney @ http://salaboy.wordpress.com
>  - Co-Founder @ http://www.jbug.com.ar
>  
>  - Salatino "Salaboy" Mauricio -
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

Shannon Hastings

Inventrio
545 Metro Place South, Suite 475
Dublin, OH 43017
Phone: (614) 389-2795 x101
Fax: (614) 522-6249
Email: shannon.hastings at inventrio.com
http://www.inventrio.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110526/8af32e8e/attachment.html 


More information about the rules-users mailing list