[jboss-user] [jBPM] - Re: saving state after workitem

Prasanth Manchambhatla do-not-reply at jboss.com
Fri Jan 27 13:57:30 EST 2012


Prasanth Manchambhatla [https://community.jboss.org/people/pmancham] created the discussion

"Re: saving state after workitem"

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

--------------------------------------------------------------
One more problem - after (a) & (b) above  :)  

(c) I had 2 workitems. First one was inserted & updated. Second one was never inserted & the process exited. Why? [Queries can be seen from logs I pasted below]

My sample test case 

*BPMN: (Also attached picture below)*

<?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">


  <itemDefinition id="_result1Item" structureRef="String" />
  <itemDefinition id="_result2Item" structureRef="String" />
  <itemDefinition id="_retry1Item" structureRef="Integer" />
  <itemDefinition id="_retry2Item" structureRef="Integer" />


  <process processType="Private" isExecutable="true" id="com.sample.bpmn.saveStateExample" name="Sample Process" tns:packageName="testPackage" >


    <!-- process variables -->
    <property id="result1" itemSubjectRef="_result1Item"/>
    <property id="result2" itemSubjectRef="_result2Item"/>
    <property id="retry1" itemSubjectRef="_retry1Item"/>
    <property id="retry2" itemSubjectRef="_retry2Item"/>


    <!-- nodes -->
    <startEvent id="_1" name="StartProcess" />
    <scriptTask id="_3" name="Script" scriptFormat=" http://www.java.com/java http://www.java.com/java" >
      <script>System.out.println("********** MESSAGE1 *************");
String message1 = ((String) kcontext.getVariable("result1"));
System.out.println(message1);
message1 = message1 + " World";
kcontext.setVariable("result1", message1);
System.out.println("********** END1 *************");</script>
    </scriptTask>
    <scriptTask id="_5" name="Script" scriptFormat=" http://www.java.com/java http://www.java.com/java" >
      <script>System.out.println("********** MESSAGE2 *************");
String message2 = ((String) kcontext.getVariable("result1"));
System.out.println(message2);
System.out.println("********** END2 *************");</script>
    </scriptTask>
    <endEvent id="_6" name="End" >
        <terminateEventDefinition/>
    </endEvent>
    <task id="_9" name="SaveState" tns:taskName="SaveState" >
      <ioSpecification>
        <inputSet>
        </inputSet>
        <outputSet>
        </outputSet>
      </ioSpecification>
    </task>
    <task id="_10" name="SaveState" tns:taskName="SaveState" >
      <ioSpecification>
        <inputSet>
        </inputSet>
        <outputSet>
        </outputSet>
      </ioSpecification>
    </task>


    <!-- connections -->
    <sequenceFlow id="_9-_3" sourceRef="_9" targetRef="_3" />
    <sequenceFlow id="_10-_5" sourceRef="_10" targetRef="_5" />
    <sequenceFlow id="_5-_6" sourceRef="_5" targetRef="_6" />
    <sequenceFlow id="_1-_9" sourceRef="_1" targetRef="_9" />
    <sequenceFlow id="_3-_10" sourceRef="_3" targetRef="_10" />


  </process>


  <bpmndi:BPMNDiagram>
    <bpmndi:BPMNPlane bpmnElement="com.sample.bpmn.saveStateExample" >
      <bpmndi:BPMNShape bpmnElement="_1" >
        <dc:Bounds x="55" y="106" width="48" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_3" >
        <dc:Bounds x="136" y="208" width="117" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_5" >
        <dc:Bounds x="313" y="295" width="96" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_6" >
        <dc:Bounds x="341" y="389" width="48" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_9" >
        <dc:Bounds x="321" y="111" width="100" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_10" >
        <dc:Bounds x="471" y="196" width="100" height="48" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_9-_3" >
        <di:waypoint x="371" y="135" />
        <di:waypoint x="194" y="232" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_10-_5" >
        <di:waypoint x="521" y="220" />
        <di:waypoint x="361" y="319" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_5-_6" >
        <di:waypoint x="361" y="319" />
        <di:waypoint x="365" y="413" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_1-_9" >
        <di:waypoint x="79" y="130" />
        <di:waypoint x="371" y="135" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_3-_10" >
        <di:waypoint x="194" y="232" />
        <di:waypoint x="521" y="220" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>


</definitions>


*SaveState WorkItem:*

public class SaveStateWorkItemHandler implements WorkItemHandler {
    @Override
    public void executeWorkItem(WorkItem workItem, WorkItemManager workItemManager) {
        System.out.println("******** START SAVE-STATE SLEEP *************");
        final WorkItem myWorkItem = workItem;
        final WorkItemManager myWorkItemManager = workItemManager;
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i=0; i<10; i++) {
                        System.out.println("i = " + i);
                        Thread.sleep(2000);
                    }
                    System.out.println("******** END SAVE-STATE SLEEP *************");
                    myWorkItemManager.completeWorkItem(myWorkItem.getId(), null);
                } catch (InterruptedException e) {
                    System.out.println("Exception while sleeping in the thread");
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }
        });
        t.start();
        System.out.println("******** END SAVE-STATE *************");
    }


    @Override
    public void abortWorkItem(WorkItem workItem, WorkItemManager workItemManager) {
        //Do Nothing.
        workItemManager.abortWorkItem(workItem.getId());
    }
}


*Servlet that starts the workflow:*

Properties properties = new Properties();
        properties.put("drools.processInstanceManagerFactory", "org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory");
        properties.put("drools.processSignalManagerFactory", "org.jbpm.persistence.processinstance.JPASignalManagerFactory");
        KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(properties);
        if (sid == -1) {
            EntityManagerFactory emf =
                    Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");
            Environment env = KnowledgeBaseFactory.newEnvironment();
            env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
            //env.set(EnvironmentName.TRANSACTION_MANAGER,)
            // create a new knowledge session that uses JPA to store the runtime state
            StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, config, env);
            JPAWorkingMemoryDbLogger dblogger = new JPAWorkingMemoryDbLogger(ksession);
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "test", 1000);
            ksession.getWorkItemManager().registerWorkItemHandler("SaveState", new SaveStateWorkItemHandler());
            int sessionId = ksession.getId();
            // invoke methods on your method here
            ProcessInstance pi = (ProcessInstance) ksession.startProcess(processId, params);
            System.out.println("Process started ... sessionId = " + sessionId + " processId = " + pi.getId());
+              + 
+            //Ignore the lines below - Added it for some other workflow I was testing+
+try {+
+                System.out.println("Sleeping for 15 seconds");+
+                Thread.sleep(15000);+
+            } catch (InterruptedException e) {+
+                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.+
+            }+
+            pi.signalEvent(signal, signalData);+
+            System.out.println("Signaled event");+


*Logs:*

11:48:45,308 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select SESSIONINFO_ID_SEQ.nextval from dual


11:48:45,308 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into SessionInfo (lastModificationDate, rulesByteArray, startDate, OPTLOCK, id) values (?, ?, ?, ?, ?)


11:48:45,324 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,324 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,324 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,324 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,340 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,340 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,340 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,340 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,340 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,355 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,355 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select hibernate_sequence.nextval from dual


11:48:45,355 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: select WORKITEMINFO_ID_SEQ.nextval from dual


11:48:45,355 INFO  [stdout] (http--0.0.0.0-8080-4) ******** START SAVE-STATE SLEEP *************


11:48:45,355 INFO  [stdout] (http--0.0.0.0-8080-4) ******** END SAVE-STATE *************


11:48:45,355 INFO  [stdout] (Thread-69) i = 0


11:48:45,355 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: update SessionInfo set lastModificationDate=?, rulesByteArray=?, startDate=?, OPTLOCK=? where id=? and OPTLOCK=?


11:48:45,371 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into ProcessInstanceInfo (lastModificationDate, lastReadDate, processId, processInstanceByteArray, startDate, state, OPTLOCK, InstanceId) values (?, ?, ?, ?, ?, ?, ?, ?)


11:48:45,371 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into VariableInstanceLog (log_date, processId, processInstanceId, value, variableId, variableInstanceId, id) values (?, ?, ?, ?, ?, ?, ?)


11:48:45,371 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into VariableInstanceLog (log_date, processId, processInstanceId, value, variableId, variableInstanceId, id) values (?, ?, ?, ?, ?, ?, ?)


11:48:45,386 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into VariableInstanceLog (log_date, processId, processInstanceId, value, variableId, variableInstanceId, id) values (?, ?, ?, ?, ?, ?, ?)


11:48:45,386 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into VariableInstanceLog (log_date, processId, processInstanceId, value, variableId, variableInstanceId, id) values (?, ?, ?, ?, ?, ?, ?)


11:48:45,386 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into VariableInstanceLog (log_date, processId, processInstanceId, value, variableId, variableInstanceId, id) values (?, ?, ?, ?, ?, ?, ?)


11:48:45,386 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into VariableInstanceLog (log_date, processId, processInstanceId, value, variableId, variableInstanceId, id) values (?, ?, ?, ?, ?, ?, ?)


11:48:45,402 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into ProcessInstanceLog (end_date, processId, processInstanceId, start_date, id) values (?, ?, ?, ?, ?)


11:48:45,402 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into NodeInstanceLog (log_date, nodeId, nodeInstanceId, nodeName, processId, processInstanceId, type, id) values (?, ?, ?, ?, ?, ?, ?, ?)


11:48:45,402 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into NodeInstanceLog (log_date, nodeId, nodeInstanceId, nodeName, processId, processInstanceId, type, id) values (?, ?, ?, ?, ?, ?, ?, ?)


11:48:45,402 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into NodeInstanceLog (log_date, nodeId, nodeInstanceId, nodeName, processId, processInstanceId, type, id) values (?, ?, ?, ?, ?, ?, ?, ?)


*11:48:45,418 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: insert into WorkItemInfo (creationDate, name, processInstanceId, state, OPTLOCK, workItemByteArray, workItemId) values (?, ?, ?, ?, ?, ?, ?)*


11:48:45,418 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: update ProcessInstanceInfo set lastModificationDate=?, lastReadDate=?, processId=?, processInstanceByteArray=?, startDate=?, state=?, OPTLOCK=? where InstanceId=? and OPTLOCK=?


*11:48:45,418 INFO  [stdout] (http--0.0.0.0-8080-4) Hibernate: update WorkItemInfo set creationDate=?, name=?, processInstanceId=?, state=?, OPTLOCK=?, workItemByteArray=? where workItemId=? and OPTLOCK=?*


11:48:45,433 INFO  [stdout] (http--0.0.0.0-8080-4) Process started ... sessionId = 35 processId = 818


11:48:45,433 INFO  [stdout] (http--0.0.0.0-8080-4) Sleeping for 15 seconds


11:48:47,353 INFO  [stdout] (Thread-69) i = 1


11:48:49,366 INFO  [stdout] (Thread-69) i = 2


11:48:51,363 INFO  [stdout] (Thread-69) i = 3


11:48:53,361 INFO  [stdout] (Thread-69) i = 4


11:48:55,358 INFO  [stdout] (Thread-69) i = 5


11:48:57,355 INFO  [stdout] (Thread-69) i = 6


11:48:59,353 INFO  [stdout] (Thread-69) i = 7


11:49:00,414 INFO  [stdout] (http--0.0.0.0-8080-4) Signaled event


11:49:01,350 INFO  [stdout] (Thread-69) i = 8


11:49:03,348 INFO  [stdout] (Thread-69) i = 9


11:49:05,361 INFO  [stdout] (Thread-69) ******** END SAVE-STATE SLEEP *************


11:49:05,361 INFO  [stdout] (Thread-69) Hibernate: select hibernate_sequence.nextval from dual


11:49:05,361 INFO  [stdout] (Thread-69) Hibernate: select hibernate_sequence.nextval from dual


11:49:05,361 INFO  [stdout] (Thread-69) ********** MESSAGE1 *************


11:49:05,376 INFO  [stdout] (Thread-69) Hello


11:49:05,376 INFO  [stdout] (Thread-69) Hibernate: select hibernate_sequence.nextval from dual


11:49:05,392 INFO  [stdout] (Thread-69) ********** END1 *************


11:49:05,392 INFO  [stdout] (Thread-69) Hibernate: select hibernate_sequence.nextval from dual


11:49:05,392 INFO  [stdout] (Thread-69) Hibernate: select hibernate_sequence.nextval from dual


11:49:05,392 INFO  [stdout] (Thread-69) Hibernate: select WORKITEMINFO_ID_SEQ.nextval from dual


11:49:05,392 INFO  [stdout] (Thread-69) ******** START SAVE-STATE SLEEP *************


11:49:05,392 INFO  [stdout] (Thread-69) ******** END SAVE-STATE *************


11:49:05,408 INFO  [stdout] (Thread-70) i = 0


11:49:07,405 INFO  [stdout] (Thread-70) i = 1


11:49:09,402 INFO  [stdout] (Thread-70) i = 2


11:49:11,400 INFO  [stdout] (Thread-70) i = 3


11:49:13,397 INFO  [stdout] (Thread-70) i = 4


11:49:15,395 INFO  [stdout] (Thread-70) i = 5


11:49:17,392 INFO  [stdout] (Thread-70) i = 6


11:49:19,390 INFO  [stdout] (Thread-70) i = 7


11:49:21,403 INFO  [stdout] (Thread-70) i = 8


11:49:23,400 INFO  [stdout] (Thread-70) i = 9


11:49:25,397 INFO  [stdout] (Thread-70) ******** END SAVE-STATE SLEEP *************


11:49:25,397 INFO  [stdout] (Thread-70) Hibernate: select hibernate_sequence.nextval from dual


11:49:25,397 INFO  [stdout] (Thread-70) Hibernate: select hibernate_sequence.nextval from dual


11:49:25,397 INFO  [stdout] (Thread-70) ********** MESSAGE2 *************


11:49:25,413 INFO  [stdout] (Thread-70) Hello World


11:49:25,413 INFO  [stdout] (Thread-70) ********** END2 *************


11:49:25,413 INFO  [stdout] (Thread-70) Hibernate: select hibernate_sequence.nextval from dual


11:49:25,413 INFO  [stdout] (Thread-70) Hibernate: select hibernate_sequence.nextval from dual


11:49:25,413 INFO  [stdout] (Thread-70) Hibernate: select hibernate_sequence.nextval from dual


11:49:25,429 INFO  [stdout] (Thread-70) Hibernate: select processins0_.id as id57_, processins0_.end_date as end2_57_, processins0_.processId as processId57_, processins0_.processInstanceId as processI4_57_, processins0_.start_date as start5_57_ from ProcessInstanceLog processins0_ where processins0_.processInstanceId=? and (processins0_.end_date is null)


11:49:25,444 INFO  [stdout] (Thread-70) Hibernate: select processins0_.InstanceId as col_0_0_ from ProcessInstanceInfo processins0_ inner join EventTypes eventtypes1_ on processins0_.InstanceId=eventtypes1_.InstanceId where eventtypes1_.element=?

*
*
--------------------------------------------------------------

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

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/20120127/208d7a27/attachment-0001.html 


More information about the jboss-user mailing list