activiti5.21中調用活動(callactivity),在多實例(multi-instance)情況下,子流程無法返回值到主流程

在業務場景中,如果需要調用其他流程,我們可以使用callactivity,通過activiti:in,我們可以將主流程的參數傳遞給子流程,通過activiti:out可以將子流程執行結束後的參數返回給主流程,在單實例情況下,是沒有問題的。

但是,當我們調用的子流程數量是不定的,且每個子流程都不一樣時,我們可以通過設置調用活動爲multi-instance,將子流程運行時動態傳遞給工作流引擎,如下:

<callActivity id="call" name="子流程調用" calledElement="${subprocess}">
<extensionElements>
<activiti:in source="businessId" target="businessId"/>
<activiti:in source="businessTable" target="businessTable"/>
<activiti:out source="cancelled" target="cancelled"/>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${subprocesslist}" activiti:elementVariable="subprocess">
<completionCondition>${cancelled=='1'}</completionCondition>
</multiInstanceLoopCharacteristics>
</callActivity>

這種情況下,activiti:in依然可以傳遞參數給子流程,但是activiti:out無法返回子流程的值給主流程,
org.activiti.engine.impl.bpmn.behavior.CallActivityBehavior中,單實例情形中,流程完成前會將子流程的變量傳遞給父流程
  public void completing(DelegateExecution execution, DelegateExecution subProcessInstance) throws Exception {
    // only data.  no control flow available on this execution.

    // copy process variables
    for (AbstractDataAssociation dataOutputAssociation : dataOutputAssociations) {
      Object value = null;
      if (dataOutputAssociation.getSourceExpression()!=null) {
        value = dataOutputAssociation.getSourceExpression().getValue(subProcessInstance);
      }
      else {
        value = subProcessInstance.getVariable(dataOutputAssociation.getSource());
      }
      
      execution.setVariable(dataOutputAssociation.getTarget(), value);
    }
  }

org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior中,多實例情形中,流程完成前直接忽略了子流程變量的處理,所以activiti:out中得不到值
  // required for supporting external subprocesses
  public void completing(DelegateExecution execution, DelegateExecution subProcessInstance) throws Exception {
  }

解決方案:
MultiInstanceActivityBehavior類複製一份到項目中,補充comleting方法:
調用CallActivityBehavior的completing方法,完成變量的傳遞。

下載MultiInstanceActivityBehavior類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章