activiti之流程变量

来源:互联网 发布:下载360软件用的软件 编辑:程序博客网 时间:2024/06/06 12:55
所谓的流程变量,大概也就是和咱们业务相关的数据,例如我要请假,那我得知道是谁在请假请假人是谁,也就是我要知道activiti的实体和咱们业务的javaBean如何关联起来。

       下边我们先看一下和流程变量的数据库表都有哪些,当然我们自己建的表的不说了,都是流程变量。哈哈。

       act_ru_task(正在执行的任务表)和act_hi_taskinst(正在执行的任务表)

       主要记录了正在执行的任务名称,流程实例ID,流程定义DI,任务的key,和流程变量信息。

 

      

          历史任务表记录的信息和正在执行的任务表信息都一样,区别就在于一个是全部的信息,一个事正在执行的任务相关信息。

       act_hi_comment

      因为是多用于对业务的操作,这个表主要记录了一些不同用于对同一个事件不同的看法,以方便其他用户做参考。例如请假,项目经理一说:我的员工老师加班,就得给家,主任也就直接给了。对吧。

    

      act_ru_execute(正在执行的实例表)注意business_key,这个字段是我们自定义的,我的方法就是实例 + “.” + "业务ID"


      act_ru_variable(正在执行的 流程定义表信息)

    

       好的,activiti提供的表有流程变量的就是这些表了,既然有了这些表,那么我们看一下这些表在我们业务实现的时候都是如何来运用的。下边我通过两个实例,一个是我在画流程图是写好流程实例,一个是运用javaBean来实现。

       简单实例

      部署并启动流程实例

[java] view plain copy
  1. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  2.   
  3. /**部署流程定义从(inputStream)*/  
  4. @Test  
  5. public void deploymentProcessDefinition_input(){  
  6.     InputStream inputStreamBpmn = this.getClass().getResourceAsStream("/diagrams/porcessVariables.bpmn");  
  7.     InputStream inputStreamPng = this.getClass().getResourceAsStream("/diagrams/porcessVariables.png");  
  8.     Deployment deployment = processEngine.getRepositoryService()  //用于流程定义和部署相关对象的Service  
  9.                     .createDeployment()   //创建一个部署对象  
  10.                     .name("hellworld部门程序")  
  11.                     .addInputStream("porcessVariables.bpmn", inputStreamBpmn) //使用资源名称和输入流(与资源文件的名称要一直)  
  12.                     .addInputStream("porcessVariables.png", inputStreamPng)  
  13.                     .deploy();  
  14.       
  15.     System.out.println("deployment" + deployment.getId());   //1  
  16.     System.out.println("deployment" + deployment.getName());//部门程序  
  17.   
  18. }  
  19.   
  20. @Test  
  21. public void startProcessInstance() {  
  22.     //流程定义的key  
  23.     String processInstenceKey = "processVariables";  
  24.     ProcessInstance pi = processEngine.getRuntimeService() //与正在执行的流程实例和执行对象相关的service  
  25.             .startProcessInstanceByKey(processInstenceKey); //使用流程定义的key来启动流程实例helloworld.bpmn的id,使用key启动,默认用最新的版本启动  
  26.     System.out.println("流程实例id:" + pi.getId());  //流程实例id   
  27.     System.out.println("流程定义id:" + pi.getProcessDefinitionId());   //流程定义ID helloworld:1:4  
  28.       
  29. }  
       当我们启动以后是没有流程变量的,但是接下来我们就要设置了,如果我们在我们话流程图的时候设置好了的话,例如在单击bpmn中的某一个任务,选择Main config,然后在Assign这写上”张三“,那么我们就要启动张三的的业务流程的话,则需要如下代码来这是:
[java] view plain copy
  1. <pre name="code" class="java">@Test  
  2.     public void setVariables(){  
  3.         String taskId = "2004";  
  4.         TaskService taskService = processEngine.getTaskService();  
  5.         taskService.setVariableLocal(taskId, "请假天数"3);   //与任务ID绑定  
  6.             taskService.setVariable(taskId, "请假日期"new Date());  
  7.         taskService.setVariable(taskId, "请假原因""回家看亲");  
  8.           
  9.         System.out.println("设置成功了");  
  10.     }  
       而上边代码的taskId就是实例启动以后的当前正在执行的任务ID,然后我们去act_ru_variable,act_ru_task等表中都能看到张三的这个名字,但是这样是可以实现,但是我们在实际运用中却都不会这样用,既然是面向对象,我们就应该这样。

      

[java] view plain copy
  1. public class Person implements Serializable {  
  2.   
  3.     /** 
  4.      *  
  5.      */  
  6.     private static final long serialVersionUID = 1L;  
  7.     private Integer id;  
  8.     private String name;  
  9.     public String getName()  {  
  10.         return name;  
  11.     }  
  12.     public Integer getId() {  
  13.         return id;  
  14.     }  
  15.     public void setId(Integer id) {  
  16.         this.id = id;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21. }  
 
[java] view plain copy
  1. @Test  
  2.     public void setVariables(){  
  3.         String taskId = "2004";  
  4.         TaskService taskService = processEngine.getTaskService();  
  5.         /**使用javaBean*/  
  6.         Person p = new Person();  
  7.         p.setId(20);  
  8.         p.setName("menghaibintest");  
  9.         taskService.setVariable(taskId, "人员信息", p);  
  10.         System.out.println("设置成功了");  
  11.     }  
  12.       

      看一下效果显示
    

       那么我们获取一下吧

      

[java] view plain copy
  1. /** 
  2.      * 获取流程变量 
  3.      */  
  4.     @Test  
  5.     public void getVariables(){  
  6.         TaskService taskService = processEngine.getTaskService();  
  7.         String taskId = "404";  
  8.         Person p = (Person)taskService.getVariable(taskId, "人员信息");  
  9.         System.out.println("id:" + p.getId());  
  10.         System.out.println("name" + p.getName());  
  11.     }  
       当然你可能觉得这样还是不够友好,我想把我的业务和工作流的表区分开来,只用主外键来关联,那么下篇博客我来为大家呈现一种耦合性最低的方法。

      简单总结一下就是既然要设置好流程变量,那么就要知道我们的流程变量在数据库中表的位置,和在工作流中如何设置。既然是面向对象,我们就不应该再去使用一个一个设置的方式。