<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Alberto, <br>
    <br>
    Sorry to hear that the bug isn't fixed. <br>
    <br>
    Could you clarify what you mean by these points? <br>
    &nbsp;&nbsp; - Drools and JBPM have different persistence managers.<br>
    &nbsp;&nbsp; - Drools uses JTA for persistence and JBPM does not.<br>
    <br>
    I was pretty sure you could specify a JTA data source in the
    persistence.xml that jBPM uses. <br>
    <br>
    As for the persistence managers, what do you mean exactly? <br>
    <br>
    Also, if you could maybe give me a github link referring to the code
    you're using, that would be great. <br>
    <br>
    (Just to make sure, you are referring to jbpm <b>5</b>, right?)<br>
    <br>
    Thanks,<br>
    Marco<br>
    <br>
    <br>
    03/19/2012 06:23 PM, Alberto R. Galdo:
    <blockquote
cite="mid:CADrEBQHW+GWVP1fyj_zak+b_a_XRnFwhY-SBFpMv5COgz4+_FQ@mail.gmail.com"
      type="cite">I'm afraid this bug is not resolved and doesn't have
      nothing to do with lazy evaluation.<br>
      <br>
      We've been able to get to the source of the problem and this are
      the facts:<br>
      <br>
      &nbsp;&nbsp; - Drools and JBPM have different persistence managers.<br>
      &nbsp;&nbsp; - Drools uses JTA for persistence and JBPM does not.<br>
      &nbsp;&nbsp; - When any JPA enabled object is persisted in Drools, a
      transaction begins, it's EntityManager ( Hibernate ) joins the
      transaction and the entity gets persisted. <br>
      &nbsp;&nbsp; - When any JPA enabled object ( in this case a
      ProcessInstanceInfo ) is persisted in JBPM, there are no
      transactions involved, and so the EntityManager ( Hibernate )
      decides to delay the insert ( queuing it as there's no transaction
      in progress ). Then the processId never gets updated and the NPE
      arises.<br>
      <br>
      The problem here seems to be that both Drools and JBPM manage
      persistence in different and incompatible ways. We've been able to
      modify jbpm-persistence-jpa to open a JTA transaction before
      persisting ProcessInstanceInfo, getting the EntityManager joining
      that transaction and using the current Bitronix implementation
      already running in Drools ( to assist persistence for their
      objects ) .. like so:<br>
      <br>
      &nbsp;&nbsp;&nbsp; public void setKnowledgeRuntime(InternalKnowledgeRuntime
      kruntime) {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.kruntime = kruntime;<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Environment env = kruntime.getEnvironment();<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object tm = env.get( EnvironmentName.TRANSACTION_MANAGER
      );<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(tm instanceof javax.transaction.TransactionManager))
      {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // &nbsp;&nbsp;&nbsp; get Bitronix instance inside ...<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; java.lang.reflect.Field field =
      tm.getClass().getDeclaredField("tm");<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // who says private in Java is really private ...
      xD<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; field.setAccessible(true);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tm = field.get(tm);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e){<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.txm = new JtaTransactionManager( env.get(
      EnvironmentName.TRANSACTION ), env.get(
      EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY ), tm );<br>
      &nbsp;&nbsp;&nbsp; }<br>
      <br>
      &nbsp;&nbsp;&nbsp; public void addProcessInstance(ProcessInstance
      processInstance) {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessInstanceInfo processInstanceInfo = new
      ProcessInstanceInfo( processInstance,
      this.kruntime.getEnvironment() );<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessPersistenceContext context =
      ((ProcessPersistenceContextManager)
      this.kruntime.getEnvironment().get(
      EnvironmentName.PERSISTENCE_CONTEXT_MANAGER
      )).getProcessPersistenceContext();<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.txm.begin();<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.persist( processInstanceInfo );<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.txm.commit();<br>
      <br>
      <br>
      <br>
      I think we can agree that the previous lines of code are not the
      most elegant solution&nbsp; ( at least not for me ).<br>
      <br>
      So, Is there any timeline for merging DROOLS and JBPM 5
      persistence managers?&nbsp;&nbsp; <br>
      <br>
      If someone gives me advice and architectural hints ( and if it is
      doable in a reasonable ammount of time ) I would be eager to
      submit a patch for this ....<br>
      <br>
      <br clear="all">
      Alberto R. Galdo<br>
      <a moz-do-not-send="true" href="mailto:argaldo@gmail.com">argaldo@gmail.com</a><br>
      <br>
      <br>
      <div class="gmail_quote">On Wed, Mar 14, 2012 at 13:56, Alberto R.
        Galdo <span dir="ltr">&lt;<a moz-do-not-send="true"
            href="mailto:argaldo@gmail.com">argaldo@gmail.com</a>&gt;</span>
        wrote:<br>
        <blockquote class="gmail_quote" style="margin:0 0 0
          .8ex;border-left:1px #ccc solid;padding-left:1ex">Great news!<br>
          <br>
          We were in the process of debugging JBPM trying to find the
          source of the bug ... and maybe days away from the solution
          ...<br>
          <br>
          Is there any bug report in Jira and/or a patch we can apply
          without having to wait for the next release so we can
          quick-patch our systems?<span class="HOEnZb"><font
              color="#888888"><br>
              <br>
              <br clear="all">
              Alberto R. Galdo<br>
              <a moz-do-not-send="true" href="mailto:argaldo@gmail.com"
                target="_blank">argaldo@gmail.com</a></font></span>
          <div class="HOEnZb">
            <div class="h5"><br>
              <br>
              <br>
              <div class="gmail_quote">On Wed, Mar 14, 2012 at 13:09,
                Marco Rietveld <span dir="ltr">&lt;<a
                    moz-do-not-send="true"
                    href="mailto:mrietvel@redhat.com" target="_blank">mrietvel@redhat.com</a>&gt;</span>
                wrote:<br>
                <blockquote class="gmail_quote" style="margin:0 0 0
                  .8ex;border-left:1px #ccc solid;padding-left:1ex">
                  <div bgcolor="#FFFFFF" text="#000000"> <br>
                    Hi Alberto, <br>
                    <br>
                    This is a bug that has been fixed in jBPM. It had to
                    do with lazy initialization of a <font
                      face="Default Sans
                      Serif,Verdana,Arial,Helvetica,sans-serif">JPAProcessInstanceManager</font>
                    field. <br>
                    <br>
                    We'll be releasing a new jBPM version sometime soon
                    (synchronous with Drools, I think). The bug is fixed
                    in there. <br>
                    <br>
                    Regards,<br>
                    Marco<br>
                    <br>
                    03/08/2012 11:32 AM, Alberto R. Galdo:
                    <blockquote type="cite">
                      <div>
                        <div><font face="Default Sans
                            Serif,Verdana,Arial,Helvetica,sans-serif">
                            <div>Hi,&nbsp;</div>
                            <div><br>
                            </div>
                            <div>&nbsp; We're running an application that
                              uses Drools + JBPM 5 + Drools integration
                              our set-up can be seen as:&nbsp;</div>
                            <div> <br>
                            </div>
                            <div>&nbsp; Some rule fires and creates a JBPM
                              process ( a fact gets inserted into drools
                              using
                              "kcontext.getKnowledgeRuntime().startProcess("testProcess")"
                              ). We have a problem with the persistence
                              of this processes. Persistence is
                              implemented with JPA and JTA. Our
                              application runs with fireUntilHalt() and
                              when a process is launched from the
                              consequence of any of the rules the
                              persistence of the process fails. If the
                              application runs with fireAllRules(), the
                              persistence works like a charm.</div>
                            <div>&nbsp;&nbsp;</div>
                            <div>&nbsp; The error shown is as follow:</div>
                            <div>&nbsp;&nbsp;</div>
                            <div>&nbsp; Exception in thread "Thread-5"
                              Exception executing consequence for rule
                              "Run Process" in com.sample:
                              java.lang.NullPointerException</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1101)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1029)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

org.drools.common.DefaultAgenda.fireUntilHalt(DefaultAgenda.java:1229)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:754)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:730)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.drools.command.runtime.rule.FireUntilHaltCommand$1.run(FireUntilHaltCommand.java:50)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

                              java.lang.Thread.run(Thread.java:662)</div>
                            <div>Caused by:
                              java.lang.NullPointerException</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.jbpm.persistence.processinstance.JPAProcessInstanceManager.addProcessInstance(JPAProcessInstanceManager.java:44)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.jbpm.process.instance.AbstractProcessInstanceFactory.createProcessInstance(AbstractProcessInstanceFactory.java:36)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:182)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.jbpm.process.instance.ProcessRuntimeImpl.createProcessInstance(ProcessRuntimeImpl.java:154)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:135)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:130)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1074)</div>
                            <div><span style="white-space:pre-wrap"> </span>at
org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:301)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

com.sample.Rule_Run_Process.defaultConsequence(Rule_Run_Process.java:9)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

                              com.sample.Rule_Run_ProcessDefaultConsequenceInvoker.evaluate(Unknown

                              Source)</div>
                            <div><span style="white-space:pre-wrap"> </span>at

org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1091)</div>
                            <div><span style="white-space:pre-wrap"> </span>...
                              6 more</div>
                            <div><span style="white-space:pre-wrap"> </span></div>
                            <div><span style="white-space:pre-wrap"> </span>The
                              problem is in this function:</div>
                            <div><span style="white-space:pre-wrap"> </span></div>
                            <div><span style="white-space:pre-wrap"> </span>public
                              void addProcessInstance(ProcessInstance
                              processInstance) {</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; ProcessInstanceInfo
                              processInstanceInfo = new
                              ProcessInstanceInfo( processInstance,
                              this.kruntime.getEnvironment() );</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; ProcessPersistenceContext
                              context&nbsp;</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
                              ((ProcessPersistenceContextManager)
                              this.kruntime.getEnvironment()</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .get(
                              EnvironmentName.PERSISTENCE_CONTEXT_MANAGER
                              ))</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
                              .getProcessPersistenceContext();</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; // @PrePersist added to
                              ProcessInstanceInfo because of this</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp; context.persist(
                              processInstanceInfo );</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp;
                              ((org.jbpm.process.instance.ProcessInstance)
                              processInstance).setId(
                              processInstanceInfo.getId() );</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp;
                              processInstanceInfo.updateLastReadDate();</div>
                            <div>&nbsp; &nbsp; &nbsp; &nbsp;
                              internalAddProcessInstance(processInstance);</div>
                            <div>&nbsp; &nbsp; }</div>
                            <div><span style="white-space:pre-wrap"> </span></div>
                            <div><span style="white-space:pre-wrap"> </span>We
                              think after that persist sentence, the
                              entity manager would have to run a flush
                              sentence for the process instance is
                              inserted into database and get the ID.</div>
                            <div><span style="white-space:pre-wrap"> </span></div>
                            <div><span style="white-space:pre-wrap"> </span>Greets.</div>
                          </font> <br>
                          <fieldset></fieldset>
                          <br>
                        </div>
                      </div>
                      <div>
                        <pre>_______________________________________________
rules-users mailing list
<a moz-do-not-send="true" href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a>
<a moz-do-not-send="true" href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a>
</pre>
                      </div>
                    </blockquote>
                    <span><font color="#888888"> <br>
                        <br>
                        <pre cols="72">-- 
jBPM/Drools developer
Utrecht, the Netherlands</pre>
                      </font></span></div>
                </blockquote>
              </div>
              <br>
            </div>
          </div>
        </blockquote>
      </div>
      <br>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
jBPM/Drools developer
Utrecht, the Netherlands</pre>
  </body>
</html>