工作流Activiti的学习总结(八)Activiti自动执行的应用

来源:互联网 发布:java哪些字符需要转义 编辑:程序博客网 时间:2024/05/16 12:39

  工作流activiti自动执行任务的开发应用 

工作流模拟某公司请假流程情景如下:
   1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假。
   2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监批准
   
 模拟自动审批:

    只需要启动一个流程实例,它会自动执行到结束。这种情况下,你不需要关注流
   程的执行进度,而只需要把精力集中在每个结点的处理逻辑(通常是简单或者复杂的商业逻辑)上。

 

流程设计图如下:

 

 

 

 

流程配置文件AutoExecuteTask.bpmn20.xml如下:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.  <process id="AutoExecuteTask" name="AutoExecuteTask">  
  4.     <startEvent id="startevent1" name="Start"></startEvent>  
  5.     <parallelGateway id="parallelgateway1" name="多种请假方式"></parallelGateway>  
  6.     <serviceTask id="servicetask1" name="项目经理同意" activiti:class="com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask"></serviceTask>  
  7.     <serviceTask id="servicetask2" name="产品经理同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductManagerServiceTask"></serviceTask>  
  8.     <serviceTask id="servicetask3" name="项目组长同意" activiti:class="com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask"></serviceTask>  
  9.     <parallelGateway id="parallelgateway2" name="First Join"></parallelGateway>  
  10.     <serviceTask id="servicetask4" name="项目总监同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductBossServiceTask"></serviceTask>  
  11.     <parallelGateway id="parallelgateway3" name="人事判断"></parallelGateway>  
  12.     <serviceTask id="servicetask5" name="人事部门同意" activiti:class="com.easyway.workflow.activiti.gateway.HumanResouceServiceTask"></serviceTask>  
  13.     <endEvent id="endevent1" name="End"></endEvent>  
  14.     <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="parallelgateway1"></sequenceFlow>  
  15.     <sequenceFlow id="flow2" name="" sourceRef="parallelgateway1" targetRef="servicetask1"></sequenceFlow>  
  16.     <sequenceFlow id="flow3" name="" sourceRef="parallelgateway1" targetRef="servicetask2"></sequenceFlow>  
  17.     <sequenceFlow id="flow4" name="" sourceRef="parallelgateway1" targetRef="servicetask3"></sequenceFlow>  
  18.     <sequenceFlow id="flow5" name="" sourceRef="servicetask1" targetRef="parallelgateway2"></sequenceFlow>  
  19.     <sequenceFlow id="flow6" name="" sourceRef="servicetask2" targetRef="parallelgateway2"></sequenceFlow>  
  20.     <sequenceFlow id="flow7" name="" sourceRef="servicetask3" targetRef="parallelgateway3"></sequenceFlow>  
  21.     <sequenceFlow id="flow8" name="" sourceRef="parallelgateway2" targetRef="servicetask4"></sequenceFlow>  
  22.     <sequenceFlow id="flow9" name="" sourceRef="servicetask4" targetRef="parallelgateway3"></sequenceFlow>  
  23.     <sequenceFlow id="flow10" name="" sourceRef="parallelgateway3" targetRef="servicetask5"></sequenceFlow>  
  24.     <sequenceFlow id="flow11" name="" sourceRef="servicetask5" targetRef="endevent1"></sequenceFlow>  
  25.   </process>  
  26.     
  27.     
  28. </definitions>  

 

 

 

 

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import java.util.logging.Logger;  
  5. /** 
  6.  * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。  
  7.  *通过基于Activiti 5.6的<parallelGateway>、<serviceTask>、<receiveTask>、<userTask>元素。 
  8.  * 
  9.  *自动执行  
  10. <serviceTask>元素,可以实现自动活动,语法如下所示:  
  11. <serviceTask id="serviceTaskId" name="serviceTaskName"  
  12. activiti:class="org.shirdrn.workflow.activiti.gateway.ServiceTaskClass"/>  
  13. 其中,activiti:class属性为该结点对应的处理类,该类要求实现org.activiti.engine.delegate.JavaDelegate接口 
  14.  * 
  15.  * <serviceTask id="servicetask1" name="项目经理同意" activiti:class="com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask"></serviceTask> 
  16.      
  17.  * 项目经理审批过程 
  18.  * @author longgangbai 
  19.  *  
  20.  *  
  21.  * 2011-12-17  下午07:45:47 
  22.  */  
  23. public class DeveloperManagerServiceTask implements JavaDelegate {  
  24.   
  25.     private final Logger log = Logger.getLogger(DeveloperManagerServiceTask.class.getName());  
  26.   
  27.     @Override  
  28.     public void execute(DelegateExecution execution) throws Exception {  
  29.         Thread.sleep(10000);  
  30.         log.info("variavles=" + execution.getVariables());  
  31.         execution.setVariable("项目经理""请假天数大约3天,同意请假。");  
  32.         log.info("项目经理,请假天数大约3天,同意请假。.");         
  33.     }  
  34. }  

 

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import java.util.logging.Logger;  
  5. /** 
  6.   * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。  
  7.  * 
  8.  * 
  9.  * <serviceTask id="servicetask2" name="产品经理同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductManagerServiceTask"></serviceTask> 
  10.     
  11.  * 产品经理审批过程 
  12.  * @author longgangbai 
  13.  *  
  14.  * 2011-12-17  下午07:45:47 
  15.  */  
  16. public class ProductManagerServiceTask implements JavaDelegate {  
  17.   
  18.     private final Logger log = Logger.getLogger(ProductManagerServiceTask.class.getName());  
  19.   
  20.     @Override  
  21.     public void execute(DelegateExecution execution) throws Exception {  
  22.         Thread.sleep(10000);  
  23.         log.info("variavles=" + execution.getVariables());  
  24.         execution.setVariable("产品经理""请假天数大约3天,同意请假。");  
  25.         log.info("产品经理,请假天数大约3天,同意请假。");              
  26.     }  
  27. }  

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import java.util.logging.Logger;  
  5. /** 
  6.  * 项目组长批准请假 
  7.  *    模拟当开发人员请假小于3天,组长比准 
  8.  *     
  9.  *     
  10.  *     <serviceTask id="servicetask3" name="项目组长同意" activiti:class="com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask"></serviceTask> 
  11.     
  12.  * @author longgangbai 
  13.  *  
  14.  * 2011-12-17  上午09:07:37 
  15.  */  
  16. public class TeamLeaderServiceTask implements JavaDelegate {  
  17.   
  18.     private final Logger log = Logger.getLogger(TeamLeaderServiceTask.class.getName());  
  19.   
  20.     @Override  
  21.     public void execute(DelegateExecution execution) throws Exception {  
  22.         Thread.sleep(10000);  
  23.         log.info("variavles=" + execution.getVariables());  
  24.         execution.setVariable("项目组长""请假天数小于3天,同意请假。");  
  25.         log.info("项目组长,请假天数小于3天,同意请假。");  
  26.     }  
  27. }  

 

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import java.util.logging.Logger;  
  5. /** 
  6.  *  execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。  
  7.  * 
  8.  * <serviceTask id="servicetask4" name="项目总监同意" activiti:class="com.easyway.workflow.activiti.gateway.ProductBossServiceTask"></serviceTask> 
  9.  * 
  10.  * 项目总监审批过程 
  11.  * @author longgangbai 
  12.  *  
  13.  * 2011-12-17  下午07:45:47 
  14.  */  
  15. public class ProductBossServiceTask implements JavaDelegate {  
  16.   
  17.     private final Logger log = Logger.getLogger(ProductBossServiceTask.class.getName());  
  18.   
  19.     @Override  
  20.     public void execute(DelegateExecution execution) throws Exception {  
  21.         Thread.sleep(10000);  
  22.         log.info("variavles=" + execution.getVariables());  
  23.         execution.setVariable("项目总监""请假天数大约3天,同意请假。");  
  24.         log.info("项目总监,请假天数大约3天,同意请假。");          
  25.     }  
  26. }  

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import java.util.logging.Logger;  
  5. /** 
  6.   * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。  
  7.  *自动执行  
  8. <serviceTask>元素,可以实现自动活动,语法如下所示:  
  9. <serviceTask id="serviceTaskId" name="serviceTaskName"  
  10. activiti:class="org.shirdrn.workflow.activiti.gateway.ServiceTaskClass"/>  
  11. 其中,activiti:class属性为该结点对应的处理类,该类要求实现org.activiti.engine.delegate.JavaDelegate接口 
  12.  
  13.  *  <serviceTask id="servicetask5" name="人事部门同意" activiti:class="com.easyway.workflow.activiti.gateway.HumanResouceServiceTask"></serviceTask> 
  14.  * 
  15.  * 人事部门审批过程 
  16.  * @author longgangbai 
  17.  *  
  18.  * 2011-12-17  下午07:45:47 
  19.  */  
  20. public class HumanResouceServiceTask implements JavaDelegate {  
  21.   
  22.     private final Logger log = Logger.getLogger(HumanResouceServiceTask.class.getName());  
  23.   
  24.     @Override  
  25.     public void execute(DelegateExecution execution) throws Exception {  
  26.         Thread.sleep(10000);  
  27.         log.info("variavles=" + execution.getVariables());  
  28.         execution.setVariable("人事部门""请假天数大约3天,同意请假。");  
  29.         log.info("人事部门 ,请假天数大约3天,同意请假。");  
  30.     }  
  31. }  

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import junit.framework.TestCase;  
  5.   
  6. import org.activiti.engine.FormService;  
  7. import org.activiti.engine.HistoryService;  
  8. import org.activiti.engine.IdentityService;  
  9. import org.activiti.engine.ManagementService;  
  10. import org.activiti.engine.ProcessEngine;  
  11. import org.activiti.engine.ProcessEngines;  
  12. import org.activiti.engine.RepositoryService;  
  13. import org.activiti.engine.RuntimeService;  
  14. import org.activiti.engine.TaskService;  
  15. import org.activiti.engine.test.ActivitiTestCase;  
  16. /** 
  17.  * 主要是在测试之前做一些初始化工作,主要包括流程引擎实例 
  18.  * 的构建,及其流程提供的基本服务。 
  19.  * 目的:让开发者熟悉工作流使用过程使用的几个步骤 
  20.  * 1.加载相关的工作流全局配置文件activiti.cfg.xml配置文件信息 
  21.  * 2.获取工作流相关的服务(RepositoryService,RuntimeService, 
  22.  *    TaskService,HistoryService,FormService,ManagementService, 
  23.  *    IdentityService等) 
  24.  * 2.加载工作流文件*.bpmn20.xml信息 
  25.  *  
  26.  * 3.部署工作流 
  27.  *    部署工作流由多种方式,在以后会相继讲解 
  28.  *  
  29.  * @author longgangbai 
  30.  *  
  31.  * 2011-12-17  下午07:48:59 
  32.  */  
  33. public abstract class AbstractTest extends TestCase {  
  34.   
  35.     private ProcessEngine processEngine;  
  36.     protected String deploymentId;  
  37.     protected RepositoryService repositoryService;  
  38.     protected RuntimeService runtimeService;  
  39.     protected TaskService taskService;  
  40.     protected FormService formService;  
  41.     protected HistoryService historyService;  
  42.     protected IdentityService identityService;  
  43.     protected ManagementService managementService;  
  44.       
  45.       
  46.     /** 
  47.      * 测试用例开始初始化工作 
  48.      * 1.创建相关的工作流程对象ProcessEngine 
  49.      * 2.创建相关的服务 
  50.      * 3. 
  51.      */  
  52.     @Override  
  53.     protected void setUp() throws Exception {  
  54.         super.setUp();  
  55.         //由于ProcessEngine为线程安全性对象,整个项目可以共用一个  
  56.         if(processEngine==null) {  
  57.             //此处使用此种方法调用的activiti的配置文件为 classpath路径下的activiti.cfg.xml  
  58.             //采用的H2的数据库  
  59.             processEngine = ProcessEngines.getDefaultProcessEngine();  
  60.         }  
  61.         //获取工作流的各种服务信息  
  62.         repositoryService = processEngine.getRepositoryService();  
  63.         runtimeService = processEngine.getRuntimeService();  
  64.         taskService = processEngine.getTaskService();  
  65.         formService = processEngine.getFormService();  
  66.         historyService = processEngine.getHistoryService();  
  67.         identityService = processEngine.getIdentityService();  
  68.         managementService = processEngine.getManagementService();  
  69.         //调用扩展的初始化工作  
  70.         initialize();  
  71.           
  72.     }  
  73.       
  74.     /** 
  75.      * test销毁方法 
  76.      */  
  77.     @Override  
  78.     protected void tearDown() throws Exception {  
  79.         super.tearDown();  
  80.         destroy();  
  81.     }  
  82.       
  83.     /** 
  84.      * 便于子类的工作的初始化的扩展工作 
  85.      *  
  86.      *  
  87.      * @throws Exception 
  88.      */  
  89.     protected abstract void initialize() throws Exception;  
  90.     /** 
  91.      * 便于子类的工作的销毁的扩展工作 
  92.      *  
  93.      * @throws Exception 
  94.      */  
  95.     protected abstract void destroy() throws Exception;  
  96. }  

 

 

Java代码  收藏代码
  1. package com.easyway.workflow.activiti.gateway;  
  2.   
  3.   
  4. import org.activiti.engine.runtime.ProcessInstance;  
  5.   
  6.   
  7. /** 
  8.  * Activiti 5.6支持流程活动自动执行与手工触发执行。 
  9.  * 其中,自动执行是指,在启动流程之前,准备流程所需要的控制流程进度的变量数据, 
  10.  * 启动流程之后,无需外部干预,就能够按照预定义的流程执行; 
  11.  * 过基于Activiti 5.6的<parallelGateway>、<serviceTask>、<receiveTask>、<userTask>元素 
  12.  *  
  13.  *  
  14.  * 自动执行  
  15.  *<serviceTask>元素,可以实现自动活动,语法如下所示:  
  16.  *<serviceTask id="serviceTaskId" name="serviceTaskName"  
  17.  *activiti:class="org.shirdrn.workflow.activiti.gateway.ServiceTaskClass"/>  
  18.  * 
  19.  * 其中,activiti:class属性为该结点对应的处理类,该类要求实现org.activiti.engine.delegate.JavaDelegate 
  20.  * 接口,该接口定义如下所示:  
  21.  *  
  22.  * <pre> 
  23.  * package org.activiti.engine.delegate; 
  24.  *   public interface JavaDelegate { 
  25.  *         void execute(DelegateExecution execution) throws Exception; 
  26.  *  } 
  27.  * </pre> 
  28.  * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量 
  29.  *  
  30.  * 工作流模拟某公司请假流程情景如下: 
  31.  *  1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假。 
  32.  *  2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监批准 
  33.  *   
  34.  *  模拟自动审批:只需要启动一个流程实例,它会自动执行到结束。这种情况下,你不需要关注流 
  35.  *  程的执行进度,而只需要把精力集中在每个结点的处理逻辑(通常是简单或者复杂的商业逻辑)上。 
  36.  *  
  37.  *   
  38.  *  
  39.  * @author longgangbai 
  40.  *  
  41.  * 2011-12-17  08:01:55 
  42.  */  
  43. public class AutomaticParallelGatewayTest extends AbstractTest {  
  44.   
  45.     private String deploymentId;  
  46.       
  47.     @Override  
  48.     protected void initialize() throws Exception {  
  49.         deploymentId = repositoryService.createDeployment()  
  50.             .addClasspathResource("diagrams/AutoExecuteTask.bpmn20.xml")  
  51.             .deploy().getId();  
  52.     }  
  53.   
  54.     @Override  
  55.     protected void destroy() throws Exception {  
  56.         repositoryService.deleteDeployment(deploymentId, true);  
  57.     }  
  58.       
  59.     /** 
  60.      * 使用注解部署 工作流程 
  61.      */  
  62.     @Deployment  
  63.     public void testForkJoin() {  
  64.         //根据流程ID获取流程实例  
  65.         ProcessInstance pi = runtimeService.startProcessInstanceByKey("AutoExecuteTask");  
  66.         //根据运行是服务检查是否执行的结束  
  67.         assertEquals(true, pi.isEnded());  
  68.     }  
  69. }  

 

 

 运行结果如下(运行单元测试之前必须启动H2数据库,否则报错):

Java代码  收藏代码
  1. 2011-12-18 12:50:13 org.activiti.engine.ProcessEngines initProcessEnginFromResource  
  2. 信息: initializing process engine for resource jar:file<span style="color: #ff0000;">:/C:/activiti-rest/activiti-cfg.jar!/activiti.cfg.xml</span>  
  3. 2011-12-18 12:50:17 org.activiti.engine.impl.ProcessEngineImpl <init>  
  4. 信息: ProcessEngine default created  
  5. 2011-12-18 12:50:17 org.activiti.engine.ProcessEngines initProcessEnginFromResource  
  6. 信息: <span style="color: #ff0000;">initialised process engine default</span>  
  7. 2011-12-18 12:50:17 org.activiti.engine.impl.jobexecutor.JobAcquisitionThread run  
  8. 信息: JobAcquisitionThread starting to acquire jobs  
  9. 2011-12-18 12:50:17 org.activiti.engine.impl.bpmn.deployer.BpmnDeployer deploy  
  10. 信息: <span style="color: #ff0000;">Processing resource diagrams/AutoExecuteTask.bpmn20.xml</span>  
  11. 2011-12-18 12:50:17 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes  
  12. 信息: <span style="color: #ff0000;">XMLSchema currently not supported as typeLanguage</span>  
  13. 2011-12-18 12:50:17 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes  
  14. 信息: <span style="color: #ff0000;">XPath currently not supported as expressionLanguage</span>  
  15. 2011-12-18 12:50:27 com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask execute  
  16. 信息: variavles={}  
  17. 2011-12-18 12:50:27 com.easyway.workflow.activiti.gateway.DeveloperManagerServiceTask execute  
  18. 信息:<span style="color: #ff0000;"> 项目经理,请假天数大约3天,同意请假。.</span>  
  19. 2011-12-18 12:50:37 com.easyway.workflow.activiti.gateway.ProductManagerServiceTask execute  
  20. 信息:<span style="color: #ff0000;"> variavles={项目经理=请假天数大约3天,同意请假。}</span>  
  21. 2011-12-18 12:50:37 com.easyway.workflow.activiti.gateway.ProductManagerServiceTask execute  
  22. 信息: 产品经理,请假天数大约3天,同意请假。  
  23. 2011-12-18 12:50:47 com.easyway.workflow.activiti.gateway.ProductBossServiceTask execute  
  24. 信息: variavles={项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。}  
  25. 2011-12-18 12:50:47 com.easyway.workflow.activiti.gateway.ProductBossServiceTask execute  
  26. 信息: 项目总监,请假天数大约3天,同意请假。  
  27. 2011-12-18 12:50:57 com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask execute  
  28. 信息: variavles={项目总监=请假天数大约3天,同意请假。, 项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。}  
  29. 2011-12-18 12:50:57 com.easyway.workflow.activiti.gateway.TeamLeaderServiceTask execute  
  30. 信息: 项目组长,请假天数小于3天,同意请假。  
  31. 2011-12-18 12:51:08 com.easyway.workflow.activiti.gateway.HumanResouceServiceTask execute  
  32. 信息: variavles={项目总监=请假天数大约3天,同意请假。, 项目组长=请假天数小于3天,同意请假。, 项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。}  
  33. 2011-12-18 12:51:08 com.easyway.workflow.activiti.gateway.HumanResouceServiceTask execute  
  34. 信息:<span style="color: #ff0000;"> 人事部门 ,请假天数大约3天,同意请假。</span>  

 由上面运行结果可以看出:

  1.XPath currently not supported as expressionLanguage:原因工作流activiti表达式UEL必须在JDK1.5+以上,其实是UEL在JDK1.6中提供,本人采用JDK1.5.

  2.:/C:/activiti-rest/activiti-cfg.jar!/activiti.cfg.xml:全局activiti配置文件采用默认的配置文件。

0 0
原创粉丝点击