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 ...
随机推荐
- springboot启动器:spring-boot-starter
今天想要导入thymeleaf的依赖,但是又不想从其他博复制粘贴,于是去spring官方文档找一找 在idea新建的springbootweb项目中,有一个HELP.md文件,里面包含spring w ...
- js input框限制输入为数字并限制长度
<input type="number" name="price" id="priceVal" placeholder="请 ...
- java_List接口
/** * java.util.list接口 extends Collection接口 * 1.有序的集合 * 2.有索引 * 3.元素可以重复 * * List中带索引的方法: *add:添加 * ...
- (转)nginx下基于ThinkPHP框架的网站url重写
nginx下基于ThinkPHP框架的网站url重写nginx下的基于thinkphp的应用的url重写,需了解thinkphp的各种url格式参数的处理逻辑以及nginx重写的原理.简单点说,无论哪 ...
- JS规则 确定你的存在(变量声明) 声明变量语法: var 变量名; 一次声明多个,中间用逗号隔开var num1,mun2 ;
确定你的存在(变量声明) 我们要使用盒子装东西,是不是先要找到盒子,那在编程中,这个过程叫声明变量,找盒子的动作,如何表示: 声明变量语法: var 变量名; var就相当于找盒子的动作,在JavaS ...
- memcache 使用手册
Memcached 教程 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fit ...
- 【期望DP】[zoj3329]One Person Game
题描: 有三个均匀的骰子,分别有k1,k2,k3个面,初始分数是0, 当掷三个骰子的点数分别为a,b,c的时候,分数清零,否则分数加上三个骰子的点数和, 当分数>n的时候结束.求需要掷骰子的次数 ...
- 踩坑记-java mysql 新增获取主键、DIY主键、UUID
java mysql 获取主键.DIY主键.UUID,简单粗暴,代码如下: mapper.xml insert id="add" parameterType="com.x ...
- Codeforces 548E Mike ans Foam (与质数相关的容斥多半会用到莫比乌斯函数)
题面 链接:CF548E Description Mike is a bartender at Rico's bar. At Rico's, they put beer glasses in a sp ...
- bzoj1433 假期的宿舍
题意:给你一些人可以睡某某人的床,问是否有所有人都睡下的方案?n<=50. 二分图最大匹配. 用邻接矩阵比较舒服. 标程: #include<cstdio> #include< ...