<p><font size=2 face="sans-serif">I'm currently using Drools Flow with
JPA session persistence enabled as described in section 5.1 of the User
Guide.</font>
<p><font size=2 face="sans-serif">As a process executes, session information
is saved to the H2 database correctly.</font>
<p><font size=2 face="sans-serif">The problem comes if a process only executes
part way through, and I then try to finish the process by recreating a
session using the code:</font>
<br>
<br><tt><font size=2>// recreate the session from database using the sessionId<br>
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId,
kbase, null, env );</font></tt>
<p><font size=2 face="sans-serif">This gives me a NullPointerException.</font>
<p><font size=2 face="sans-serif">Having looked into the Drools Flow source
code, I think the problem is in the class drools-persistence-jpa\src\main\java\org\drools\persistence\session\SingleSessionCommandService.java.</font>
<p><font size=2 face="sans-serif">The 4th constructor of this class is
called as part of the loading of a knowledge session from the H2 database;
this in turn leads to the afterCompletion method of the inner class SynchronizationImpl
being called. The final two lines of this method are:</font>
<br>
<br><tt><font size=2>((JPAProcessInstanceManager) ((ReteooWorkingMemory)
session).getProcessInstanceManager()).clearProcessInstances();</font></tt>
<br><tt><font size=2>((JPAWorkItemManager) ((ReteooWorkingMemory) session).getWorkItemManager()).clearWorkItems();</font></tt>
<p><font size=2 face="sans-serif">However, when called via the route described
above, the session member variable of SingleSessionCommandService has not
been set, thus causing the NullPointerException.</font>
<p><font size=2 face="sans-serif">(Interestingly, running the unit tests
for drools-persistence-jpa does result in the NullPointerException being
thrown multiple times, although the tests are still listed as having passed.)</font>
<p><font size=2 face="sans-serif">I believe enclosing the above two lines
as follows will fix the problem:</font>
<br>
<br><tt><font size=2>if (session != null) {</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; ((JPAProcessInstanceManager) ((ReteooWorkingMemory)
session).getProcessInstanceManager()).clearProcessInstances();</font></tt>
<br><tt><font size=2>&nbsp; &nbsp; ((JPAWorkItemManager) ((ReteooWorkingMemory)
session).getWorkItemManager()).clearWorkItems();</font></tt>
<br><tt><font size=2>}</font></tt>
<br>
<br><font size=2 face="sans-serif">Also, in the 4th constructor of SingleSessionCommandService,
after the session has been set, the following line needs to be added to
ensure the session id is the same as the session info id:</font>
<br>
<br><tt><font size=2>((ReteooStatefulSession) this.session).setId( this.sessionInfo.getId()
);</font></tt>
<p><font size=2 face="sans-serif">(This line is present at the end of the
3rd constructor.)</font>
<p><font size=2 face="sans-serif">It would be great if this fix could make
it into the Drools 5.1 release.</font>
<p><font size=2 face="sans-serif">Thanks.<br>
<br>
<br>
<br>
<br>
<br>
</font>