工作流模擬某公司請假流程情景如下:
1.開發人員請假流程,如果開發人員請假,如果請假天數小於3天,組長批准,人事批准即可請假。
2.如果請假大約三天,需要項目經理或者產品經理批准,並且項目總監批准
流程圖:
流程配置:
流程實現:
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="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."); } }
運行結果: