1、创建流程引擎对象

private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

2、发布一个流程

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

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

  1. /**
  2. * 3、启动流程、执行任务,并查看状态
  3. */
  4. @Test
  5. public void testUserTask() {
  6. //1.获取RuntimeService服务对象的实例
  7. RuntimeService runtimeService = processEngine.getRuntimeService();
  8. String processDefinitionKey = "userPublicTask";
  9. //2.自动执行与Key相对应的流程的最高版本
  10. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
  11. String processInstanceId = processInstance.getId();
  12. logger.info("processInstanceId:" + processInstance.getId());
  13.  
  14. //3.获取TaskService服务对象的实例
  15. TaskService taskService = processEngine.getTaskService();
  16. //4.私有任务执行
  17. //4.1、获取私有任务
  18. String assignee = "取号";
  19. List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
  20. Assert.assertEquals(, tasks.size());
  21. Task task = tasks.get();
  22. logger.info("taskName:" + task.getName());
  23. Assert.assertEquals("取号",task.getName());
  24.  
  25. //4.2完成任务
  26. taskService.complete(task.getId());
  27.  
  28. //4.3检查流程状态
  29. ProcessInstance p1 = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  30. Assert.assertNotNull(p1);
  31. logger.info("取号私有任务流程成功执行!");
  32.  
  33. //5、共有任务执行
  34. //5.1、确认柜员1私有任务列表中没有相关任务
  35. String assignee1 = "柜员1";
  36. List<Task> tasks1 = taskService.createTaskQuery().taskAssignee(assignee1).list();
  37. Assert.assertEquals(, tasks1.size());
  38. logger.info("柜员1的私有任务数量:" + tasks1.size());
  39.  
  40. //5.2、确认柜员2私有任务列表中没有相关任务
  41. String assignee2 = "柜员2";
  42. List<Task> tasks2 = taskService.createTaskQuery().taskAssignee(assignee2).list();
  43. Assert.assertEquals(, tasks2.size());
  44. logger.info("柜员2的私有任务数量:" + tasks1.size());
  45.  
  46. //5.3、获取共有任务列表
  47. //5.3.1、获取柜员1共有任务列表
  48. String candidateUser1 = "柜员1";
  49. List<Task> tasks3 = taskService.createTaskQuery().taskCandidateUser(candidateUser1).orderByTaskCreateTime().desc().list();
  50. Task task3 = tasks3.get();
  51. logger.info("柜员1的共有任务数量:" + tasks3.size() + " ID: " + task3.getId() + " Name: " + task3.getName());
  52.  
  53. //5.3.2、获取柜员2共有任务列表
  54. String candidateUser2 = "柜员2";
  55. List<Task> tasks4 = taskService.createTaskQuery().taskCandidateUser(candidateUser2).orderByTaskCreateTime().desc().list();
  56. Task task4 = tasks4.get();
  57. logger.info("柜员2的共有任务数量:" + tasks4.size() + " ID: " + task4.getId() + " Name: " + task4.getName());
  58.  
  59. //5.4、柜员2受理任务
  60. taskService.claim(task4.getId(), "柜员2");
  61. logger.info("柜员2受理任务!");
  62.  
  63. //5.5、查看柜员1和柜员2的私有与共有任务数量
  64. String assignee3 = "柜员1";
  65. List<Task> tasks5 = taskService.createTaskQuery().taskAssignee(assignee3).list();
  66. logger.info("柜员1的私有任务数量:" + tasks5.size());
  67.  
  68. String assignee4 = "柜员2";
  69. List<Task> tasks6 = taskService.createTaskQuery().taskAssignee(assignee4).list();
  70. logger.info("柜员2的私有任务数量:" + tasks6.size());
  71.  
  72. String candidateUser3 = "柜员1";
  73. List<Task> tasks7 = taskService.createTaskQuery().taskCandidateUser(candidateUser3).orderByTaskCreateTime().desc().list();
  74. logger.info("柜员1的共有任务数量:" + tasks7.size());
  75.  
  76. String candidateUser4 = "柜员2";
  77. List<Task> tasks8 = taskService.createTaskQuery().taskCandidateUser(candidateUser4).orderByTaskCreateTime().desc().list();
  78. logger.info("柜员2的共有任务数量:" + tasks8.size());
  79.  
  80. //5.6、柜员2完成任务
  81. taskService.complete(task4.getId());
  82.  
  83. //5.6检查结束状态
  84. ProcessInstance p2 = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  85. Assert.assertNull(p2);
  86. logger.info("UserTask共有任务流程成功执行!");
  87. }

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <process id="userPublicTask" name="共有任务" isExecutable="true">
  4. <startEvent id="startevent1" name="Start"></startEvent>
  5. <userTask id="取号" name="取号" activiti:assignee="取号"></userTask>
  6. <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="取号"></sequenceFlow>
  7. <userTask id="取钱" name="取钱" activiti:candidateUsers="柜员1,柜员2"></userTask>
  8. <sequenceFlow id="flow3" sourceRef="取号" targetRef="取钱"></sequenceFlow>
  9. <endEvent id="endevent2" name="End"></endEvent>
  10. <sequenceFlow id="flow4" sourceRef="取钱" targetRef="endevent2"></sequenceFlow>
  11. </process>
  12. <bpmndi:BPMNDiagram id="BPMNDiagram_userPublicTask">
  13. <bpmndi:BPMNPlane bpmnElement="userPublicTask" id="BPMNPlane_userPublicTask">
  14. <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
  15. <omgdc:Bounds height="35.0" width="35.0" x="335.0" y="40.0"></omgdc:Bounds>
  16. </bpmndi:BPMNShape>
  17. <bpmndi:BPMNShape bpmnElement="取号" id="BPMNShape_取号">
  18. <omgdc:Bounds height="55.0" width="105.0" x="300.0" y="110.0"></omgdc:Bounds>
  19. </bpmndi:BPMNShape>
  20. <bpmndi:BPMNShape bpmnElement="取钱" id="BPMNShape_取钱">
  21. <omgdc:Bounds height="55.0" width="105.0" x="300.0" y="210.0"></omgdc:Bounds>
  22. </bpmndi:BPMNShape>
  23. <bpmndi:BPMNShape bpmnElement="endevent2" id="BPMNShape_endevent2">
  24. <omgdc:Bounds height="35.0" width="35.0" x="335.0" y="310.0"></omgdc:Bounds>
  25. </bpmndi:BPMNShape>
  26. <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
  27. <omgdi:waypoint x="352.0" y="75.0"></omgdi:waypoint>
  28. <omgdi:waypoint x="352.0" y="110.0"></omgdi:waypoint>
  29. </bpmndi:BPMNEdge>
  30. <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
  31. <omgdi:waypoint x="352.0" y="165.0"></omgdi:waypoint>
  32. <omgdi:waypoint x="352.0" y="210.0"></omgdi:waypoint>
  33. </bpmndi:BPMNEdge>
  34. <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
  35. <omgdi:waypoint x="352.0" y="265.0"></omgdi:waypoint>
  36. <omgdi:waypoint x="352.0" y="310.0"></omgdi:waypoint>
  37. </bpmndi:BPMNEdge>
  38. </bpmndi:BPMNPlane>
  39. </bpmndi:BPMNDiagram>
  40. </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. Serializable读写类操作

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...

  2. new delete

    malloc/free是标准的库函数,而new/delete是操作符 匹配使用原则:malloc(calloc/realloc)和free 以及new/new[] 和delete/delete[]; ...

  3. Java控制台

    Console类的目的是使Java程序和控制台之间的交互更容易.Console类是java.io包中的一个实用程序类,用于访问系统控制台.控制台不能保证在所有机器上的Java程序中可访问. 例如,如果 ...

  4. 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷

    通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下:     步骤1:通过MyEclipse中的window->show View->ot ...

  5. 看官方文档学习springcloud搭建

    很多java的朋友学习新知识时候去百度,看了之后一知半解,不知道怎么操作,不知道到底什么什么东西,那么作为java码农到底该怎么学习额 一  百度是对还是错呢? 百度是一个万能的工具,当然是对也是错的 ...

  6. 创建UI的线程才能访问UI,那么怎样才算访问UI呢

    只有创建UI元素的线程(主线程又叫UI线程)才能访问UI元素.在UI线程中工作,不会有这个问题. 在后台线程中,如果直接访问UI元素,会抛出 “调用线程无法访问此对象,因为另一个线程拥有该对象” 异常 ...

  7. 使用jQuery的datetimepicker插件

    因为后台系统要使用年月日时分的设置,又因为使用的Bootstrap框架只有datepicker和timepicker控件.所以在jQuery库中找到轻量级的datetimepicker插件,很好地解决 ...

  8. Dubbo中有哪些角色?

    registry 注册中心. 是用于发布和订阅服务的一个平台.用于替代SOA结构体系框架中的ESB服务总线的. 发布 开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开. 订阅 客户端程 ...

  9. php array remove empty values

    print_r(array_filter($linksArray)); 參考 Remove empty array elements Remove Empty Array Elements In PH ...

  10. thinkphp sql解析缓存

    除了查询缓存之外,ThinkPHP还支持SQL解析缓存,因为ThinkPHP的ORM机制,所有的SQL都是动态生成的,然后由数据库驱动执行. 直线电机厂家 所以如果你的应用有大量的SQL查询需求,那么 ...