jbpm的流程deploy方法之一是:
JbpmConfiguration.getInstance().createJbpmContext().deployProcessDefinition(processDefinition);
如果流程中涉及子流程的话,deploy需要注意先后顺序,否则父流程会找不到子流程.
发布流程遵循的顺序是先子后父
举例:
process
|--sub process
|--|--sub sub process
发布的顺序是:
1:deploy "sub sub process"
2:deploy "sub process"
3:deploy "process"
删除亦然.
流程实例结束后删除流程实例的方法之一是:
JbpmConfiguration.getInstance().createJbpmContext().getGraphSession().deleteProcessInstance(processInstance.getId());
如果流程涉及子流程的话,删除流程实例同样需要注意先后顺序,否则会报约束错误.
删除流程实例的顺序也是先子后父
举例:
processInstance
|--sub processInstance
|--|--sub sub processInstance
删除的顺序是:
1:delete "sub sub processInstance"
2:delete "sub processInstance"
3:delete "processInstance"
在存在子流程的情况下,如果子流程未结束,此时调用
JbpmConfiguration.getInstance().createJbpmContext().getGraphSession().deleteProcessInstance(rootProcessInstance.getId());
可以正常删除流程实例树.
如果子流程已结束,父流程尚未结束,此时调用该方法会报约束错误,主要原因是Token表中的SubProcessInstance_字段在流程运行中指向ProcessInstance表的id,而ProcessInstance表的RootToken字段指向本实例的根token,SuperProcessToken字段指向父Token;在子流程结束时,Token表中父流程的SubProcessInstance字段会自动清空,此时虽然可以根据ProcessInstance表中找到子流程的父Token,但是根据此父Token确找不到该已结束的子流程ProcessInstance,因此在删除时会出现约束错误.具体的代码分析如下:
deleteProcessInstance()方法的递归删除子流程部分内容在GraphSession.class的deleteSubProcesses()方法内,该方法的内容为:
void deleteSubProcesses(Token token) {
ProcessInstance subProcessInstance = token.getSubProcessInstance();
if (subProcessInstance!=null){
subProcessInstance.setSuperProcessToken(null);
token.setSubProcessInstance(null);
deleteProcessInstance(subProcessInstance);
}
if (token.getChildren()!=null) {
Iterator iter = token.getChildren().values().iterator();
while (iter.hasNext()) {
Token child = (Token) iter.next();
deleteSubProcesses(child);
}
}
}
上面提到,在子流程已结束的情况下父流程的Token中SubProcessInstance字段会被清空,此时token.getSubProcessInstance()为null,因此永远也删除不掉已完成的子流程,而在删除父流程Token的时候即会因为子流程尚未删除,而子流程的SuperProcessToken字段却指向父流程Token而出现约束错误.
解决方案就是先删除已完成的子流程,然后再删除rootProcessInstance即可.