[jboss-user] [jBPM] - Service task exception with non-JTA transaction manager persistence and Tomcat

navisdrools do-not-reply at jboss.com
Wed Feb 8 19:01:54 EST 2012


navisdrools [https://community.jboss.org/people/navisdrools] created the discussion

"Service task exception with non-JTA transaction manager persistence and Tomcat"

To view the discussion, visit: https://community.jboss.org/message/715345#715345

--------------------------------------------------------------
I am integrating jbpm5 and drools into my company's product. I did a standalone prototype using Bitronix transcation manager with a simple work flow persisting into mysql. Script task, rule, event and service tasks all worked fine. Next I had to move this prototye into Spring and Tomcat. Bitronix did not work with the way we configured Tomcat. Finally, found a posting about using Spring transaction manager. Script task, rule, event and call activcity worked fine exception service task. If anyone could help would be appreciated. Here are my code.

Error
Hibernate: insert into SessionInfo (lastModificationDate, rulesByteArray, startDate, OPTLOCK) values (?, ?, ?, ?)
Session started ... session id = 4
Hibernate: insert into ProcessInstanceInfo (lastModificationDate, lastReadDate, processId, processInstanceByteArray, startDate, state, OPTLOCK) values (?, ?, ?, ?, ?, ?, ?)
Starting process id = 6
java.lang.NullPointerException
        at org.drools.persistence.jpa.processinstance.JPAWorkItemManager.internalExecuteWorkItem(JPAWorkItemManager.java:43)
        at org.jbpm.workflow.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:105)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:185)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:150)
        at org.jbpm.workflow.instance.node.ActionNodeInstance.triggerCompleted(ActionNodeInstance.java:55)
        at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:51)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:185)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:150)
        at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:49)
        at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:41)
        at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)
        at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35)
        at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:188)
        at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:303)
        at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:168)
        at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:138)
        at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1079)
        at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:306)
        at org.drools.command.runtime.process.StartProcessCommand.execute(StartProcessCommand.java:119)
        at org.drools.command.runtime.process.StartProcessCommand.execute(StartProcessCommand.java:38)
        at org.drools.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36)
        at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:345)
        at org.drools.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:223)
...
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)


BPMN
<?xml version="1.0" encoding="UTF-8"?> 
<definitions id="Definition"
             targetNamespace=" http://www.jboss.org/drools http://www.jboss.org/drools"
             typeLanguage=" http://www.java.com/javaTypes http://www.java.com/javaTypes"
             expressionLanguage=" http://www.mvel.org/2.0 http://www.mvel.org/2.0"
             xmlns=" http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation=" http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
             xmlns:g=" http://www.jboss.org/drools/flow/gpd http://www.jboss.org/drools/flow/gpd"
             xmlns:bpmndi=" http://www.omg.org/spec/BPMN/20100524/DI http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:dc=" http://www.omg.org/spec/DD/20100524/DC http://www.omg.org/spec/DD/20100524/DC"
             xmlns:di=" http://www.omg.org/spec/DD/20100524/DI http://www.omg.org/spec/DD/20100524/DI"
             xmlns:tns=" http://www.jboss.org/drools http://www.jboss.org/drools">


  <process processType="Private" isExecutable="true" id="com.navis.control.TestProcess" name="EventTest.b" >


    <!-- nodes -->
    <startEvent id="_1" name="Start" />
    <endEvent id="_2" name="End" >
        <terminateEventDefinition/>
    </endEvent>
    <scriptTask id="_3" name="Startup" >
      <script>System.out.println("Starting process id = " + kcontext.getProcessInstance().getId());</script>
    </scriptTask>
    <scriptTask id="_4" name="Finish" >
      <script>System.out.println("Resuming process id = " + kcontext.getProcessInstance().getId());
System.out.println("Waking Up from event");</script>
    </scriptTask>
    <task id="_5" name="WorkItem" tns:taskName="TestWorkItem" >
      <ioSpecification>
        <inputSet>
        </inputSet>
        <outputSet>
        </outputSet>
      </ioSpecification>
    </task>
    <intermediateCatchEvent id="_6" name="Signal" >
      <signalEventDefinition signalRef="com.navis.control.TestEvent"/>
    </intermediateCatchEvent>
    <scriptTask id="_7" name="Sleep" >
      <script>System.out.println("Going to sleep");</script>
    </scriptTask>


    <!-- connections -->
    <sequenceFlow id="_4-_2" sourceRef="_4" targetRef="_2" />
    <sequenceFlow id="_1-_3" sourceRef="_1" targetRef="_3" />
    <sequenceFlow id="_6-_4" sourceRef="_6" targetRef="_4" />
    <sequenceFlow id="_3-_5" sourceRef="_3" targetRef="_5" />
    <sequenceFlow id="_7-_6" sourceRef="_7" targetRef="_6" />
    <sequenceFlow id="_5-_7" sourceRef="_5" targetRef="_7" />


  </process>


  <bpmndi:BPMNDiagram>
    <bpmndi:BPMNPlane bpmnElement="com.navis.control.TestProcess" >
      <bpmndi:BPMNShape bpmnElement="_1" >
        <dc:Bounds x="46" y="110" width="48" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_2" >
        <dc:Bounds x="741" y="111" width="48" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_3" >
        <dc:Bounds x="125" y="111" width="80" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_4" >
        <dc:Bounds x="606" y="111" width="80" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_5" >
        <dc:Bounds x="247" y="110" width="100" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_6" >
        <dc:Bounds x="507" y="111" width="48" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_7" >
        <dc:Bounds x="385" y="111" width="80" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_4-_2" >
        <di:waypoint x="646" y="135" />
        <di:waypoint x="765" y="135" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_1-_3" >
        <di:waypoint x="70" y="134" />
        <di:waypoint x="165" y="135" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_6-_4" >
        <di:waypoint x="531" y="135" />
        <di:waypoint x="646" y="135" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_3-_5" >
        <di:waypoint x="165" y="135" />
        <di:waypoint x="297" y="134" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_7-_6" >
        <di:waypoint x="425" y="135" />
        <di:waypoint x="531" y="135" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_5-_7" >
        <di:waypoint x="297" y="134" />
        <di:waypoint x="425" y="135" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>


</definitions>

JAVA
package com.navis.control;


import java.util.HashMap;
import java.util.Map;


import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.persistence.jpa.JPAKnowledgeService;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.ProcessInstance;




/**
 * This is a sample file to launch a process.
 */
public class ProcessTest {


          public static final void main(String[] args) {
                    ProcessTest pt = new ProcessTest();


                    pt.execute();
          }


          public String execute() {
                    try {


                              // load up the knowledge base
                              KnowledgeBase kbase = readKnowledgeBase();
                              // create session
                              StatefulKnowledgeSession ksession = initSession(kbase);
                              int sid = ksession.getId();
                              System.out.println("Session started ... session id = " + sid);
                              // init logger
                              KnowledgeRuntimeLogger logger = initLogger(ksession);
                              // register Work Item Handler
                              registerHandler(ksession);
                              // start a new process instance
                              Map<String, Object> parm = new HashMap<String, Object>();
                              parm.put("id", 1);
                              ProcessInstance pi = ksession.startProcess(
                                                  "com.navis.control.TestProcess", parm);
                              long pid = pi.getId();
                              System.out.println("Process started ... process id = " + pid);
                              // restart process
                              // sendEvent(pid, kbase, env);
                              ksession.dispose();
                              logger.close();
                              return "Success";
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return "Exception occurred";
                    }
          }


          private KnowledgeBase readKnowledgeBase() throws Exception {
                    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                                        .newKnowledgeBuilder();
                    kbuilder.add(ResourceFactory.newClassPathResource("data/EventTest.bpmn"),
                                        ResourceType.BPMN2);
                    return kbuilder.newKnowledgeBase();
          }


          private StatefulKnowledgeSession initSession(KnowledgeBase kbase) {
                    try {
                              // create the entity manager factory and register it in the
                              // environment
                              EntityManagerFactory emf = Persistence
                                                  .createEntityManagerFactory("org.jbpm.persistence.jpa");
                              Environment env = KnowledgeBaseFactory.newEnvironment();
                              env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
                              env.set(EnvironmentName.TRANSACTION_MANAGER,
                    new org.springframework.orm.jpa.JpaTransactionManager(emf));
                              // load up the knowledge base
                              // StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
                              StatefulKnowledgeSession ksession = JPAKnowledgeService
                                                  .newStatefulKnowledgeSession(kbase, null, env);
                              return ksession;
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return null;
                    }
          }


          private KnowledgeRuntimeLogger initLogger(StatefulKnowledgeSession ksession) {
                    try {
                              KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory
                                                  .newThreadedFileLogger(ksession, "test", 1000);
                              return logger;
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return null;
                    }
          }


          private void registerHandler(StatefulKnowledgeSession ksession) {
                    try {
                              ksession.getWorkItemManager().registerWorkItemHandler(
                                                  "TestWorkItem", new TestHandler());
                    } catch (Throwable t) {
                              t.printStackTrace();


                    }
          }
}

/*
 * Copyright (c) 2012 Navis LLC. All Rights Reserved.
 *
 */


package com.navis.control;


import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.persistence.jpa.JPAKnowledgeService;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.StatefulKnowledgeSession;


/**
 * This is a sample file to launch a process.
 */
public class ProcessTest2 {
          public static final void main(String[] args) {
                    ProcessTest2 pt = new ProcessTest2();
                    pt.execute();
          }


          public String execute() {
                    try {


                              // load up the knowledge base
                              KnowledgeBase kbase = readKnowledgeBase();
                              // create session
                              Environment env = initEnv();
                              // init logger
                              int sid=21;
                              StatefulKnowledgeSession ksession=loadSession(sid, kbase, env);
                              KnowledgeRuntimeLogger logger = initLogger(ksession);
                              // register Work Item Handler
                              registerHandler(ksession);
                              //restart process
                              long pid=28;
                              sendEvent(ksession, pid);


                              ksession.dispose();
                              logger.close();


                              return "Success";
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return "Exception occurred";
                    }
          }




          private static void sendEvent(StatefulKnowledgeSession ksession, long pid) {
                    TestEvent testEvent = new TestEvent();
                    testEvent.setId(pid);
                    System.out.println("Sending Event ...");
                    ksession.signalEvent("com.navis.control.TestEvent", testEvent, pid);
                    System.out.println("Event sent ...");
                    ksession.halt();
                    ksession.dispose();
          }


          private KnowledgeBase readKnowledgeBase() throws Exception {
                    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                                        .newKnowledgeBuilder();
                    kbuilder.add(ResourceFactory.newClassPathResource("EventTest.bpmn"),
                                        ResourceType.BPMN2);
                    return kbuilder.newKnowledgeBase();
          }


          private Environment initEnv() {
                    try {
                              // create the entity manager factory and register it in the
                              // environment
                              EntityManagerFactory emf = Persistence
                                                  .createEntityManagerFactory("org.jbpm.persistence.jpa");
                              Environment env = KnowledgeBaseFactory.newEnvironment();
                              env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
                              env.set(EnvironmentName.TRANSACTION_MANAGER,
                    new org.springframework.orm.jpa.JpaTransactionManager(emf));
                              // load up the knowledge base
                              return env;
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return null;
                    }
          }


          private StatefulKnowledgeSession loadSession(int sid, KnowledgeBase kbase, Environment env) {
                    try {
                              StatefulKnowledgeSession ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sid, kbase, null, env);
                              System.out.println("Retreiving session ... id = " + ksession.getId());
                              return ksession;
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return null;
                    }
          }


                    private KnowledgeRuntimeLogger initLogger(StatefulKnowledgeSession ksession) {
                    try {
                              KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory
                                                  .newThreadedFileLogger(ksession, "test", 1000);
                              return logger;
                    } catch (Throwable t) {
                              t.printStackTrace();
                              return null;
                    }
          }


          private void registerHandler(StatefulKnowledgeSession ksession) {
                    try {
                              ksession.getWorkItemManager().registerWorkItemHandler(
                                                  "TestWorkItem", new TestHandler());
                    } catch (Throwable t) {
                              t.printStackTrace();


                    }
          }
}

/*
 * Copyright (c) 2012 Navis LLC. All Rights Reserved.
 *
 */


package com.navis.control;


import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;


import java.io.Serializable;


public class TestHandler implements WorkItemHandler, Serializable {


          /**
           *
           */
          private static final long serialVersionUID = 1L;


          @Override
          public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
                    System.out.println(">>>>>>>Inside work item handler");


                    manager.completeWorkItem(workItem.getId(), null);
                    System.out.println(">>>>>>>work item completed");


          }


          @Override
          public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {


          }
}

package com.navis.control;

import java.io.Serializable;

public class TestEvent implements Serializable {
          /**
           *
           */
          private static final long serialVersionUID = -3789036281504593218L;
          /**
           *
           */

  private long id;
          private String name;

           public void setId(long id) {
                    this.id = id;
          }

          public long getId() {
                    return id;
          }

          public void setName(String name) {
                    this.name = name;
          }

          public String getName() {
                    return name;
          }
}

PERSISTENCE
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="1.0"
             xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd  http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm  http://java.sun.com/xml/ns/persistence/orm_1_0.xsd http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
             xmlns:orm=" http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm" xmlns=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="org.jbpm.persistence.jpa"
                      transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>java:comp/env/jdbc/jbpmDS</non-jta-data-source>
        <mapping-file>META-INF/JBPMorm.xml</mapping-file>
        <class>org.drools.persistence.info.SessionInfo</class>
        <class>org.drools.persistence.info.WorkItemInfo</class>
        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.max_fetch_depth" value="3"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

DATASOURCE
    <Resource auth="Container" name="jdbc/jbpmDS" type="javax.sql.DataSource"
              driverClassName="com.mysql.jdbc.Driver" password="mnrpass" username="mnr"
              testOnBorrow="true" validationQuery="select 1"
              maxActive="25" maxIdle="10" maxWait="12000"
              initialSize="6"
              url="jdbc:mysql://localhost/apex?autoReconnect=true&amp;useLegacyDatetimeCode=false" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>


 WEB.XML
    <resource-ref>
        <res-ref-name>jdbc/apexDS</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Application</res-auth>
    </resource-ref>
--------------------------------------------------------------

Reply to this message by going to Community
[https://community.jboss.org/message/715345#715345]

Start a new discussion in jBPM at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20120208/f3ff2829/attachment-0001.html 


More information about the jboss-user mailing list