Activiti实战04_简单流程
在Activiti实战03_Hello World中我们介绍了一个中间没有任何任务的流程,实现了流程的部署与查阅,而在本章中,将会为流程添加任务节点,是流程能够像个流程,变得更加丰满起来。
在上一节的基础上,我门将会为流程添加实际业务使其能够正常工作起来,先模拟一个很简单的请假流程。
首先,在上一节的流程图中为流程添加一个用户任务(userTask)来处理申请,根据申请内容来决定运行申请还是驳回申请。流程图如下:

代码清单,由于篇幅的原因,这里就不在列出任务的坐标位置等信息
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="deptLeaderAudit" name="领导审批" activiti:candidateGroups="deptLeader"></userTask>
<sequenceFlow id="flow1" name="to User Task" sourceRef="startevent1" targetRef="deptLeaderAudit"></sequenceFlow>
<scriptTask id="outputAuditResult" name="输出审批结果" scriptFormat="groovy" activiti:autoStoreVariables="false">
<script>out:println "applyUser:" + applyUser +" ,days:"+ days +",approval:" + approved;</script>
</scriptTask>
<sequenceFlow id="flow2" name="to Script Task" sourceRef="deptLeaderAudit" targetRef="outputAuditResult"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow3" name="to End" sourceRef="outputAuditResult" targetRef="endevent1"></sequenceFlow>
</process>
</definitions>
简单说一下这个代码清单里值得注意的地方,首先增加了两个任务节点,即<userTask></userTask>标签和<scriptTask></scriptTask>标签中所包含的内容,因为有四个节点,自然会产生三条连线,即<sequenceFlow></sequenceFlow>之间的内容,id分别为flow1,flow2,fow3,,对于scriptTask而言,因为采用了groovy的语法,所以需要导入相关jar包或添加相关依赖。
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
</dependency>
测试:
代码清单
public class SimpleLeaveProcessTest {
@Test
public void testStartProcess(){
// 创建流程引擎,使用内存数据库
ProcessEngine processEngine = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration()
.buildProcessEngine();
// 部署流程定义文件
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("diagrams/SimpleLeave.bpmn")
.deploy();
// 验证已部署的流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.singleResult();
assertEquals("myProcess",processDefinition.getKey());
// 启动流程并返回流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
//设置流程变量
Map<String, Object> variables = new HashMap<String,Object>();
variables.put("applyUser", "employee1");
variables.put("days", 3);
//带着流程变量开启流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myProcess",variables);
assertNotNull(instance);
System.out.println("pid = " +instance.getId() +", pdid = " + instance.getProcessDefinitionId() );
//获取任务服务
TaskService taskService = processEngine.getTaskService();
//获取领导审批任务
Task taskOfDeptLeader = taskService.createTaskQuery()
.taskCandidateGroup("deptLeader")
.singleResult();
assertNotNull(taskOfDeptLeader);
//验证任务是否为领导审批任务
assertEquals("领导审批", taskOfDeptLeader.getName());
//作为有权处理的组角色,拾取任务,此时相同角色的其他人便看不到该任务了
taskService.claim(taskOfDeptLeader.getId(), "leaderUser");
variables = new HashMap<String,Object>();
// 再次设置流程变量
variables.put("approved", true);
// 带着流程变量完成任务
taskService.complete(taskOfDeptLeader.getId(),variables);
// 由于任务已经完成,所以不再是改组角色拥有的任务,此时就查不到任务了
taskOfDeptLeader = taskService.createTaskQuery()
.taskCandidateGroup("deptLeader")
.singleResult();
assertNull(taskOfDeptLeader);
// 任务已经走完就会归到历史里面,所以这里从历史中查数据
HistoryService historyService = processEngine.getHistoryService();
long count = historyService.createHistoricProcessInstanceQuery()
.finished()
.count();
//判断是否有一个任务已完成,并处于历史状态
assertEquals(1, count);
}
}
代码解释:
在上一章中,我们是直接开启了流程,然后就直接走向了结束。在这章中,因为存在任务节点的关系,一旦开启流程,便会走到任务节点处,此处就是【领导审批】任务节点,而这次开启流程的方式也和上一章有所不同,这章是带着流程变量开启的流程,上一章则是直接开启流程,至于流程变量是什么,你可以这样理解,就好比你去菜市场买鱼,走了好几家,挑了好几条,终于挑到了一条让自己满意的鱼了,然后就高高兴兴的带着鱼回家了,在Activiti中,流程变量也是一样的,只要是同名的流程变量,便会采用顶替的原则,就好比你挑了好几条一样,每次只是替换,并不改变鱼这个种类,然后只有最后一次的有效,无论中间发生了多少次改变(前提是在你用这个流程变量之前的最后一次改变)。说完了流程变量,我们也开启了流程,接下来因为用户任务的存在,所以流程会阻塞在用户任务那里,直到有人接收并处理了任务,才会转到下一步(依照目前的流程图是这样的),存在一个用户拾取了任务,并完成了任务,就会继续往下走,由于是脚本任务,所以在执行完后流程就直接结束了,就只能从历史中查了。至此,一个简单的请假流程就算是完成了。
Activiti实战04_简单流程的更多相关文章
- 2017.2.20 activiti实战--第二章--搭建Activiti开发环境及简单示例(二)简单示例
学习资料:<Activiti实战> 第一章 搭建Activiti开发环境及简单示例 2.5 简单流程图及其执行过程 (1)leave.bpmn 后缀名必须是bpmn.安装了activiti ...
- activiti实战--第二章--搭建Activiti开发环境及简单示例
(一)搭建开发环境 学习资料:<Activiti实战> 第一章 认识Activiti 2.1 下载Activiti 官网:http://activiti.org/download.html ...
- 2017.2.28 activiti实战--第五章--用户与组及部署管理(三)部署流程及资源读取
学习资料:<Activiti实战> 第五章 用户与组及部署管理(三)部署流程及资源读取 内容概览:如何利用API读取已经部署的资源,比如读取流程定义的XML文件,或流程对应的图片文件. 以 ...
- 2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源
学习资料:<Activiti实战> 第五章 用户与组及部署管理(二)部署流程资源 内容概览:讲解流程资源的读取与部署. 5.2 部署流程资源 5.2.1 流程资源 流程资源常用的有以下几种 ...
- 2017.2.20 activiti实战--第二章--搭建Activiti开发环境及简单示例(一)搭建开发环境
学习资料:<Activiti实战> 第一章 认识Activiti 2.1 下载Activiti 官网:http://activiti.org/download.html 进入下载页后,可以 ...
- Activiti就是这么简单
Activiti介绍 什么是Activiti? Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理.工作流.服务协作等领域的一个开 ...
- activiti实战--第一章--认识Activiti
学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis ...
- [转] electron实战开发详细流程
[From] http://www.myk3.com/arc-8856.html 很久没有更新博客,人越来越懒了,唉 说好做的electron教程距离上次玩electron已经过去了好几个月了.. 这 ...
- 2017.3.14 activiti实战--第二十章--REST服务
学习资料:<Activiti实战> 第二十章 REST服务 20.1 通信协议概述 略. 20.2 REST API概述 资源分类 资源基础URI 说明 Deployments manag ...
随机推荐
- vs2017 Visual Studio 离线安装方法
转自:http://www.jb51.net/softjc/539858.html 第一部分:离线下载安装文件 这里描述是包括所有版本,截图以下载VS2017社区版为例: ①登入VS官网下载页面,选择 ...
- DXP 笔记
1. 从原理图上添加 net class,快捷键 : P -> V -> C
- Jan&Feb 工作总结
一.工作任务: 熟悉dcbi项目(运维经分系统),完成指定需求. 熟悉bi项目(数据分析平台),完成指定需求. steel circus 主机游戏官网制作. 一拳超人游戏预注册页wap手机端制作. 二 ...
- 次短路 /// dijkstra oj1597
题目大意: 给出一个有向图,求从 顶点a 到 顶点b 的次短路. 第一行是2个正整数 n 和 e,表示该有向图的顶点数和边数.3 < n ≤ 5000 , 3 < e < 40000 ...
- Pthread spinlock自旋锁
锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护. Pthreads提供了多种锁机制,常见的有:1) Mutex(互斥量): ...
- 内核下枚举进程 (二)ZwQuerySystemInformation
说明: SYSTEM_INFORMATION_CLASS 的5号功能枚举进程信息.其是这个函数对应着ring3下的 NtQuerySystemInformation,但msdn上说win8以后ZwQu ...
- axios——post请求时把对象obj数据转为formdata格式
转载自:https://blog.csdn.net/feizhong_web/article/details/80514436 在调用后台接口的时候,上传报名信息,利用axios 的post请求,发 ...
- 中国剩余定理模数互质的情况模板(poj1006
http://poj.org/problem?id=1006 #include <iostream> #include <cstdio> #include <queue& ...
- 小程序关闭时暂停webview里的音乐
document.addEventListener("visibilitychange", () => { if(document.hidden) { // 页面被 ...
- mysql order by排序查询速度问题
SELECT * FROM `assets_message` LEFT JOIN purchase_message ON assets_message.purchase_id = purchase_m ...