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的资源内容。
部署流程文件:
/**
* 公布流程
* 公布流程后。流程文件会保存到数据库中
*/
@Test
public 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表 流程定义表
*/
@Test
public 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
*/
@Test
public 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盘下查看 生成的照片
删除流程定义:
/**
* 删除流程定义
*/
@Test
public void delDeployment(){
String deploymentId = "1";
processEngine.getRepositoryService()
//普通删除,删除没有在运行的流程,假设流程正在运行,则抛出异常
//.deleteDeployment(deploymentId);
//级联删除,无论你在不在运行,会删除当前关联的全部信息,包含在历史表里的数据
.deleteDeployment(deploymentId, true);
}
RuntimeService
获取方式:
//通过activiti.cfg.xml获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
启动一个流程实例:
/**
* 启动流程实例
*/
@Test
public 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表中插入一条记录
查询流程状态:
/**
* 查看流程状态
*/
@Test
public 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();
查看个人任务:
/**
* 查看任务
*/
@Test
public 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
除了个人任务 还有 组任务
办理任务:
/**
* 办理任务
*/
@Test
public void startTask(){
TaskService taskService = processEngine.getTaskService();
//taskId 就是查询任务中的 ID
String taskId = "704";
//完毕请假申请任务
taskService.complete(taskId );
}
taskService 和 runtimeService 一样都是能够设置流程变量的
HistoryService
获取方式:
//通过activiti.cfg.xml获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
查询历史任务:
/**
* 查询历史任务
*/
@Test
public 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表中的数据
查询历史流程实例:
/**
* 查询历史流程实例
*/
@Test
public 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表中的数据
获取历史流程变量:
/**
* 获取历史流程变量
*/
@Test
public 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表中的数据
*/
@Test
public 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
activiti入门2流程引擎API和服务基础设施的更多相关文章
- 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解
流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...
- activiti入门2流程引擎的API和服务基础
RepositoryService : 管理和控制发布包和流程定义(包含了一个流程每个环节的结构和行为)的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部和特定 ...
- activiti学习3:流程引擎对象和流程引擎配置对象
目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...
- asp.net开源流程引擎API开发调用接口大全-工作流引擎设计
关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 一.程序调用开发接口二. 接口说明 所谓的驰骋工作流引擎的接口,在B ...
- 基于开源流程引擎开发BPM或OA有哪些难点
前言 如何基于开源流程引擎开发OA系统?开源流程引擎哪个好?把它整合到自己的产品里难不难,有没有啥风险?这是大家经常遇到的问题.笔者从2006年开始参与流程引擎开发,经历了三代流程引擎研发,支 ...
- camunda流程引擎概念术语
前言 本文重点介绍开源流程引擎camunda的核心概念,这些概念同样适用于JBMP.Activiti.Flowable流程引擎,了解这些基本概念和原理,使用流程引擎API将更得心应手. 一.Proce ...
- 流程引擎的API和服务基础
RepositoryService : 管理和控制 发布包 和 流程定义(包含了一个流程每个环节的结构和行为) 的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部 ...
- Activiti入门 -- 环境搭建和核心API简介
相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 -- 轻松解读数据库> 本章内容,主要讲解Activiti框架环境的搭建,能够使用Activi ...
- 从零开始学习和改造activiti流程引擎的13天,自己记录一下
day#1(11.13) 尝试通过spring boot 集成最新版activiti 7,但是苦于官方的文档基本为空,无法完成spring boot的配置,最终按照activiti 6的文档,手工初始 ...
随机推荐
- 【原创】leetCodeOj --- Dungeon Game 解题报告
原题地址: https://oj.leetcode.com/problems/dungeon-game/ 题目内容: The demons had captured the princess (P) ...
- ubuntu下安装wine
直接在终端里面输入“sudo apt-get install wine”不要引号,即可安装wine.至于使用它,终端命令就是“wine ....”举个例子,你现在要运行魔兽, 然后你的魔兽的文件夹的位 ...
- Android Volley 之自定义Request
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837 今天群里一哥们需要自定义Volley的Request的例子,于是产生 ...
- Windows下Git服务器搭建[转]
Windows下Git服务器搭建 作为对前两天Git服务器搭建的一个整理,我想分别从服务端和客户端两个角度来记录下整个搭建过程,为了达到目标,我们需要哪些操作. (一)服务端软件和账号的安装配置 ...
- 文件翻译002片:Process Monitor帮助文档(Part 2)
[筛选亮点] Process Monitor提供了一些方式来配置筛选器和高亮显示. 筛选器的包括与排除 您能够在筛选器中指定事件的属性,这样就能够令Process Monitor仅显示 ...
- java提高篇(三)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- Java下拼接执行动态SQL语句(转)
在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...
- 8.Eclipse中创建Maven Web项目
第一步: 创建maven webproject 注意以下一步: 第二步: 继承parent 改动pom.xml文件例如以下 <projectxmlns="http://maven ...
- 对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator)
原文:对比Windows 8模拟器(Simulator)和Windows Phone仿真器(Emulator) 从事移动应用开发,经常会用到模拟器(Simulator)和仿真器(Emulator),本 ...
- App如何选择移动广告平台,开发者2 - 移动变现模式分析
开发人员社区的上述分析.它可能无法覆盖全部,但是,每一个开发者都需要根据自己的特点变现模式选择.继App流动性模式做了全面的分析. 游戏.广告.电商是互联网的三种变现模式,移植到移动互联网也相同适用. ...