1、创建流程引擎对象

private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

2、发布一个流程

     /**
* 2、发布一个流程
*/
@Test
public void testDeployProcess() {
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder builder = repositoryService.createDeployment();
// 加载发布资源
builder.name("UserTask共有任务流程测试") // 设置流程显示别名
.addClasspathResource("userPublicTask.bpmn") // 设置流程规则文件
.addClasspathResource("userPublicTask.png"); // 设置流程规则的图片
// 发布流程
builder.deploy();
}

3、启动流程、执行任务,并查看状态

     /**
* 3、启动流程、执行任务,并查看状态
*/
@Test
public void testUserTask() {
//1.获取RuntimeService服务对象的实例
RuntimeService runtimeService = processEngine.getRuntimeService();
String processDefinitionKey = "userPublicTask";
//2.自动执行与Key相对应的流程的最高版本
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String processInstanceId = processInstance.getId();
logger.info("processInstanceId:" + processInstance.getId()); //3.获取TaskService服务对象的实例
TaskService taskService = processEngine.getTaskService();
//4.私有任务执行
//4.1、获取私有任务
String assignee = "取号";
List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
Assert.assertEquals(, tasks.size());
Task task = tasks.get();
logger.info("taskName:" + task.getName());
Assert.assertEquals("取号",task.getName()); //4.2完成任务
taskService.complete(task.getId()); //4.3检查流程状态
ProcessInstance p1 = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
Assert.assertNotNull(p1);
logger.info("取号私有任务流程成功执行!"); //5、共有任务执行
//5.1、确认柜员1私有任务列表中没有相关任务
String assignee1 = "柜员1";
List<Task> tasks1 = taskService.createTaskQuery().taskAssignee(assignee1).list();
Assert.assertEquals(, tasks1.size());
logger.info("柜员1的私有任务数量:" + tasks1.size()); //5.2、确认柜员2私有任务列表中没有相关任务
String assignee2 = "柜员2";
List<Task> tasks2 = taskService.createTaskQuery().taskAssignee(assignee2).list();
Assert.assertEquals(, tasks2.size());
logger.info("柜员2的私有任务数量:" + tasks1.size()); //5.3、获取共有任务列表
//5.3.1、获取柜员1共有任务列表
String candidateUser1 = "柜员1";
List<Task> tasks3 = taskService.createTaskQuery().taskCandidateUser(candidateUser1).orderByTaskCreateTime().desc().list();
Task task3 = tasks3.get();
logger.info("柜员1的共有任务数量:" + tasks3.size() + " ID: " + task3.getId() + " Name: " + task3.getName()); //5.3.2、获取柜员2共有任务列表
String candidateUser2 = "柜员2";
List<Task> tasks4 = taskService.createTaskQuery().taskCandidateUser(candidateUser2).orderByTaskCreateTime().desc().list();
Task task4 = tasks4.get();
logger.info("柜员2的共有任务数量:" + tasks4.size() + " ID: " + task4.getId() + " Name: " + task4.getName()); //5.4、柜员2受理任务
taskService.claim(task4.getId(), "柜员2");
logger.info("柜员2受理任务!"); //5.5、查看柜员1和柜员2的私有与共有任务数量
String assignee3 = "柜员1";
List<Task> tasks5 = taskService.createTaskQuery().taskAssignee(assignee3).list();
logger.info("柜员1的私有任务数量:" + tasks5.size()); String assignee4 = "柜员2";
List<Task> tasks6 = taskService.createTaskQuery().taskAssignee(assignee4).list();
logger.info("柜员2的私有任务数量:" + tasks6.size()); String candidateUser3 = "柜员1";
List<Task> tasks7 = taskService.createTaskQuery().taskCandidateUser(candidateUser3).orderByTaskCreateTime().desc().list();
logger.info("柜员1的共有任务数量:" + tasks7.size()); String candidateUser4 = "柜员2";
List<Task> tasks8 = taskService.createTaskQuery().taskCandidateUser(candidateUser4).orderByTaskCreateTime().desc().list();
logger.info("柜员2的共有任务数量:" + tasks8.size()); //5.6、柜员2完成任务
taskService.complete(task4.getId()); //5.6检查结束状态
ProcessInstance p2 = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
Assert.assertNull(p2);
logger.info("UserTask共有任务流程成功执行!");
}

4、执行结果

[INFO][2015-12-02 10:09:44,768][com.mcs.activiti.test.TestPublicUserTask]processInstanceId:115001
[INFO][2015-12-02 10:09:44,792][com.mcs.activiti.test.TestPublicUserTask]taskName:取号
[INFO][2015-12-02 10:09:45,003][com.mcs.activiti.test.TestPublicUserTask]取号私有任务流程成功执行!
[INFO][2015-12-02 10:09:45,010][com.mcs.activiti.test.TestPublicUserTask]柜员1的私有任务数量:0
[INFO][2015-12-02 10:09:45,016][com.mcs.activiti.test.TestPublicUserTask]柜员2的私有任务数量:0
[INFO][2015-12-02 10:09:45,036][com.mcs.activiti.test.TestPublicUserTask]柜员1的共有任务数量:1 ID: 115007 Name: 取钱
[INFO][2015-12-02 10:09:45,041][com.mcs.activiti.test.TestPublicUserTask]柜员2的共有任务数量:1 ID: 115007 Name: 取钱
[INFO][2015-12-02 10:09:45,117][com.mcs.activiti.test.TestPublicUserTask]柜员2受理任务!
[INFO][2015-12-02 10:09:45,126][com.mcs.activiti.test.TestPublicUserTask]柜员1的私有任务数量:0
[INFO][2015-12-02 10:09:45,138][com.mcs.activiti.test.TestPublicUserTask]柜员2的私有任务数量:1
[INFO][2015-12-02 10:09:45,159][com.mcs.activiti.test.TestPublicUserTask]柜员1的共有任务数量:0
[INFO][2015-12-02 10:09:45,162][com.mcs.activiti.test.TestPublicUserTask]柜员2的共有任务数量:0
[INFO][2015-12-02 10:09:45,256][com.mcs.activiti.test.TestPublicUserTask]UserTask共有任务流程成功执行!

5、共有流程定义 userPublicTask.bpmn

 <?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:xsd="http://www.w3.org/2001/XMLSchema" 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="userPublicTask" name="共有任务" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="取号" name="取号" activiti:assignee="取号"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="取号"></sequenceFlow>
<userTask id="取钱" name="取钱" activiti:candidateUsers="柜员1,柜员2"></userTask>
<sequenceFlow id="flow3" sourceRef="取号" targetRef="取钱"></sequenceFlow>
<endEvent id="endevent2" name="End"></endEvent>
<sequenceFlow id="flow4" sourceRef="取钱" targetRef="endevent2"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_userPublicTask">
<bpmndi:BPMNPlane bpmnElement="userPublicTask" id="BPMNPlane_userPublicTask">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="335.0" y="40.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="取号" id="BPMNShape_取号">
<omgdc:Bounds height="55.0" width="105.0" x="300.0" y="110.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="取钱" id="BPMNShape_取钱">
<omgdc:Bounds height="55.0" width="105.0" x="300.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent2" id="BPMNShape_endevent2">
<omgdc:Bounds height="35.0" width="35.0" x="335.0" y="310.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="352.0" y="75.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="110.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="352.0" y="165.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="210.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="352.0" y="265.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="310.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

Activiti学习笔记9 — UserTask共有任务的使用的更多相关文章

  1. Activiti学习笔记8 — UserTask私有任务的使用

    每一个UserTask都会在Execution表和Task表中各产生一条记录 一.创建流程引擎对象 /** * 1.创建流程引擎对象 */ private ProcessEngine processE ...

  2. Activiti学习笔记目录

    1.Activiti学习笔记1 — 下载与开发环境的配置: 2.Activiti学习笔记2 — HelloWorld: 3.Activiti学习笔记3 — 流程定义: 4.Activiti学习笔记4 ...

  3. activiti学习笔记一

    activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...

  4. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

  5. Activiti 学习笔记记录(二)

    上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...

  6. activiti学习笔记二

    上一篇文章大概讲了下什么是流程引擎,为什么我们要用流程引擎,他的基本原理是啥,以及怎么进行基本的使用,这篇文章我们再讲下其他的一些使用. 删除流程部署 package activiti02; impo ...

  7. Activiti 学习笔记(2016-8-30)

    前言 不管学习什么,都必须对知识体系中专有的名词或者特定的语言组织方式 有所了解. 本文仅记录学习过程中的笔记,参考意义因人而定,不保证所言全部正确. 学习方式,百度传课的视频<权威Activi ...

  8. Activiti 学习笔记记录

    官方在线用户手册(英文版):http://activiti.org/userguide/index.html 中文用户手册:http://www.mossle.com/docs/activiti/in ...

  9. Activiti学习笔记10 — 动态任务分配

    动态任务分配使用的两种方式 一.通过特殊表达式,来获取任务信息 ,在流程 UserTask节点上设置 ${流程变量的Key} 1.流程定义 <?xml version="1.0&quo ...

随机推荐

  1. 3.4 redux 异步

    在大多数的前端业务场景中,需要和后端产生异步交互,在本节中,将详细讲解 redux 中的异步方案以及一些异步第三方组件,内容有: redux 异步流 redux-thunk redux-promise ...

  2. SDUTOJ 2498 数据结构实验之图论十一:AOE网上的关键路径

    题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2498.html 题目大意 略. 分析 ...

  3. 基础补充(四)——流程控制之if、while、for,break与continue

     流程控制 一.流程控制之if……else…… if 条件1: 缩进的代码块 elif 条件2: 缩进的代码块 elif 条件3: 缩进的代码块 ...... else: 缩进的代码块 二.流程控制之 ...

  4. what codes does sudo command do in Linux?

    sometime, to make your change of configuration file be effective to web application, we have to rest ...

  5. docker Dockerfile学习---构建mongodb环境

    1.创建项目目录并上传包 mkdir centos_mongodb cd centos_mongodb .tgz 2.编辑配置文件 vi mongodb.conf dbpath = /data/usr ...

  6. 启动eclipse出现JVM terminated. Exit code=127 错误解决办法

    https://blog.csdn.net/wpzsidis/article/details/72954387 进去第二次又错

  7. PHP之区域块链

    搭建一个最简单的区块链吧.代码简单易懂. <?php //区域块链 //block 区块 // chain 链 //data  //之前区块的has值 //自己的has值 : 他是由存储在区块链 ...

  8. ElementUI的Loading组件 —— 想实现在请求后台数据之前开启Loading组件,请求成功或失败之后,关闭Loading组件

    我在实际项目开发中,遇到了这个需求,记录一下~~~~~~ 在ElementUI官网上有几种实现Loading的方法,但官网上是在一个方法里写了开启与关闭组件,所以可以根据官网的实现方法进行一个封装,便 ...

  9. pycharm 2020 激活码 破解教程

    以下是安装完pycharm后进行破解!!   1.修改hosts,在hosts文件最后添加2行“0.0.0.0 account.jetbrains.com”和“0.0.0.0 www.jetbrain ...

  10. CSS盒模型及应用

    其实,CSS就三个大模块: 盒子模型 . 浮动 . 定位,其余的都是细节.要求这三部分,无论如何也要学的非常精通. 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就是一个盛装内容的容器 ...