Activiti手動執行的應用(UserTask)


工作流模擬某公司請假流程情景如下:
   1.開發人員請假流程,如果開發人員請假,如果請假天數小於3天,組長批准,人事批准即可請假。
   2.如果請假大約三天,需要項目經理或者產品經理批准,並且項目總監批准

 

流程圖:

 

 

流程配置:

<?xml version="1.0" encoding="UTF-8"?>  
<definitions xmlns="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"> <process id="UserExecuteTask" name="UserExecuteTask"> <startEvent id="startevent1" name="Start"></startEvent> <parallelGateway id="parallelgateway1" name="多種請假方式"></parallelGateway> <userTask id="servicetask1" name="項目經理同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener"/> </extensionElements> </userTask> <userTask id="servicetask2" name="產品經理同意"> <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener"/> </extensionElements> </userTask> <userTask id="servicetask3" name="項目組長同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener"/> </extensionElements> </userTask> <parallelGateway id="parallelgateway2" name="First Join"></parallelGateway> <userTask id="servicetask4" name="項目總監同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener"/> </extensionElements> </userTask> <parallelGateway id="parallelgateway3" name="人事判斷"></parallelGateway> <userTask id="servicetask5" name="人事部門同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.HumanResouceUserTaskListener"/> </extensionElements> </userTask> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="parallelgateway1"></sequenceFlow> <sequenceFlow id="flow2" name="" sourceRef="parallelgateway1" targetRef="servicetask1"></sequenceFlow> <sequenceFlow id="flow3" name="" sourceRef="parallelgateway1" targetRef="servicetask2"></sequenceFlow> <sequenceFlow id="flow4" name="" sourceRef="parallelgateway1" targetRef="servicetask3"></sequenceFlow> <sequenceFlow id="flow5" name="" sourceRef="servicetask1" targetRef="parallelgateway2"></sequenceFlow> <sequenceFlow id="flow6" name="" sourceRef="servicetask2" targetRef="parallelgateway2"></sequenceFlow> <sequenceFlow id="flow7" name="" sourceRef="servicetask3" targetRef="parallelgateway3"></sequenceFlow> <sequenceFlow id="flow8" name="" sourceRef="parallelgateway2" targetRef="servicetask4"></sequenceFlow> <sequenceFlow id="flow9" name="" sourceRef="servicetask4" targetRef="parallelgateway3"></sequenceFlow> <sequenceFlow id="flow10" name="" sourceRef="parallelgateway3" targetRef="servicetask5"></sequenceFlow> <sequenceFlow id="flow11" name="" sourceRef="servicetask5" targetRef="endevent1"></sequenceFlow> </process> </definitions>

流程實現:

package com.easyway.workflow.activiti.gateway;  
  
  
import java.util.logging.Logger;  
/** 
 * execute方法的參數DelegateExecution execution可以在流程中各個結點之間傳遞流程變量。  
 * <activiti:taskListener>元素的event屬性,它一共包含三種事件:"create"、"assignment"、"complete",分別表示結點執行處理邏輯的時機為:
在處理類實例化時、在結點處理邏輯被指派時、在結點處理邏輯執行完成時,可以根據自己的需要進行指定。 *上述流程定義中,4個任務結點對應的處理類 * *<activiti:taskListener>元素的event屬性,它一共包含三種事件:"create"、"assignment"、"complete",分別表示結點執行處理邏輯的時機為:
在處理類實例化時、在結點處理邏輯被指派時、在結點處理邏輯執行完成時,可以根據自己的需要進行指定。 * *<userTask id="servicetask2" name="產品經理同意"> <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener"/> </extensionElements> </userTask> * * * 項目經理審批過程 *
@author longgangbai * * * 2011-12-17 下午07:45:47 */ public class DeveloperManagerUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(DeveloperManagerUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask delegateTask) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + delegateTask.getVariables()); delegateTask.setVariable("項目經理", "請假天數大約3天,同意請假。"); log.info("項目經理,請假天數大約3天,同意請假。."); } }

 

package com.easyway.workflow.activiti.gateway;  
  
  
import java.util.logging.Logger;  
/** 
  * execute方法的參數DelegateExecution execution可以在流程中各個結點之間傳遞流程變量。  
 * 
 *<activiti:taskListener>元素的event屬性,它一共包含三種事件:"create"、"assignment"、"complete",分別表示結點執行處理邏輯的時機為:
在處理類實例化時、在結點處理邏輯被指派時、在結點處理邏輯執行完成時,可以根據自己的需要進行指定。 * <userTask id="servicetask5" name="人事部門同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.HumanResouceUserTaskListener"/> </extensionElements> </userTask> * 人事部門審批過程 *
@author longgangbai * * 2011-12-17 下午07:45:47 */ public class HumanResouceUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(HumanResouceUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask delegateTask) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + delegateTask.getVariables()); delegateTask.setVariable("人事部門", "請假天數大約3天,同意請假。"); log.info("人事部門 ,請假天數大約3天,同意請假。"); } }

 

package com.easyway.workflow.activiti.gateway;  
  
  
import java.util.logging.Logger;  
/** 
 *  execute方法的參數DelegateExecution execution可以在流程中各個結點之間傳遞流程變量。  
 *   
 *  <activiti:taskListener>元素的event屬性,它一共包含三種事件:"create"、"assignment"、"complete",分別表示結點執行處理邏輯的時機為:
在處理類實例化時、在結點處理邏輯被指派時、在結點處理邏輯執行完成時,可以根據自己的需要進行指定。 * 配置如下 * <userTask id="servicetask4" name="項目總監同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener"/> </extensionElements> </userTask> * * * 項目總監審批過程 *
@author longgangbai * * 2011-12-17 下午07:45:47 */ public class ProductBossUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(ProductBossUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask execution) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + execution.getVariables()); execution.setVariable("項目總監", "請假天數大約3天,同意請假。"); log.info("項目總監,請假天數大約3天,同意請假。"); } }
package com.easyway.workflow.activiti.gateway;  
  
  
import java.util.logging.Logger;  
/** 
  * execute方法的參數DelegateExecution execution可以在流程中各個結點之間傳遞流程變量。 
  *  
  * <activiti:taskListener>元素的event屬性,它一共包含三種事件:"create"、"assignment"、"complete",分別表示結點執行處理邏輯的時機為:
在處理類實例化時、在結點處理邏輯被指派時、在結點處理邏輯執行完成時,可以根據自己的需要進行指定。 * * 配置如下 * <userTask id="servicetask1" name="項目經理同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener"/> </extensionElements> </userTask> * 產品經理審批過程 *
@author longgangbai * * 2011-12-17 下午07:45:47 */ public class ProductManagerUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(ProductManagerUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask execution) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + execution.getVariables()); execution.setVariable("產品經理", "請假天數大約3天,同意請假。"); log.info("產品經理,請假天數大約3天,同意請假。"); } }
package com.easyway.workflow.activiti.gateway;  
  
  
import java.util.logging.Logger;  
/** 
 *  
 *  
 * <activiti:taskListener>元素的event屬性,它一共包含三種事件:"create"、"assignment"、"complete",分別表示結點執行處理邏輯的時機為:
在處理類實例化時、在結點處理邏輯被指派時、在結點處理邏輯執行完成時,可以根據自己的需要進行指定。 * * * 配置如下: * <userTask id="servicetask3" name="項目組長同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener"/> </extensionElements> </userTask> * 項目組長批准請假 * 模擬當開發人員請假小於3天,組長比准 *
@author longgangbai * * 2011-12-17 上午09:07:37 */ public class TeamLeaderUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(TeamLeaderUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask execution) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + execution.getVariables()); execution.setVariable("項目組長", "請假天數小於3天,同意請假。"); log.info("項目組長,請假天數小於3天,同意請假。"); } }
package com.easyway.workflow.activiti.gateway;  
  
  
import junit.framework.TestCase;  
/** 
 * 主要是在測試之前做一些初始化工作,主要包括流程引擎實例 
 * 的構建,及其流程提供的基本服務。 
 * 目的:讓開發者熟悉工作流使用過程使用的幾個步驟 
 * 1.加載相關的工作流全局配置文件activiti.cfg.xml配置文件信息 
 * 2.獲取工作流相關的服務(RepositoryService,RuntimeService, 
 *    TaskService,HistoryService,FormService,ManagementService, 
 *    IdentityService等) 
 * 2.加載工作流文件*.bpmn20.xml信息 
 *  
 * 3.部署工作流 
 *    部署工作流由多種方式,在以后會相繼講解 
 *  
 * @author longgangbai 
 *  
 * 2011-12-17  下午07:48:59 
 */  
public abstract class AbstractTest extends TestCase {  
  
    private ProcessEngine processEngine;  
    protected String deploymentId;  
    protected RepositoryService repositoryService;  
    protected RuntimeService runtimeService;  
    protected TaskService taskService;  
    protected FormService formService;  
    protected HistoryService historyService;  
    protected IdentityService identityService;  
    protected ManagementService managementService;  
      
      
    /** 
     * 測試用例開始初始化工作 
     * 1.創建相關的工作流程對象ProcessEngine 
     * 2.創建相關的服務 
     * 3. 
     */  
    @Override  
    protected void setUp() throws Exception {  
        super.setUp();  
        //由於ProcessEngine為線程安全性對象,整個項目可以共用一個  
        if(processEngine==null) {  
            //此處使用此種方法調用的activiti的配置文件為 classpath路徑下的activiti.cfg.xml  
            //采用的H2的數據庫  
            processEngine = ProcessEngines.getDefaultProcessEngine();  
        }  
        //獲取工作流的各種服務信息  
        repositoryService = processEngine.getRepositoryService();  
        runtimeService = processEngine.getRuntimeService();  
        taskService = processEngine.getTaskService();  
        formService = processEngine.getFormService();  
        historyService = processEngine.getHistoryService();  
        identityService = processEngine.getIdentityService();  
        managementService = processEngine.getManagementService();  
        //調用擴展的初始化工作  
        initialize();  
          
    }  
      
    /** 
     * test銷毀方法 
     */  
    @Override  
    protected void tearDown() throws Exception {  
        super.tearDown();  
        destroy();  
    }  
      
    /** 
     * 便於子類的工作的初始化的擴展工作 
     *  
     *  
     * @throws Exception 
     */  
    protected abstract void initialize() throws Exception;  
    /** 
     * 便於子類的工作的銷毀的擴展工作 
     *  
     * @throws Exception 
     */  
    protected abstract void destroy() throws Exception;  
}  
/** 
package com.easyway.workflow.activiti.gateway; 
import java.util.Date; 
/** 
 * 測試實例如下 
 *  
 * @author longgangbai 
 *  
 * 2011-12-18  上午12:00:03 
 */  
public class ParallelGatewayTest extends AbstractTest {   
    private String deploymentId;   
    private Date start = null;   
    private Date end = null;   
  
    @Override   
    protected void initialize() throws Exception {   
        deploymentId = repositoryService.createDeployment()   
        .addClasspathResource("diagrams/UserExecuteTask.bpmn20.xml")   
        .deploy().getId();   
    }   
  
    @Override   
    protected void destroy() throws Exception {   
            repositoryService.deleteDeployment(deploymentId, true);   
    }   
  
    @Deployment   
    public void testUnbalancedForkJoin() {   
        //獲取流程實例對象  
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("UserExecuteTask");   
        //獲取任務服務對象的查詢  
        TaskQuery query = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc();   
       //獲取所有的任務  
        List<Task> tasks = query.list();   
        assertEquals(3, tasks.size());   
        start = new Date();   
         
        for(Task task : tasks) {  
            //執行任務  
            taskService.complete(task.getId());  
            System.out.println("name =+"+task.getName());  
            end = new Date();   
            System.out.println("" + (end.getTime()-start.getTime()) + "ms.");   
        }   
        //查詢任務  
        tasks = query.list();   
        assertEquals(1, tasks.size());   
        for(Task task : tasks) {   
            taskService.complete(task.getId());   
            System.out.println("name =+"+task.getName());  
            end = new Date();   
            System.out.println("" + (end.getTime()-start.getTime()) + "ms.");   
        }   
        end = new Date();   
        System.out.println("" + (end.getTime()-start.getTime()) + "ms.");   
    }   
}  

 運行結果:

2011-12-18 13:15:29 org.activiti.engine.ProcessEngines initProcessEnginFromResource  
信息: initializing process engine for resource jar:file:/C:/activiti-rest/activiti-cfg.jar!/activiti.cfg.xml  
2011-12-18 13:15:32 org.activiti.engine.impl.ProcessEngineImpl <init>  
信息: ProcessEngine default created  
2011-12-18 13:15:32 org.activiti.engine.ProcessEngines initProcessEnginFromResource  
信息: initialised process engine default  
2011-12-18 13:15:32 org.activiti.engine.impl.jobexecutor.JobAcquisitionThread run  
信息: JobAcquisitionThread starting to acquire jobs  
2011-12-18 13:15:32 org.activiti.engine.impl.bpmn.deployer.BpmnDeployer deploy  
信息: Processing resource diagrams/UserExecuteTask.bpmn20.xml  
2011-12-18 13:15:33 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes  
信息: XMLSchema currently not supported as typeLanguage  
2011-12-18 13:15:33 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes  
信息: XPath currently not supported as expressionLanguage  
2011-12-18 13:15:43 com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener notify  
信息: variavles={}  
2011-12-18 13:15:43 com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener notify  
信息: 產品經理,請假天數大約3天,同意請假。  
name =+產品經理同意  
10094ms.  
2011-12-18 13:15:53 com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener notify  
信息: variavles={產品經理=請假天數大約3天,同意請假。}  
2011-12-18 13:15:53 com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener notify  
信息: 項目組長,請假天數小於3天,同意請假。  
name =+項目組長同意  
20172ms.  
2011-12-18 13:16:03 com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener notify  
信息: variavles={項目組長=請假天數小於3天,同意請假。, 產品經理=請假天數大約3天,同意請假。}  
2011-12-18 13:16:03 com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener notify  
信息: 項目經理,請假天數大約3天,同意請假。.  
name =+項目經理同意  
30313ms.  
2011-12-18 13:16:13 com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener notify  
信息: variavles={項目組長=請假天數小於3天,同意請假。, 項目經理=請假天數大約3天,同意請假。, 產品經理=請假天數大約3天,同意請假。}  
2011-12-18 13:16:13 com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener notify  
信息: 項目總監,請假天數大約3天,同意請假。  
name =+項目總監同意  
40485ms.  
40485ms.  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM