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"
typeLanguage="http://www.java.com/javaTypes"
expressionLanguage="http://www.mvel.org/2.0"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:g="http://www.jboss.org/drools/flow/gpd"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:tns="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" >
<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" >
<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=?