Please find following code
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="http://jbpm.org/3/jpdl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jbpm.org/3/jpdl http://jbpm.org/xsd/jpdl-3.0.xsd "
name="simple">
<start-state name="start">
<transition name="toCheckDSCR" to="Check DSCR">
<action name="Read DSC Ratio" class="com.sample.action.FirstActionHandler"></action>
</transition>
</start-state>
<end-state name="end">
</end-state>
<decision name="Check DSCR">
<transition name="toReadLoansData" to="Read Loans Data">
<condition>
executionContext.getVariable("DSCRatio").intValue() > 0
</condition>
</transition>
<transition name="toRejectLoan" to="Reject Loan">
<condition>
executionContext.getVariable("DSCRatio").intValue() == 0
</condition>
</transition>
</decision>
<task-node name="Reject Loan">
<transition name="toEndFromRejectLoan" to="end">
<action name="action1" class="com.sample.action.LoanRejectHandler"></action>
</transition>
</task-node>
<state name="Read Loans Data">
<transition name="toProcessLoanDecision" to="Process Loan Decision">
<action name="action1" class="com.sample.action.DatabaseActionHandler"></action>
</transition>
</state>
<decision name="Process Loan Decision">
<transition name="toProcessLoan" to="Process Loan">
<condition>
executionContext.getVariable("LoanProcessingDecision").toString().equals("Yes")
</condition>
</transition>
<transition name="toEndFromProcessLoanDecision" to="end">
<condition>
executionContext.getVariable("LoanProcessingDecision").toString().equals("No")
</condition>
</transition>
</decision>
<task-node name="Process Loan">
<transition name="toEndFromProcessLoan" to="end">
<action name="action1" class="com.sample.action.ProcessLoanHandler"></action>
</transition>
</task-node>
</process-definition>
Code for Test class
package com.sample;
import java.io.FileReader;
import java.util.ArrayList;
import junit.framework.TestCase;
import org.jbpm.db.JbpmSession;
import org.jbpm.db.JbpmSessionFactory;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
import org.jbpm.jpdl.xml.JpdlXmlReader;
public class SimpleProcessTest extends TestCase {
static JbpmSessionFactory jbpmSessionFactory = JbpmSessionFactory.buildJbpmSessionFactory();
public void testSimpleProcess() throws Exception {
//saveProcessDefinition();
//saveProcessInstance();
readProcessInstance();
}
public void saveProcessInstance() {
// obtain a session
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
try {
ProcessDefinition loanProcess = jbpmSession.getGraphSession().findLatestProcessDefinition("simple");
// start a user managed transaction
jbpmSession.beginTransaction();
ProcessInstance loanInstance = new ProcessInstance(loanProcess);
loanInstance.signal();
// store the result in the database
jbpmSession.getGraphSession().saveProcessInstance(loanInstance);
// commit the user transaction
jbpmSession.getConnection().commit();
}
catch(Exception e)
{
e.printStackTrace();
}
finally {
// close the session.
jbpmSession.close();
}
}
public void readProcessInstance()
{
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
ProcessDefinition procDef = jbpmSession.getGraphSession().findLatestProcessDefinition("simple");
ArrayList arlProcInsts = (ArrayList) jbpmSession.getGraphSession().findProcessInstances(procDef.getId());
int count = arlProcInsts.size();
ProcessInstance procInst = null;
System.out.println(">>>>>> "+count + " >>>>>>> " + procDef);
for (int i = 0; i < count; i++)
{
procInst = (ProcessInstance) arlProcInsts.get(i);
System.out.println("Process Instance ID = " + procInst.getId());
System.out.println("Has Ended Value = " + procInst.hasEnded());
}
Token rootToken = procInst.getRootToken();
Token token = rootToken.findToken("Check DSCR/Read Loans Data");
System.out.println("token = " + token);
rootToken.signal("toReadLoansData");
procInst.signal();
jbpmSession.close();
}
public void saveProcessDefinition(){
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
try{
ProcessDefinition definition = new JpdlXmlReader(new FileReader("D:/TestProcess/src/process/simple.par/processdefinition.xml")).readProcessDefinition();
/* assertNotNull("Definition should not be null", definition);
// Create an instance of the process definition.*/
//ProcessInstance instance = new ProcessInstance(definition);
//*********************************************************************
//instance.signal();
jbpmSession.getGraphSession().saveProcessDefinition(definition);
jbpmSession.getConnection().commit();
}
catch(Exception e)
{
e.printStackTrace();
}
finally {
// close the session.
jbpmSession.close();
}
}
}
1. In 'saveProcessDefinition' method, I am reading the process definition XML from file system and store it to jBPM database.
2. In 'saveProcessInstance' method, the process definition is read from the database and instance is created. This instance is saved to database.
3. In 'readProcessInstance' the instance is read from database and executed further.
I am getting the error in step 3. But not sure that steps 1 and 2 above are correct and are not the root cause of error in step 3.
Please confirm that the code is correct. Saving the process definition in database must be the common task, are there any best practices defined to do such common tasks.
Thanks and Regards,
Nilesh