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

除此之外,服务可以

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

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

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

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

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

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

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

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

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

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

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

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

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

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

RepositoryService

获取方式:

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

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

部署流程文件:

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

当文件部署成功后,会操作数据库中的这三张表

act_re_deployment  (部署信息表) 

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

act_re_procdef(流程定义数据表)

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

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

act_ge_bytearray(资源文件表)

存放部署后的流程文件

查看流程定义信息:

  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. }

运行结果:

  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获取流并输出到文件中

  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盘下查看 生成的照片

删除流程定义:

  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

获取方式:

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

启动一个流程实例:

  1. /**
  2. * 启动流程实例
  3. */
  4. @Test
  5. public void startFlow(){
  6. RuntimeService runtimeService = processEngine.getRuntimeService();
  7. //通过Id来启动一个流程并返回一个流程实例
  8. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
  9. System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());
  10. }

当一个流程实例启动后,会在 act_ru_execution 表中插入一条记录,如果是用户任务节点,同时也会在act_ru_task表中插入一条记录

查询流程状态:

  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 表中被删除,存入到历史表

设置和获取流程变量:

  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

获取方式:

  1. //通过activiti.cfg.xml获取流程引擎
  2. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  1. //获取任务服务对象
  2. TaskService taskService = processEngine.getTaskService();

查看个人任务:

  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. }

运行结果

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

除了个人任务 还有 组任务

办理任务:

  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

获取方式:

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

查询历史任务:

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

结果:

  1. ID:704,流程实例ID:701,接收人:张三,执行对象ID:701
  2. ------------------------------------------------
  3. ID:804,流程实例ID:801,接收人:张三,执行对象ID:801
  4. ------------------------------------------------

主要是查询act_hi_taskinst表中的数据

查询历史流程实例:

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

结果:

  1. 实例ID:701,开始时间:2014-10-22 17:03:04,结束时间:2014-10-23 15:25:03
  2. -------------------------------------

主要是查询act_hi_procinst表中的数据

获取历史流程变量:

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

主要是查询act_hi_varinst表中的数据

查询历史活动信息:

  1. /**
  2. * 查询历史活动信息
  3. * 主要查询的是act_hi_actinst表中的数据
  4. */
  5. @Test
  6. public void queryHistoryAi(){
  7. String pi = "701";
  8. HistoryService historyService = processEngine.getHistoryService();
  9. List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery()//创建历史活动实例查询对象
  10. .processInstanceId(pi)
  11. .list();
  12. for (HistoricActivityInstance hai : hais) {
  13. System.out.println("活动ID:"+hai.getActivityId()+",活动名称:"+hai.getActivityName()+",活动类型:"+hai.getActivityType()+",流程实例ID:"+hai.getProcessInstanceId()+",接收人:"+hai.getAssignee());
  14. System.out.println("--------------------------------");
  15. }
  16. }

结果:

  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个是不同的一个概念

activiti入门2流程引擎的API和服务基础的更多相关文章

  1. 流程引擎的API和服务基础

    RepositoryService :  管理和控制 发布包 和 流程定义(包含了一个流程每个环节的结构和行为) 的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部 ...

  2. activiti入门2流程引擎API和服务基础设施

    RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...

  3. activiti学习3:流程引擎对象和流程引擎配置对象

    目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...

  4. Activiti入门 -- 环境搭建和核心API简介

    相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 -- 轻松解读数据库> 本章内容,主要讲解Activiti框架环境的搭建,能够使用Activi ...

  5. 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解

    流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...

  6. Activiti入门 -- 轻松解读数据库

    相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 --环境搭建和核心API简介> 在Activiti中,相对前身JBPM基础上又额外多了5张,框 ...

  7. camunda流程引擎概念术语

    前言 本文重点介绍开源流程引擎camunda的核心概念,这些概念同样适用于JBMP.Activiti.Flowable流程引擎,了解这些基本概念和原理,使用流程引擎API将更得心应手. 一.Proce ...

  8. 从零开始学习和改造activiti流程引擎的13天,自己记录一下

    day#1(11.13) 尝试通过spring boot 集成最新版activiti 7,但是苦于官方的文档基本为空,无法完成spring boot的配置,最终按照activiti 6的文档,手工初始 ...

  9. Camunda开源流程引擎快速入门——Hello World

    市场上比较有名的开源流程引擎有osworkflow.jbpm.activiti.flowable.camunda.由于jbpm.activiti.flowable这几个流程引擎出现的比较早,国内人用的 ...

随机推荐

  1. hdu2049.java

    hdu 2049 不容易系列之(4)——考新郎 (组合+错排) 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎&qu ...

  2. Android开发之使用活动显示对话框

    利用活动显示对话框,需要重写Activity中的onCreateDialog()方法,以此来显示一个对话框窗口. 效果如下: 实现代码如下: package com.example.dialog; i ...

  3. linux下实现redis共享session的tomcat集群

    为了实现主域名与子域名的下不同的产品间一次登录,到处访问的效果,因此采用rediss实现tomcat的集群效果.基于redis能够异步讲缓存内容固化到磁盘上,从而当服务器意外重启后,仍然能够让sess ...

  4. jquery easyui动态校验,easyui动态验证

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  5. JDK自带方法实现RSA非对称加密

    package jdbc.pro.lin; import java.security.InvalidKeyException; import java.security.Key; import jav ...

  6. HTML+CSS基础学习笔记(7)

    CSS布局模型 在网页中,元素有三种布局模型: 1.流动模型(Flow) 2.浮动模型(Float) 3.层模型(Layer) 一.流动模型 流动(Flow)是默认的网页布局模型,网页在默认状态下的H ...

  7. Windows10 安装配置IIS,并将程序发布到服务器上

    1.确保计算机链接网络(也可在不联网的时候使用安装包进行IIS的安装): 2.打开“控制面板”(“菜单”按钮+x 快捷键)——“程序”——“打开或关闭Windows功能”——展开“Internet信息 ...

  8. js -去掉首尾的空格.

    function trimFE (str) { return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); }

  9. 查看当前使用的shell

    1.实时查看当前进程中使用的shell种类:推荐 ps | grep $$ | awk '{print $4}' (注:$$表示shell的进程号) 2.最常用的查看shell的命令,但不能实时反映当 ...

  10. 在js脚本里计算多个小数的加法问题

    当在js脚本里计算多个小数的加法时,算得的结果往往会自动取整,这时候我们就应该加入以下代码: function toDecimal(x) { var val = Number(x); if (!isN ...