流程引擎的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的资源内容。
部署流程文件:
/** * 发布流程 * 发布流程后,流程文件会保存到数据库中 */@Testpublicvoid 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表 流程定义表 */@Testpublicvoid 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
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:Myprocess,KEY:myProcess,DEPLOYMENT_ID:601,VERSION:1,RESOURCE_NAME:MyLeave.bpmn,DGRM_RESOURCE_NAME:MyLeave.png------------------------------------------------ID:myProcess:2:809,NAME:Myprocess,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 */@Testpublicvoid showImg() throws IOException{String deploymentId = "601";//通过deploymentId获取资源名称List
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盘下查看 生成的照片
删除流程定义:
/** * 删除流程定义 */@Testpublicvoid delDeployment(){String deploymentId = "1";processEngine.getRepositoryService()//普通删除,删除没有在执行的流程,如果流程正在执行,则抛出异常//.deleteDeployment(deploymentId);//级联删除,不管你在不在运行,会删除当前关联的所有信息,包括在历史表里的数据.deleteDeployment(deploymentId, true);}
RuntimeService
获取方式:
//通过activiti.cfg.xml获取流程引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
启动一个流程实例:
/** * 启动流程实例 */@Testpublicvoid 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
表中插入一条记录
查询流程状态:
/** * 查看流程状态 */@Testpublicvoid 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设置流程变量 * 设置流程变量 */publicvoid 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();
查看个人任务:
/** * 查看任务 */@Testpublicvoid queryTask(){//获取任务服务对象TaskService taskService = processEngine.getTaskService();//根据接受人查询该用户的任务List
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,姓名:员工请假,接收人:张三,开始时间:WedOct 22 17:03:04CST 2014ID:804,姓名:员工请假,接收人:张三,开始时间:ThuOct 23 11:27:47CST 2014
除了个人任务 还有 组任务
办理任务:
/** * 办理任务 */@Testpublicvoid 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();
查询历史任务:
/** * 查询历史任务 */@Testpublicvoid queryHistoryTask(){String assignee = "张三";HistoryService historyService = processEngine.getHistoryService();List
htis = historyService.createHistoricTaskInstanceQuery()
//创建历史任务查询对象
//创建一个历史详细信息查询对象
//.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
表中的数据
/** * 查询历史流程实例 */@Testpublicvoid queryHistoryPi(){HistoryService historyService = processEngine.getHistoryService();String pi = "701";List
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 表中的数据
获取历史流程变量:
/** * 获取历史流程变量 */@Testpublicvoid getHistoryVariable(){HistoryService historyService = processEngine.getHistoryService();List
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表中的数据 */@Testpublicvoid queryHistoryAi(){String pi = "701";HistoryService historyService = processEngine.getHistoryService();List
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,接收人:老板--------------------------------
这几个是最常用的几个服务.
流程引擎的API和服务基础的更多相关文章
- activiti入门2流程引擎的API和服务基础
RepositoryService : 管理和控制发布包和流程定义(包含了一个流程每个环节的结构和行为)的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部和特定 ...
- 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解
流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...
- activiti入门2流程引擎API和服务基础设施
RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...
- 低代码平台--基于surging开发微服务编排流程引擎构思
前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...
- 微服务基础——厉害了!API网关
微服务刚刚诞生的时候,人们将服务进行拆分,实现服务之间的松耦合,并且每个服务有专门的团队维护,然后客户端直接和各个子服务进行交互.比如,订单,商品,会员服务. 那么这种客户端直接和后端服务交互的方式会 ...
- 从零开始学习和改造activiti流程引擎的13天,自己记录一下
day#1(11.13) 尝试通过spring boot 集成最新版activiti 7,但是苦于官方的文档基本为空,无法完成spring boot的配置,最终按照activiti 6的文档,手工初始 ...
- 揭秘jbpm流程引擎内核设计思想及构架
揭秘jbpm流程引擎内核设计思想及构架 作者 胡长城(银狐999) 1 前言 2 阅读本篇的基础准备 2.1 概念的基础 2.2 环境的基础 3 什么是 ...
- Camunda 流程引擎的一种 Adapter 层实现
上一篇说明了选择 Camunda 的理由.这一篇说明如何实现适配层. 当前还没有专门写一篇对 Camunda 各个功能的详细介绍.如果要获得比较直观的感受,可以下载 Modeler 或者使用在线版的 ...
- 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)
https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...
随机推荐
- iOS后台如何保持socket长连接和数据传输
工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭 ...
- 转载——有感于三个50岁的美国程序员的生活状态与IT职业杂想
明天就是国庆节了,今天也不想干活干的太累了!写一篇以前去美国出差的杂想,对比于美国50多岁的程序员和大多数50多岁国内父母的生活状态有感而发. 前几年正好有一个项目的机会出差去了一次美国,地点是美国中 ...
- error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : er
转: http://blog.csdn.net/bill_ming/article/details/8150111 opengl的高级菜鸟问题 看了一本书<OpenGL三维图形系统开发与应用技术 ...
- php 修改 AppServ 下Apache 端口
php 修改 AppServ 下Apache 端口 步骤一:把 C:\AppServ\Apache2.2\conf 中httpd.conf修改了 还不正确 步骤二:把httpd.conf 中List ...
- Spark源码分析(三)-TaskScheduler创建
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3879151.html 在SparkContext创建过程中会调用createTaskScheduler函 ...
- lintcode:等价二叉树
等价二叉树 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等. 样例 1 1 / \ / \ 2 2 and 2 2 / / 4 4 就是 ...
- ubuntu下搭建cocos2dx编程环境-中
上篇文章里讲了在ubuntu下部署cocos2d-x开发环境,这篇文章主要示范在ubuntu下部署cocos2d-x android开发环境.分开写就是因为我看很多文章里都将这两件事情混杂着写 ...
- linuxlcd驱动程序编写 mini2440(w35)
先说lcd驱动的框架吧! lcd驱动也有自己的框架,如果没有框架,要我们自己完成所有lcd驱动的代码编写那将是很痛苦的一件事. lcd驱动主要依赖于一个文件,fbmem.c 其实它还依赖几个文件 不 ...
- ES6入门之Symbol
ES5对象属性名都是字符串容易造成属性名的冲突. eg:var a = { name: 'lucy'}; a.name = 'lili';这样就会重写属性 ES6引入了一种新的原始数据类型Symbol ...
- SQL Server 数据库初始化准备脚本
通常我们在项目部署前都会写一份数据库初始化脚本.由于数据库外键的限制,我们需要按照数据引用顺序添加初始记录,这个整理过程相当麻烦. 因此写了以下脚本,原理是先去掉所有外键,然后执行一次清空,然后添加数 ...