调用子流程
实现的子流程,示例如图所示:
对应的流程定义文件Subprocess.Check.bpmn20.xml,如下所示:
[xhtml]
< xml version="1.0" encoding="UTF-8" >
上面的流程定义,和通常定义流程的方式是相同的。流程中,对应的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结点对应的就是流程定义中的
[xhtml]
< xml version="1.0" encoding="UTF-8" >
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