activiti入门2流程引擎API和服务基础设施
RepositoryService : 管理和控制公布包
和流程定义(包括了一个流程每一个环节的结构和行为)
的操作
除此之外,服务能够
查询引擎中的公布包和流程定义。
暂停或激活公布包。相应所有和特定流程定义。 暂停意味着它们不能再运行不论什么操作了。激活是相应的反向操作。
获得多种资源,像是包括在公布包里的文件。 或引擎自己主动生成的流程图。
获得流程定义的pojo版本号。 能够用来通过java解析流程。而不必通过xml。
RuntimeService :负责启动一个流程定义的新实例,获取和保存流程变量,查询流程实例和运行
TaskService :全部与任务有关的功能
查询分配给用户或组的任务
创建独立执行任务。这些任务与流程实例无关。
手工设置任务的运行者,或者这些用户通过何种方式与任务关联。
认领并完毕一个任务。认领意味着一个人期望成为任务的运行者。 即这个用户会完毕这个任务。
完毕意味着“做这个任务要求的事情”。 通常来说会有非常多种处理形式。
IdentityService: 管理(创建,更新,删除,查询...)群组和用户
FormService: 一个可选服务,这个服务提供了启动表单和任务表单两个概念
HistoryService: 提供了Activiti引擎的全部历史数据
ManagementService :在使用Activiti的定制环境中基本上不会用到。 它能够查询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。
RepositoryService
获取方式:
//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
不论什么与“静态”资源有关的数据(比方流程定义)都能够通过 RepositoryService訪问。
从概念上讲,所以静态数据都是Activiti的资源内容。
部署流程文件:
/*** 公布流程* 公布流程后。流程文件会保存到数据库中*/@Testpublic void deployFlow(){RepositoryService repositoryService = processEngine.getRepositoryService();//获取在classpath下的流程文件InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");ZipInputStream zipInputStream = new ZipInputStream(in);//使用deploy方法公布流程repositoryService.createDeployment()//通过ZIP方式来部署流程文件.addZipInputStream(zipInputStream)//通过输入流来部署流程文件//.addInputStream("xx.bpmn",inputStream)//.addInputStream("xx.png", inputStream).name("Myleave")//设置流程定义的别名.deploy();//部署}
当文件部署成功后,会操作数据库中的这三张表
act_re_deployment (部署信息表)
存放流程定义的别名和部署时间
act_re_procdef(流程定义数据表)
存放流程定义的信息。每部署一个新的流程定义都会在这张表中添加一条记录。
假设当KEY同样 也就是 bpmn流程文件的 ID 同样是 添加的记录里面的版本号会升级一个版本号
act_ge_bytearray(资源文件表)
存放部署后的流程文件
查看流程定义信息:
/*** 查看流程定义* 查询act_re_procdef表 流程定义表*/@Testpublic void queryProcdef(){RepositoryService repositoryService = processEngine.getRepositoryService();//创建查询对象ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();//加入查询条件query.processDefinitionKey("myProcess");//通过key获取// .processDefinitionName("My process")//通过name获取// .orderByProcessDefinitionId()//依据ID排序//.processDefinitionKeyLike(processDefinitionKeyLike)//支持模糊查询//.listPage(firstResult, maxResults)//分页//运行查询获取流程定义明细List<ProcessDefinition> pds = query.list();//获取批量的明细//.singleResult()//获取单个的明细for (ProcessDefinition pd : pds) {System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+",RESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());System.out.println("------------------------------------------------");}}
执行结果:
ID:myProcess:1:604,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png
------------------------------------------------
ID:myProcess:2:809,NAME:My process,KEY:myProcess,DEPLOYMENT_ID:806,VERSION:2,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png
------------------------------------------------
显示图片:
通过repositoryService查看流程定义信息,而且获取DEPLOYMENT_ID到 act_ge_bytearray 查询到 资源文件名称
通过资源文件名称和deploymentId获取流并输出到文件里
/*** 显示图片信息* @throws IOException*/@Testpublic void showImg() throws IOException{String deploymentId = "601";//通过deploymentId获取资源名称List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);String imgName = null;for (String name : names) {System.out.println("name:"+name);if (name.endsWith(".png")) {imgName = name;}}System.out.println("imgName:"+imgName);if (imgName != null) {File file = new File("e:/"+imgName);//获取资源文件的流InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, imgName);//通过FileUtils将资源文件以流的信息输出到指定文件FileUtils.copyInputStreamToFile(in, file);}}
在E盘下查看 生成的照片
删除流程定义:
/*** 删除流程定义*/@Testpublic void delDeployment(){String deploymentId = "1";processEngine.getRepositoryService()//普通删除,删除没有在运行的流程,假设流程正在运行,则抛出异常//.deleteDeployment(deploymentId);//级联删除,无论你在不在运行,会删除当前关联的全部信息,包含在历史表里的数据.deleteDeployment(deploymentId, true);}
RuntimeService
获取方式:
//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
启动一个流程实例:
/*** 启动流程实例*/@Testpublic void startFlow(){RuntimeService runtimeService = processEngine.getRuntimeService();//通过Id来启动一个流程并返回一个流程实例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());}
当一个流程实例启动后,会在 act_ru_execution 表中插入一条记录,假设是用户任务节点,同一时候也会在act_ru_task表中插入一条记录
查询流程状态:
/*** 查看流程状态*/@Testpublic void queryState(){String processInstanceId = "701";ProcessInstance pi = processEngine.getRuntimeService()//创建运行对象查询,查询正在运行的运行对象//.createExecutionQuery().createProcessInstanceQuery()//创建流程实例查询,查询正在运行的流程实例.processInstanceId(processInstanceId)//通过流程实例ID查询//返回批量结果//.list().singleResult();//返回唯一的结果if (pi != null) {System.out.println("当前流程:"+pi.getActivityId());}else {System.out.println("流程已经结束");}}
在整个流程运行的过程中,流程ID 都是 唯一不变的,当流程结束后 流程记录就会在 act_ru_execution 表中被删除,存入到历史表
设置和获取流程变量:
/*** 通过runtimeService设置流程变量* 设置流程变量*/public void setAndGetVariables(){RuntimeService runtimeService = processEngine.getRuntimeService();//通过运行对象ID和key value设置变量//value是一个object对象,当一个pojo类实现Serializable接口的时候就能够存入流程变量中//runtimeService.setVariable(executionId, key, value);//设置专属于一个运行对象ID的流程变量//runtimeService.setVariableLocal(executionId, key, value);//通过运行对象ID和Map设置多个变量Map<String, Object> paramMap = new HashMap<String, Object>();//runtimeService.setVariables(executionId, paramMap);//设置专属于一个运行对象ID的多个流程变量//runtimeService.setVariablesLocal(executionId, paramMap);//通过运行对象ID获取变量,返回object,须要强转//runtimeService.getVariable(executionId, key);//通过运行对象ID获取一个Map<String, Object>对象//runtimeService.getVariables(executionId);}
流程变量所支持的类型
设置的流程变量会存入到act_ru_variable表
act_ru_variable表 的BYTEARRAY_ID_相应的是 act_ge_bytearray 假设是复杂类型的数据 会存入二进制字段中
TaskService
获取方式:
//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取任务服务对象TaskService taskService = processEngine.getTaskService();
查看个人任务:
/*** 查看任务*/@Testpublic void queryTask(){//获取任务服务对象TaskService taskService = processEngine.getTaskService();//依据接受人查询该用户的任务List<Task> tasks = taskService.createTaskQuery()//模糊查询//.taskAssigneeLike(assigneeLike)//通过运行对象ID查询任务//.executionId(executionId).taskAssignee("张三")//通过接受人来查询个人任务.list();for (Task task : tasks) {System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",開始时间:"+task.getCreateTime());}}
执行结果
ID:704,姓名:员工请假,接收人:张三,開始时间:Wed Oct 22 17:03:04 CST 2014
ID:804,姓名:员工请假,接收人:张三,開始时间:Thu Oct 23 11:27:47 CST 2014
除了个人任务 还有 组任务
办理任务:
/*** 办理任务*/@Testpublic void startTask(){TaskService taskService = processEngine.getTaskService();//taskId 就是查询任务中的 IDString taskId = "704";//完毕请假申请任务taskService.complete(taskId );}
taskService 和 runtimeService 一样都是能够设置流程变量的
HistoryService
获取方式:
//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
查询历史任务:
/*** 查询历史任务*/@Testpublic void queryHistoryTask(){String assignee = "张三";HistoryService historyService = processEngine.getHistoryService();List<HistoricTaskInstance> htis = historyService.createHistoricTaskInstanceQuery()//创建历史任务查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>//创建一个历史具体信息查询<span style="font-family: Arial, Helvetica, sans-serif;">对象</span>//.createHistoricDetailQuery()//创建历史流程实例查询对象//.createHistoricProcessInstanceQuery().taskAssignee(assignee)//依据接受人查询历史任务.list();//返回批量结果for (HistoricTaskInstance hti : htis) {System.out.println("ID:"+hti.getId()+",流程实例ID:"+hti.getProcessInstanceId()+",接收人:"+hti.getAssignee()+",运行对象ID:"+hti.getExecutionId());System.out.println("------------------------------------------------");}}
结果:
ID:704,流程实例ID:701,接收人:张三,运行对象ID:701
------------------------------------------------
ID:804,流程实例ID:801,接收人:张三,运行对象ID:801
------------------------------------------------
主要是查询act_hi_taskinst表中的数据
查询历史流程实例:
/*** 查询历史流程实例*/@Testpublic void queryHistoryPi(){HistoryService historyService = processEngine.getHistoryService();String pi = "701";List<HistoricProcessInstance> hpis = historyService.createHistoricProcessInstanceQuery()//创建历史流程实例查询对象.processInstanceId(pi).list();for (HistoricProcessInstance hpi : hpis) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("实例ID:"+hpi.getId()+",開始时间:"+sdf.format(hpi.getStartTime())+",结束时间:"+sdf.format(hpi.getEndTime()));System.out.println("-------------------------------------");}}
结果:
实例ID:701,開始时间:2014-10-22 17:03:04,结束时间:2014-10-23 15:25:03
-------------------------------------
主要是查询act_hi_procinst表中的数据
获取历史流程变量:
/*** 获取历史流程变量*/@Testpublic void getHistoryVariable(){HistoryService historyService = processEngine.getHistoryService();List<HistoricVariableInstance> hvis = historyService.createHistoricVariableInstanceQuery()//创建一个历史流程变量实例查询对象.variableName("key")//通过key查询.list();if (hvis != null) {for (HistoricVariableInstance hvi : hvis) {System.out.println("key:"+hvi.getVariableName()+",value:"+hvi.getValue());}}}
主要是查询act_hi_varinst表中的数据
查询历史活动信息:
/*** 查询历史活动信息* 主要查询的是act_hi_actinst表中的数据*/@Testpublic void queryHistoryAi(){String pi = "701";HistoryService historyService = processEngine.getHistoryService();List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery()//创建历史活动实例查询对象.processInstanceId(pi).list();for (HistoricActivityInstance hai : hais) {System.out.println("活动ID:"+hai.getActivityId()+",活动名称:"+hai.getActivityName()+",活动类型:"+hai.getActivityType()+",流程实例ID:"+hai.getProcessInstanceId()+",接收人:"+hai.getAssignee());System.out.println("--------------------------------");}}
结果:
活动ID:endevent1,活动名称:End,活动类型:endEvent,流程实例ID:701,接收人:null
--------------------------------
活动ID:startevent1,活动名称:Start,活动类型:startEvent,流程实例ID:701,接收人:null
--------------------------------
活动ID:员工请假,活动名称:员工请假,活动类型:userTask,流程实例ID:701,接收人:张三
--------------------------------
活动ID:老板审批,活动名称:老板审批,活动类型:userTask,流程实例ID:701,接收人:老板
--------------------------------
这几个是最经常使用的几个服务.
流程实例和运行对象的差别 流程实例和运行对象 2个是不同的一个概念
版权声明:本文博主原创文章。博客地址:http://blog.csdn.net/a67474506?
viewmode=contents
转载于:https://www.cnblogs.com/zfyouxi/p/4797460.html
activiti入门2流程引擎API和服务基础设施相关推荐
- 德玛西亚之WorkFlow(三)流程引擎配置与服务组件
德玛西亚之WorkFlow(三)流程引擎配置与服务组件 1 配置文件 1.1 默认配置文件 工作流引擎默认会加载ClassPath路径下的 activiti.cfg.xml 文件.这样并不实用使用 s ...
- 26、流程引擎API
API层次关系 流程引擎(ProcessEngine)是整个camunda工作流的大心脏,初始化好流程引擎,就可以通过它获取各种API的操作.提供的所有API都是线程安全的.结构如下: 核心对象 主要 ...
- 常用的Java流程引擎API开发调用接口大全-工作流引擎设计
关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 一.程序调用开发接口 二. 接口说明 所谓的驰骋工作流引擎的接口, ...
- flowable流程引擎基础概念总结
flowable数据库说明 ACT_RE_* : 'RE'表示repository(存储).RepositoryService接口操作的表.带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片 ...
- flowable流程引擎
Flowable流程引擎 一.流程引擎API和服务 引擎 API 是与 Flowable 交互的最常见方式.主要起点是 ProcessEngine,它可以通过多种方式创建,如配置部分所述.从 Proc ...
- 流程引擎课堂(一)| 关于开源流程引擎Activiti 的需要注意的几点
编者按:流程引擎在各个行业都有应用,其重要性不言而喻,充分了解流程引擎是一项重要课题.本文详细介绍了开源流程引擎Activiti 的优点与局限性,为流程引擎的选型提出了参考性建议. 基础概念 首先,我 ...
- Activiti入门基础
文章目录 一.Activiti入门 1 流程符号 事件 Event 1.1 活动 Activity 1.2 网关 GateWay 1.2.1 排他网关 (x) 1.2.2 并行网关 (+) 1.2.3 ...
- gee引擎mysql数据库如何假设_流程引擎SmartEngine 2.0 UserGuide
Overview SmartEngine 是阿里巴巴一款业务治理和服务编排引擎.业务治理引擎专注于解决互联网场景下和传统工作流行业的流程相关问题,服务编排引擎专注于用统一的标准来解决复杂链路服务上的服 ...
- 流程引擎课堂(二)| 基于开源流程引擎开发的BPM有那些难点?
编者按:开源流程引擎哪个好?如何基于开源流程引擎开发BPM,存在哪些难点?本文从国内流程引擎市场的难点出发,分析了其中的利弊. 企业的流转离不开流程,一个好的流程管理系统可以为企业增效降本,增强企业综 ...
最新文章
- Python爬虫入门并不难,就看你如何选择?
- An In-Depth Look at the HBase Architecture--转载
- Deployer 的使用
- linux 内存一直在增加,linux – 缓存内存和共享内存总和超过总内...
- Python工作笔记007---win10安装Python3.7.3_以及用pycharm创建Python项目_以及对System interpreter理解
- 确认过眼神,你是要来百度AI开发者实战营深圳站的人
- 为阿里云ECS服务器二级域名绑定tomcat子目录,实现一个IP多个二级域名
- TV TimeShift和PVR的区别
- 方差分析软件_手把手教你用Graphpad做单因素方差分析
- JNI详细调用(附带图文)
- 《计算机网络》谢希仁第七版知识点总结
- python 图像二值化处理
- Kubernetes 集群安全 - 鉴权 实战rolebinding和clusterrole
- imdb数据集电影评论分类
- uushare.com(原uubox.net)的功能简介
- linux木马查杀工具,【Kali】linux木马查杀
- 查看linux镜像版本的命令,Linux镜像列表中 怎样决定自己下载哪个版本
- VS Code 所选驱动器或UNC共享不存在或不可访问。请另外选择
- 远程传输大文件使用什么平台好呢?
- 【业务架构】价值链分析的直接指南