`

activiti5.21中调用活动(callactivity),在多实例(multi-instance)情况下,子流程无法返回值到主流程

阅读更多

原文地址:http://blog.csdn.net/xxhhbb1538/article/details/53116793

 

在业务场景中,如果需要调用其他流程,我们可以使用callactivity,通过activiti:in,我们可以将主流程的参数传递给子流程,通过activiti:out可以将子流程执行结束后的参数返回给主流程,在单实例情况下,是没有问题的。

但是,当我们调用的子流程数量是不定的,且每个子流程都不一样时,我们可以通过设置调用活动为multi-instance,将子流程运行时动态传递给工作流引擎,如下:

 

[html] view plain copy
 
  1. <callActivity id="call" name="子流程调用" calledElement="${subprocess}">  
  2. <extensionElements>  
  3. <activiti:in source="businessId" target="businessId"/>  
  4. <activiti:in source="businessTable" target="businessTable"/>  
  5. <activiti:out source="cancelled" target="cancelled"/>  
  6. </extensionElements>  
  7. <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${subprocesslist}" activiti:elementVariable="subprocess">  
  8. <completionCondition>${cancelled=='1'}</completionCondition>  
  9. </multiInstanceLoopCharacteristics>  
  10. </callActivity>  

这种情况下,activiti:in依然可以传递参数给子流程,但是activiti:out无法返回子流程的值给主流程,
org.activiti.engine.impl.bpmn.behavior.CallActivityBehavior中,单实例情形中,流程完成前会将子流程的变量传递给父流程
[java] view plain copy
 
  1. public void completing(DelegateExecution execution, DelegateExecution subProcessInstance) throws Exception {  
  2.   // only data.  no control flow available on this execution.  
  3.   
  4.   // copy process variables  
  5.   for (AbstractDataAssociation dataOutputAssociation : dataOutputAssociations) {  
  6.     Object value = null;  
  7.     if (dataOutputAssociation.getSourceExpression()!=null) {  
  8.       value = dataOutputAssociation.getSourceExpression().getValue(subProcessInstance);  
  9.     }  
  10.     else {  
  11.       value = subProcessInstance.getVariable(dataOutputAssociation.getSource());  
  12.     }  
  13.       
  14.     execution.setVariable(dataOutputAssociation.getTarget(), value);  
  15.   }  
  16. }  
org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior中,多实例情形中,流程完成前直接忽略了子流程变量的处理,所以activiti:out中得不到值
[java] view plain copy
 
  1. // required for supporting external subprocesses  
  2. public void completing(DelegateExecution execution, DelegateExecution subProcessInstance) throws Exception {  
  3. }  

解决方案:
MultiInstanceActivityBehavior类复制一份到项目中,补充comleting方法:
调用CallActivityBehavior的completing方法,完成变量的传递。

下载MultiInstanceActivityBehavior类

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics