zoukankan      html  css  js  c++  java
  • 转---Activiti工作流demo

    前几篇对Activiti工作流进行了介绍,并讲解了其环境配置。本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货。

    一、demo业务分析

           以HelloWorld程序为例。

          首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功。接下来用Actitivi工作流来实现业务。

    二、新建项目

            首先新建一个Activiti项目,目录结构如下。

            

    三、画流程图

            在diagrams下新建一个Activiti Diagram:右击diagrams->new->others->Activiti Diagram

            然后画流程图:

             指派各活动节点的分派人:分别为张三,李四,王五。

    四、配置环境

            引jar包,建数据库建表,配置日志文件,参考上篇博文《Activiti工作流的环境配置》

    五、新建HelloWorld类

            配置好环境后,新建HelloWorld类,代码如下。

    [java] view plain copy
     
    1. <span style="font-size:18px;">package cn.itcast.a_helloworld;  
    2.   
    3.   
    4. import java.util.List;  
    5.   
    6. import org.activiti.engine.ProcessEngine;  
    7. import org.activiti.engine.ProcessEngines;  
    8. import org.activiti.engine.repository.Deployment;  
    9. import org.activiti.engine.runtime.ProcessInstance;  
    10. import org.activiti.engine.task.Task;  
    11. import org.junit.Test;  
    12.   
    13. public class HelloWorld {  
    14.       
    15.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
    16.       
    17.     /**部署流程定义*/  
    18.     @Test  
    19.     public void deploymentProcessDefinition(){  
    20.         Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service  
    21.             .createDeployment() //创建一个部署对象  
    22.             .name("helloworld入门程序")//添加部署的名称  
    23.             .addClasspathResource("diagrams/helloword.bpmn")//从classpath的资源中加载,一次只能加载一个文件  
    24.             .addClasspathResource("diagrams/helloword.png")//从classpath的资源中加载,一次只能加载一个文件  
    25.             .deploy(); //完成部署  
    26.         System.out.println("部署ID:"+deployment.getId());  //1  
    27.         System.out.println("部署名称"+deployment.getName()); //helloworld入门程序  
    28.           
    29.     }  
    30.       
    31.     /**启动流程实例**/  
    32.     @Test  
    33.     public void startProcessInstance(){  
    34.         //流程定义的key  
    35.         String processDefinitionKey ="helloworld";  
    36.         ProcessInstance pi = processEngine.getRuntimeService()//与正在执行   的流程实例和执行对象相关的Service  
    37.                         .startProcessInstanceByKey(processDefinitionKey);  //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
    38.         System.out.println("流程实例ID:"+pi.getId());  
    39.         System.out.println("流程定义ID:"+pi.getProcessDefinitionId());  
    40.     }  
    41.       
    42.     /**查询当前人的个人任务*/  
    43.     @Test  
    44.     public void findMyPersonalTask(){  
    45.         String assignee = "张三";  
    46.          List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service  
    47.                         .createTaskQuery()//创建任务查询  
    48.                         .taskAssignee(assignee)//指定个人任查询,指定办理人  
    49.                         .list();  
    50.         if(list!=null && list.size()>0){  
    51.             for(Task task:list){  
    52.                 System.out.println("任务ID:"+task.getId());  
    53.                 System.out.println("任务名称:"+task.getName());  
    54.                 System.out.println("任务的创建时间:"+task.getCreateTime());  
    55.                 System.out.println("任务的办理人:"+task.getAssignee());  
    56.                 System.out.println("流程实例ID:"+task.getProcessInstanceId());  
    57.                 System.out.println("执行对象ID:"+task.getExecutionId());  
    58.                 System.out.println("流程定义ID:"+task.getProcessDefinitionId());  
    59.                 System.out.println("############################################");  
    60.             }  
    61.         }  
    62.     }  
    63.       
    64.     /**完成我的任务*/  
    65.     @Test  
    66.     public void completeMyPersonalTask(){  
    67.         //任务ID  
    68.         String taskId = "11402";  
    69.         processEngine.getTaskService()//与正在执行的任务管理相关的Service  
    70.                         .complete(taskId);  
    71.         System.out.println("完成任务:任务ID:"+taskId);  
    72.     }  
    73. }  
    74. </span>  

            分开来讲:

    1、部署流程定义

    [java] view plain copy
     
    1. <span style="font-size:18px;">    /**部署流程定义*/  
    2.     @Test  
    3.     public void deploymentProcessDefinition(){  
    4.         Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service  
    5.             .createDeployment() //创建一个部署对象  
    6.             .name("helloworld入门程序")//添加部署的名称  
    7.             .addClasspathResource("diagrams/helloword.bpmn")//从classpath的资源中加载,一次只能加载一个文件  
    8.             .addClasspathResource("diagrams/helloword.png")//从classpath的资源中加载,一次只能加载一个文件  
    9.             .deploy(); //完成部署  
    10.         System.out.println("部署ID:"+deployment.getId()); //1  
    11.         System.out.println("部署名称"+deployment.getName()); //helloworld入门程序  
    12.           
    13. </span>  

           执行完后,4张表中的数据:

          1)act_re_deployment (部署信息表)

          2)act_re_procdef(流程定义数据表)

          3)act_ge_bytearray(二进制数组表)

           4)act_ge_property(属性数据表)

    2、启动流程实例

    [java] view plain copy
     
    1. <span style="font-size:18px;">/**启动流程实例**/  
    2.     @Test  
    3.     public void startProcessInstance(){  
    4.         //流程定义的key  
    5.         String processDefinitionKey ="helloworld";  
    6.         ProcessInstance pi = processEngine.getRuntimeService()//与正在执行   的流程实例和执行对象相关的Service  
    7.                         .startProcessInstanceByKey(processDefinitionKey);  //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
    8.         System.out.println("流程实例ID:"+pi.getId());//流程实例ID   101  
    9.         System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID  
    10.     }</span>  

               执行完后四张表中的数据:

             1)act_ru_execution(运行时流程执行实例表)

             2)act_ru_task(运行时任务节点表)

             3)act_identitylink(运行时流程人员表)

             4)act_hi_taskinst(历史任务实例表)

             5)act_hi_procinst(历史流程实例表)

             6)act_hi_identitylink(历史流程人员表)

      

             7)act_hi_actinst(历史节点表)

             8)act_ge_property

             从上图中可以看出变化,next.dbid的VALUE_值由原来的101变为201,REV_由原来的2变为3。

             

    3、查询当前人的个人任务

    [java] view plain copy
     
    1. <span style="font-size:18px;">/**查询当前人的个人任务*/  
    2.     @Test  
    3.     public void findMyPersonalTask(){  
    4.         String assignee = "张三";  
    5.          List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service  
    6.                         .createTaskQuery()//创建任务查询  
    7.                         .taskAssignee(assignee)//指定个人任查询,指定办理人  
    8.                         .list();  
    9.         if(list!=null && list.size()>0){  
    10.             for(Task task:list){  
    11.                 System.out.println("任务ID:"+task.getId());  
    12.                 System.out.println("任务名称:"+task.getName());  
    13.                 System.out.println("任务的创建时间:"+task.getCreateTime());  
    14.                 System.out.println("任务的办理人:"+task.getAssignee());  
    15.                 System.out.println("流程实例ID:"+task.getProcessInstanceId());  
    16.                 System.out.println("执行对象ID:"+task.getExecutionId());  
    17.                 System.out.println("流程定义ID:"+task.getProcessDefinitionId());  
    18.                 System.out.println("############################################");  
    19.             }  
    20.         }  
    21.     }</span>  

            执行完后,能够从运行时任务节点表中查询出相关的信息并显示出来。与上面同理,act_ge_property的两个值分别又变了。

             

    4、完成我的任务

    [java] view plain copy
     
    1. <span style="font-size:18px;">    /**完成我的任务*/  
    2.     @Test  
    3.     public void completeMyPersonalTask(){  
    4.         //任务ID  
    5.         String taskId = "104";//运行时任务ID  
    6.         processEngine.getTaskService()//与正在执行的任务管理相关的Service  
    7.                         .complete(taskId);  
    8.         System.out.println("完成任务:任务ID:"+taskId);  
    9.     }</span>  

            执行完后,表的变化。

           1)act_ru_task

           从上表中可以看出完成张三的任务后,张三的任务消失,李四的任务显示在表中。

            2)act_ru_identitylink

          从上表中可以看出多了一条李四的用户数据。

          3)act_hi_actinst

            从上表中可以看出多了一条李四的节点数据。

            同理act_hi_identitylink也会多一条李四的用户数据, ac_hi_taskinst多一条李四的任务数据。

            然后完成李四的任务,到王五同理;完成王五的任务后张三申请成功,同理,但是运行时表的数据会全部清除,act_hi_procinst的结束相关字段会更新。至此,整个申请结束。

            这是Activiti工作流的一个小demo,大家可以参照着实践一下。下面是本demo及更多demo源码下载的地址:http://download.csdn.net/detail/u013037201/9559857

  • 相关阅读:
    【leetcode】236. 二叉树的最近公共祖先
    【leetcode】230. 二叉搜索树中第K小的元素
    【leetcode】309. 最佳买卖股票时机含冷冻期
    【leetcode】306. 累加数
    【leetcode】304. 二维区域和检索
    spring-framework源码编译及导入
    Java8-函数式接口理解及测试
    Mac编译RocketMQ 4.1.0
    首记
    JS表单验证
  • 原文地址:https://www.cnblogs.com/lyf906522290/p/8708348.html
Copyright © 2011-2022 走看看