Activiti 5.3:子流程(subProcess)(四)

2014-11-24 09:46:27 · 作者: · 浏览: 9



调用子流程
实现的子流程,示例如图所示:

对应的流程定义文件Subprocess.Check.bpmn20.xml,如下所示:
[xhtml]
< xml version="1.0" encoding="UTF-8" >
http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">








上面的流程定义,和通常定义流程的方式是相同的。流程中,对应的JavaDelegate的实现类,代码如下所示:
[java]
package org.shirdrn.workflow.activiti.subprocess;

import java.util.logging.Logger;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

public class BusinessCheck implements JavaDelegate {

private static final Logger log = Logger.getLogger(BusinessCheck.class.getName());

@Override
public void execute(DelegateExecution execution) throws Exception {
// varOutFromMainprocess<->varInSubprocess
String varInSubprocess = (String)execution.getVariable("varInSubprocess");
log.info("in subprocess get(varInSubprocess): " + varInSubprocess);

log.info("variavles=" + execution.getVariables());
execution.setVariable("s:bc", "Subprocess:BusinessCheck");
log.info("I am BusinessCheck in subprocess.");

execution.setVariable("varInSubprocess", "BBBB");
log.info("in subprocess set(varInSubprocess): " + varInSubprocess);
}
}
该BusinessCheck类简单用来校验用户数据。
下面看一下主流程,如图所示:

上面的callSubprocess结点对应的就是流程定义中的元素,调用了外部流程。对应的流程定义文件Subprocess.Mainprocess.bpmn20.xml,如下所示:
[xhtml]
< xml version="1.0" encoding="UTF-8" >
http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">

















需要说明的是,对于主流程与子流程之间进行数据交换,需要在元素中进行配置,通过执行“传入”、“传出”变量的方式来进行。片段如下所示:
[xhtml]






我们可以通过在主流程中设置一个变量为varOutFromMainprocess,并指定对应的输入数据,根据流程定义,会将变量varOutFromMainprocess对应的值,传递给子流程中的变量varInSubprocess,只需要在子流程中获取变量varInSubprocess的值即可。从子流程中传出数据的道理是类似的。上面实现了2个JavaDelegate处理类,代码分别如下所示:
[java]
package org.shirdrn.workflow.activiti.subprocess;

import java.util.logging.Logger;

public class Initialization implements JavaDelegate {

private static final Logger log = Logger.getLogger(Initialization.class.getName());

@Override
public void execute(DelegateExecution execution) throws Exception {
log.info("variavles=" + execution.getVariables());
execution.setVariable("m:i", "Mainprocess:Initialization");
log.info("I am Initialization in mainprocess.");

execution.setVariable("varOutFromMainprocess", "AAAA");
log.info("in mainprocess set(varOutFromMainprocess): " + execution.getVariable("varOutFromMainprocess"));
}
}
[java] view plaincopy
package org.shirdrn.workflow.activiti.subprocess;

import java.util.logging.Logger;

public class DoTransaction implements JavaDelegate {

private static final Logger log = Logger.getLogger(DoTransaction.class.getName());

@Override