zoukankan      html  css  js  c++  java
  • activiti入门2流程引擎的API和服务基础

     

    RepositoryService : 管理和控制发布包流程定义(包含了一个流程每个环节的结构和行为)的操作

    除此之外,服务可以

    • 查询引擎中的发布包和流程定义。

    • 暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。

    • 获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。

    • 获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。

    RuntimeService :负责启动一个流程定义的新实例,获取和保存流程变量,查询流程实例和执行

    TaskService :所有与任务有关的功能

    • 查询分配给用户或组的任务

    • 创建独立运行任务。这些任务与流程实例无关。

    • 手工设置任务的执行者,或者这些用户通过何种方式与任务关联。

    • 认领并完成一个任务。认领意味着一个人期望成为任务的执行者, 即这个用户会完成这个任务。完成意味着“做这个任务要求的事情”。 通常来说会有很多种处理形式。

    IdentityService: 管理(创建,更新,删除,查询...)群组和用户

     FormService: 一个可选服务,这个服务提供了启动表单任务表单两个概念

     HistoryService: 提供了Activiti引擎的所有历史数据

    ManagementService :在使用Activiti的定制环境中基本上不会用到。 它可以查询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。 

    RepositoryService

    获取方式:

    [java] view plaincopy
     
    1. //通过activiti.cfg.xml获取流程引擎  
    2. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
    [java] view plaincopy
     
    1. RepositoryService repositoryService = processEngine.getRepositoryService();  

    任何与“静态”资源有关的数据(比如流程定义)都可以通过 RepositoryService访问。 从概念上讲,所以静态数据都是Activiti的资源内容。

    部署流程文件:

    [java] view plaincopy
     
    1. /** 
    2.      * 发布流程 
    3.      * 发布流程后,流程文件会保存到数据库中 
    4.      */  
    5.     @Test  
    6.     public void deployFlow(){  
    7.         RepositoryService repositoryService = processEngine.getRepositoryService();  
    8.           
    9.         //获取在classpath下的流程文件  
    10.         InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");  
    11.         ZipInputStream zipInputStream = new ZipInputStream(in);  
    12.         //使用deploy方法发布流程  
    13.         repositoryService.createDeployment()  
    14.                          //通过ZIP方式来部署流程文件  
    15.                          .addZipInputStream(zipInputStream)  
    16.                          //通过输入流来部署流程文件  
    17.                          //.addInputStream("xx.bpmn",inputStream)  
    18.                          //.addInputStream("xx.png", inputStream)  
    19.                          .name("Myleave")//设置流程定义的别名  
    20.                          .deploy();//部署  
    21.     }  
    当文件部署成功后,会操作数据库中的这三张表

    act_re_deployment  (部署信息表) 

    存放流程定义的别名和部署时间

    act_re_procdef(流程定义数据表)

    存放流程定义的信息,每部署一个新的流程定义都会在这张表中增加一条记录。

    如果当KEY相同 也就是 bpmn流程文件的 ID 相同是  增加的记录里面的版本会升级一个版本

    act_ge_bytearray(资源文件表)

    存放部署后的流程文件

    查看流程定义信息:

    [java] view plaincopy
     
    1. /** 
    2.  * 查看流程定义 
    3.  * 查询act_re_procdef表 流程定义表 
    4.  */  
    5. @Test  
    6. public void queryProcdef(){  
    7.     RepositoryService repositoryService = processEngine.getRepositoryService();  
    8.     //创建查询对象  
    9.     ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();  
    10.     //添加查询条件  
    11.     query.processDefinitionKey("myProcess");//通过key获取  
    12.         // .processDefinitionName("My process")//通过name获取  
    13.         // .orderByProcessDefinitionId()//根据ID排序  
    14.            //.processDefinitionKeyLike(processDefinitionKeyLike)//支持模糊查询  
    15.             //.listPage(firstResult, maxResults)//分页  
    16.     //执行查询获取流程定义明细  
    17.     List<ProcessDefinition> pds = query.list();//获取批量的明细  
    18.                     //.singleResult()//获取单个的明细  
    19.     for (ProcessDefinition pd : pds) {  
    20.         System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+",RESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());  
    21.         System.out.println("------------------------------------------------");  
    22.     }  
    23.       
    24. }  

    运行结果:

    [plain] view plaincopy
     
    1. ID:myProcess:1:604,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png  
    2. ------------------------------------------------  
    3. ID:myProcess:2:809,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:806,VERSION:2,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png  
    4. ------------------------------------------------  


    显示图片:

    通过repositoryService查看流程定义信息,并且获取DEPLOYMENT_ID到 act_ge_bytearray 查询到 资源文件名

    通过资源文件名和deploymentId获取流并输出到文件中

    [java] view plaincopy
     
    1. /** 
    2.      * 显示图片信息 
    3.      * @throws IOException 
    4.      */  
    5.     @Test  
    6.     public void showImg() throws IOException{  
    7.         String deploymentId = "601";  
    8.         //通过deploymentId获取资源名称  
    9.         List<String> names = processEngine.getRepositoryService()  
    10.                     .getDeploymentResourceNames(deploymentId);  
    11.         String imgName = null;  
    12.         for (String name : names) {  
    13.             System.out.println("name:"+name);  
    14.             if (name.endsWith(".png")) {  
    15.                 imgName = name;  
    16.             }  
    17.         }  
    18.         System.out.println("imgName:"+imgName);  
    19.         if (imgName != null) {  
    20.             File file = new File("e:/"+imgName);  
    21.             //获取资源文件的流  
    22.             InputStream in = processEngine.getRepositoryService()  
    23.                     .getResourceAsStream(deploymentId, imgName);  
    24.             //通过FileUtils将资源文件以流的信息输出到指定文件  
    25.             FileUtils.copyInputStreamToFile(in, file);  
    26.         }  
    27.     }  
    在E盘下查看 生成的照片

    删除流程定义:

    [java] view plaincopy
     
    1. /** 
    2.  * 删除流程定义 
    3.  */  
    4. @Test  
    5. public void delDeployment(){  
    6.     String deploymentId = "1";  
    7.     processEngine.getRepositoryService()  
    8.                 //普通删除,删除没有在执行的流程,如果流程正在执行,则抛出异常  
    9.                 //.deleteDeployment(deploymentId);  
    10.                 //级联删除,不管你在不在运行,会删除当前关联的所有信息,包括在历史表里的数据  
    11.                 .deleteDeployment(deploymentId, true);  
    12. }  

    RuntimeService

    获取方式:

    [java] view plaincopy
     
    1. //通过activiti.cfg.xml获取流程引擎  
    2. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
    [java] view plaincopy
     
    1. RuntimeService runtimeService = processEngine.getRuntimeService();  

    启动一个流程实例:
    [java] view plaincopy
     
    1. /** 
    2.  * 启动流程实例 
    3.  */  
    4. @Test  
    5. public void startFlow(){  
    6.       
    7.     RuntimeService runtimeService = processEngine.getRuntimeService();  
    8.       
    9.     //通过Id来启动一个流程并返回一个流程实例  
    10.     ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");  
    11.     System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());  
    12. }  
    当一个流程实例启动后,会在 act_ru_execution 表中插入一条记录,如果是用户任务节点,同时也会在act_ru_task表中插入一条记录

    查询流程状态:

    [java] view plaincopy
     
    1. /** 
    2.      * 查看流程状态 
    3.      */  
    4.     @Test  
    5.     public void queryState(){  
    6.         String processInstanceId = "701";  
    7.         ProcessInstance pi = processEngine.getRuntimeService()  
    8.                     //创建执行对象查询,查询正在执行的执行对象  
    9.                     //.createExecutionQuery()  
    10.                     .createProcessInstanceQuery()//创建流程实例查询,查询正在执行的流程实例  
    11.                     .processInstanceId(processInstanceId)//通过流程实例ID查询  
    12.                     //返回批量结果  
    13.                     //.list()  
    14.                     .singleResult();//返回唯一的结果  
    15.         if (pi != null) {  
    16.             System.out.println("当前流程:"+pi.getActivityId());  
    17.         }else {  
    18.             System.out.println("流程已经结束");  
    19.         }  
    20.     }  
    在整个流程执行的过程中,流程ID 都是 唯一不变的,当流程结束后 流程记录就会在 act_ru_execution 表中被删除,存入到历史表

    设置和获取流程变量:

    [java] view plaincopy
     
    1. /** 
    2.  * 通过runtimeService设置流程变量 
    3.  * 设置流程变量 
    4.  */  
    5. public void setAndGetVariables(){  
    6.     RuntimeService runtimeService = processEngine.getRuntimeService();  
    7.     //通过执行对象ID和key value设置变量  
    8.     //value是一个object对象,当一个pojo类实现Serializable接口的时候就可以存入流程变量中  
    9.     //runtimeService.setVariable(executionId, key, value);  
    10.     //设置专属于一个执行对象ID的流程变量  
    11.     //runtimeService.setVariableLocal(executionId, key, value);  
    12.     //通过执行对象ID和Map设置多个变量  
    13.     Map<String, Object> paramMap = new HashMap<String, Object>();  
    14.     //runtimeService.setVariables(executionId, paramMap);  
    15.     //设置专属于一个执行对象ID的多个流程变量  
    16.     //runtimeService.setVariablesLocal(executionId, paramMap);  
    17.     //通过执行对象ID获取变量,返回object,需要强转  
    18.     //runtimeService.getVariable(executionId, key);  
    19.     //通过执行对象ID获取一个Map<String, Object>对象  
    20.     //runtimeService.getVariables(executionId);  
    21. }  

    流程变量所支持的类型

    设置的流程变量会存入到act_ru_variable

    act_ru_variable表  的BYTEARRAY_ID_对应的是 act_ge_bytearray 如果是复杂类型的数据  会存入二进制字段中

    TaskService

    获取方式:

    [java] view plaincopy
     
    1. //通过activiti.cfg.xml获取流程引擎  
    2. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
    [java] view plaincopy
     
    1. //获取任务服务对象  
    2.         TaskService taskService = processEngine.getTaskService();  
    查看个人任务:
    [java] view plaincopy
     
    1. /** 
    2.      * 查看任务 
    3.      */  
    4.     @Test  
    5.     public void queryTask(){  
    6.         //获取任务服务对象  
    7.         TaskService taskService = processEngine.getTaskService();  
    8.         //根据接受人查询该用户的任务  
    9.         List<Task> tasks = taskService.createTaskQuery()  
    10.                                     //模糊查询  
    11.                                     //.taskAssigneeLike(assigneeLike)  
    12.                                     //通过执行对象ID查询任务  
    13.                                     //.executionId(executionId)  
    14.                                     .taskAssignee("张三")//通过接受人来查询个人任务  
    15.                                     .list();  
    16.         for (Task task : tasks) {  
    17.             System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",开始时间:"+task.getCreateTime());  
    18.         }  
    19.     }  

    运行结果

    [plain] view plaincopy
     
    1. ID:704,姓名:员工请假,接收人:张三,开始时间:Wed Oct 22 17:03:04 CST 2014  
    2. ID:804,姓名:员工请假,接收人:张三,开始时间:Thu Oct 23 11:27:47 CST 2014  

    除了个人任务 还有 组任务

    办理任务:
    [java] view plaincopy
     
    1. /** 
    2.      * 办理任务 
    3.      */  
    4.     @Test  
    5.     public void startTask(){  
    6.         TaskService taskService = processEngine.getTaskService();  
    7.         //taskId 就是查询任务中的 ID  
    8.         String taskId = "704";  
    9.         //完成请假申请任务  
    10.         taskService.complete(taskId );  
    11.     }  

    taskService 和 runtimeService 一样都是可以设置流程变量的


    HistoryService

    获取方式:

    [java] view plaincopy
     
    1. //通过activiti.cfg.xml获取流程引擎  
    2. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
    [java] view plaincopy
     
    1. HistoryService historyService = processEngine.getHistoryService();  

    查询历史任务:
    [java] view plaincopy
     
    1. /** 
    2.      * 查询历史任务 
    3.      */  
    4.     @Test  
    5.     public void queryHistoryTask(){  
    6.         String assignee = "张三";  
    7.         HistoryService historyService = processEngine.getHistoryService();  
    8.           
    9.         List<HistoricTaskInstance> htis = historyService.createHistoricTaskInstanceQuery()//创建历史任务查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>  
    10.                                                     //创建一个历史详细信息查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>  
    11.                                                     //.createHistoricDetailQuery()  
    12.                                                     //创建历史流程实例查询对象  
    13.                                                     //.createHistoricProcessInstanceQuery()  
    14.                                                     .taskAssignee(assignee)//根据接受人查询历史任务  
    15.                                                     .list();//返回批量结果  
    16.           
    17.         for (HistoricTaskInstance hti : htis) {  
    18.             System.out.println("ID:"+hti.getId()+",流程实例ID:"+hti.getProcessInstanceId()+",接收人:"+hti.getAssignee()+",执行对象ID:"+hti.getExecutionId());  
    19.             System.out.println("------------------------------------------------");  
    20.         }  
    21.     }  
    结果:
    [plain] view plaincopy
     
    1. ID:704,流程实例ID:701,接收人:张三,执行对象ID:701  
    2. ------------------------------------------------  
    3. ID:804,流程实例ID:801,接收人:张三,执行对象ID:801  
    4. ------------------------------------------------  
    主要是查询act_hi_taskinst表中的数据


    查询历史流程实例:

    [java] view plaincopy
     
    1. /** 
    2.      * 查询历史流程实例 
    3.      */  
    4.     @Test  
    5.     public void queryHistoryPi(){  
    6.         HistoryService historyService = processEngine.getHistoryService();  
    7.         String pi = "701";  
    8.           
    9.         List<HistoricProcessInstance> hpis = historyService.createHistoricProcessInstanceQuery()//创建历史流程实例查询对象  
    10.                                                         .processInstanceId(pi)  
    11.                                                         .list();  
    12.           
    13.         for (HistoricProcessInstance hpi : hpis) {  
    14.             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    15.             System.out.println("实例ID:"+hpi.getId()+",开始时间:"+sdf.format(hpi.getStartTime())+",结束时间:"+sdf.format(hpi.getEndTime()));  
    16.             System.out.println("-------------------------------------");  
    17.         }  
    18.     }  
    结果:
    [plain] view plaincopy
     
    1. 实例ID:701,开始时间:2014-10-22 17:03:04,结束时间:2014-10-23 15:25:03  
    2. -------------------------------------  

    主要是查询act_hi_procinst表中的数据

    获取历史流程变量:
    [java] view plaincopy
     
    1. /** 
    2.  * 获取历史流程变量 
    3.  */  
    4. @Test  
    5. public void getHistoryVariable(){  
    6.     HistoryService historyService = processEngine.getHistoryService();  
    7.       
    8.     List<HistoricVariableInstance> hvis = historyService.createHistoricVariableInstanceQuery()//创建一个历史流程变量实例查询对象  
    9.                                                     .variableName("key")//通过key查询  
    10.                                                     .list();  
    11.       
    12.     if (hvis != null) {  
    13.         for (HistoricVariableInstance hvi : hvis) {  
    14.             System.out.println("key:"+hvi.getVariableName()+",value:"+hvi.getValue());  
    15.         }  
    16.     }  
    17. }  

    主要是查询act_hi_varinst表中的数据

    查询历史活动信息:
    [java] view plaincopy
     
    1. /** 
    2.      * 查询历史活动信息 
    3.      * 主要查询的是act_hi_actinst表中的数据 
    4.      */  
    5.     @Test  
    6.     public void queryHistoryAi(){  
    7.         String pi = "701";  
    8.         HistoryService historyService = processEngine.getHistoryService();  
    9.           
    10.         List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery()//创建历史活动实例查询对象  
    11.                                                             .processInstanceId(pi)  
    12.                                                             .list();  
    13.           
    14.         for (HistoricActivityInstance hai : hais) {  
    15.             System.out.println("活动ID:"+hai.getActivityId()+",活动名称:"+hai.getActivityName()+",活动类型:"+hai.getActivityType()+",流程实例ID:"+hai.getProcessInstanceId()+",接收人:"+hai.getAssignee());  
    16.             System.out.println("--------------------------------");  
    17.         }  
    18.           
    19.     }  
    结果:
    [plain] view plaincopy
     
    1. 活动ID:endevent1,活动名称:End,活动类型:endEvent,流程实例ID:701,接收人:null  
    2. --------------------------------  
    3. 活动ID:startevent1,活动名称:Start,活动类型:startEvent,流程实例ID:701,接收人:null  
    4. --------------------------------  
    5. 活动ID:员工请假,活动名称:员工请假,活动类型:userTask,流程实例ID:701,接收人:张三  
    6. --------------------------------  
    7. 活动ID:老板审批,活动名称:老板审批,活动类型:userTask,流程实例ID:701,接收人:老板  
    8. --------------------------------  

    这几个是最常用的几个服务.

    流程实例和执行对象的区别   流程实例和执行对象 2个是不同的一个概念

  • 相关阅读:
    sql server 删除重复数据新思路
    sqlserver 迁移 mysql
    ASP.NET Web deployment task failed. 请与服务器管理员联系,检查授权和委派设置 部署任务失败的解决方案
    数据库交互之减少IO次数
    sqlserver 安全设置
    windows设置相对路径的快捷方式
    利用SignalR实现实时推送信息
    image magick 备忘
    dotnetCore开发中遇到的一些问题
    “NETSDK1061: 项目是使用 Microsoft.NETCore.App 版本 2.1.14 还原的, 但使用当前设置, 将改用版本 2.1.0。”的处理方法
  • 原文地址:https://www.cnblogs.com/jiligalaer/p/4179829.html
Copyright © 2011-2022 走看看