jbpm的子流程发布与删除

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即可.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值