当前位置:编程学习 > JAVA >>

Activiti 5.3:子流程(subProcess)

Activiti 5.3:子流程(subProcess)

Activiti 5.3提供了子流程的实现,包括两种基于子流程的实现:
一种是内嵌子流程:子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观;
另一种是调用子流程:首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用<callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。
 
内嵌子流程
实现的基于内嵌子流程的流程,示例如图所示:
 
对应的流程定义文件SubProcessTest.MySubprocess.bpmn20.xml,内容如下所示:
[java] 
<?xml version="1.0" encoding="UTF-8"?> 
<definitions id="definitions" 
    xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" 
    targetNamespace="Examples"> 
    <process id="MySubprocess" name="My Subprocess"> 
        <startEvent id="theStart" /> 
        <sequenceFlow id="flow1" sourceRef="theStart" targetRef="subProcess" /> 
         
        <subProcess id="subProcess"> 
            <startEvent id="subProcessStart" /> 
            <sequenceFlow id="flow2" sourceRef="subProcessStart" targetRef="subProcessFork" /> 
            <parallelGateway id="subProcessFork" /> 
            <sequenceFlow id="flow3" sourceRef="subProcessFork" targetRef="task1" /> 
            <sequenceFlow id="flow4" sourceRef="subProcessFork" targetRef="task2" /> 
            <userTask id="task1" name="Check bank" activiti:candidateGroups="engineering"> 
                <extensionElements> 
                    <activiti:taskListener event="complete" 
                        class="org.shirdrn.workflow.activiti.subprocess.CheckBankTask" /> 
                </extensionElements> 
            </userTask> 
            <sequenceFlow id="flow5" sourceRef="task1" targetRef="subProcessJoin" /> 
            <userTask id="task2" name="Investigate software" activiti:candidateGroups="engineering" > 
                <extensionElements> 
                    <activiti:taskListener event="complete" 
                        class="org.shirdrn.workflow.activiti.subprocess.CheckMerchantTask" /> 
                </extensionElements> 
            </userTask> 
            <sequenceFlow id="flow6" sourceRef="task2" targetRef="subProcessJoin" /> 
            <parallelGateway id="subProcessJoin" /> 
            <sequenceFlow id="flow7" sourceRef="subProcessJoin" targetRef="subProcessEnd" /> 
            <endEvent id="subProcessEnd" /> 
        </subProcess> 
 
        <sequenceFlow id="flow10" sourceRef="subProcess" targetRef="taskAfterSubProcess" /> 
        <userTask id="taskAfterSubProcess" name="Collect message" activiti:candidateGroups="engineering" > 
            <extensionElements> 
                    <activiti:taskListener event="complete" 
                        class="org.shirdrn.workflow.activiti.subprocess.CollectMessageTask" /> 
            </extensionElements> 
        </userTask> 
        <sequenceFlow id="flow11" sourceRef="taskAfterSubProcess" targetRef="theEnd" /> 
        <endEvent id="theEnd" /> 
    </process> 
 
</definitions> 
流程定义中,实现了3个TaskListener,对应的代码分别如下所示:
[java] 
package org.shirdrn.workflow.activiti.subprocess; 
 
import java.util.HashMap; 
import java.util.logging.Logger; 
 
import org.activiti.engine.delegate.DelegateTask; 
import org.activiti.engine.impl.pvm.delegate.TaskListener; 
 
public class CheckBankTask implements TaskListener { 
 
    private final Logger log = Logger.getLogger(CheckBankTask.class.getName()); 
     
    @SuppressWarnings("unchecked") 
    public void notify(DelegateTask delegateTask) { 
        log.info("i am CheckBankTask."); 
        System.out.println("in : " + delegateTask.getVariables()); 
        ((HashMap<String, Object>)delegateTask.getVariables().get("in")).put("next", "CheckBankTask"); 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,