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

动态任务分配使用的两种方式

一、通过特殊表达式,来获取任务信息 ,在流程 UserTask节点上设置 ${流程变量的Key}

1、流程定义

 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="userDynamicTask1" name="动态任务处理1" isExecutable="true">
 4     <startEvent id="startevent1" name="Start"></startEvent>
 5     <userTask id="休假" name="休假" activiti:assignee="${user}"></userTask>
 6     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="休假"></sequenceFlow>
 7     <endEvent id="endevent1" name="End"></endEvent>
 8     <sequenceFlow id="flow2" sourceRef="休假" targetRef="endevent1"></sequenceFlow>
 9   </process>
10   <bpmndi:BPMNDiagram id="BPMNDiagram_userDynamicTask1">
11     <bpmndi:BPMNPlane bpmnElement="userDynamicTask1" id="BPMNPlane_userDynamicTask1">
12       <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
13         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="110.0"></omgdc:Bounds>
14       </bpmndi:BPMNShape>
15       <bpmndi:BPMNShape bpmnElement="休假" id="BPMNShape_休假">
16         <omgdc:Bounds height="55.0" width="105.0" x="305.0" y="180.0"></omgdc:Bounds>
17       </bpmndi:BPMNShape>
18       <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
19         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="270.0"></omgdc:Bounds>
20       </bpmndi:BPMNShape>
21       <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
22         <omgdi:waypoint x="357.0" y="145.0"></omgdi:waypoint>
23         <omgdi:waypoint x="357.0" y="180.0"></omgdi:waypoint>
24       </bpmndi:BPMNEdge>
25       <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
26         <omgdi:waypoint x="357.0" y="235.0"></omgdi:waypoint>
27         <omgdi:waypoint x="357.0" y="270.0"></omgdi:waypoint>
28       </bpmndi:BPMNEdge>
29     </bpmndi:BPMNPlane>
30   </bpmndi:BPMNDiagram>
31 </definitions>

2、发布流程

 1 /**
 2      * 2、发布一个流程:发布通过特殊表达式,来获取任务信息  ${流程变量的Key}的流程
 3      */
 4     @Test
 5     public void  testDeployProcess() {
 6         RepositoryService repositoryService = processEngine.getRepositoryService();
 7         DeploymentBuilder builder = repositoryService.createDeployment();
 8         // 加载发布资源
 9         builder.name("动态任务处理流程1-测试") // 设置流程显示别名
10                 .addClasspathResource("leave3.bpmn") // 设置流程规则文件
11                 .addClasspathResource("leave3.png"); // 设置流程规则的图片
12         // 发布流程
13         builder.deploy();
14     }

3、启动与测试流程

 1
 2     /**
 3      * 3、启动流程、执行任务,并查看状态
 4      */
 5     @Test
 6     public void testUserTask() {
 7         // 获取RuntimeService服务对象的实例
 8         RuntimeService runtimeService = processEngine.getRuntimeService();
 9         String processDefinitionKey = "userDynamicTask1";
10         // 自动执行与Key相对应的流程的最高版本
11         Map<String, Object> variables = new HashMap<String, Object>();
12         //variables.put("user", "张三");
13         variables.put("user", "李四");
14
15         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
16         String processInstanceId = processInstance.getId();
17         logger.info("processInstanceId:" + processInstance.getId());
18
19         // 获取TaskService服务对象的实例
20         TaskService taskService = processEngine.getTaskService();
21         //String assignee = "张三";
22         String assignee = "李四";
23         List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
24         Assert.assertEquals(1, tasks.size());
25         Task task = tasks.get(0);
26         logger.info("taskName:" + task.getName());
27         logger.info("taskAssignee:" + task.getAssignee());
28         Assert.assertEquals("休假",task.getName());
29
30         //完成任务
31         taskService.complete(task.getId());
32
33         //检查结束状态
34         ProcessInstance pInstance = runtimeService
35                                                         .createProcessInstanceQuery()
36                                                         .processInstanceId(processInstanceId)
37                                                         .singleResult();
38         Assert.assertNull(pInstance);
39         logger.info("动态任务处理流程1,使用${流程变量的Key}方式成功执行!");
40
41     }

4、运行结果

[INFO][2015-12-02 11:44:05,129][com.mcs.activiti.test.TestUserTaskDynamic]processInstanceId:130001
[INFO][2015-12-02 11:44:05,159][com.mcs.activiti.test.TestUserTaskDynamic]taskName:休假
[INFO][2015-12-02 11:44:05,159][com.mcs.activiti.test.TestUserTaskDynamic]taskAssignee:李四
[INFO][2015-12-02 11:44:05,456][com.mcs.activiti.test.TestUserTaskDynamic]动态任务处理流程1,使用${流程变量的Key}方式成功执行!

二、使用任务分配处理器

1、自定义任务分配处理器步骤

  1.1、  创建一个类来充分“任务分配处理器”,需要实现TaskListener

  1.2、  在实现方式中添加响应的处理逻辑;

  1.3、  在流程中,配置/使用任务处理器。

2、创建自定义任务分配处理器,实现TaskListener

 1 package mcs.listener;
 2
 3 import org.activiti.engine.delegate.DelegateTask;
 4 import org.activiti.engine.delegate.TaskListener;
 5
 6 public class ManagerTaskListenerHandler implements TaskListener {
 7
 8     private static final long serialVersionUID = 1L;
 9
10     @Override
11     public void notify(DelegateTask delegateTask) {
12         String assignee = "王五";
13         delegateTask.setAssignee(assignee);
14
15         //delegateTask.addCandidateUser("王小二");
16     }
17
18 }

3、流程定义

 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="userDynamicTask2" name="动态任务处理2" isExecutable="true">
 4     <startEvent id="startevent1" name="Start"></startEvent>
 5     <endEvent id="endevent1" name="End"></endEvent>
 6     <userTask id="休假" name="休假">
 7       <extensionElements>
 8         <activiti:taskListener event="create" class="mcs.listener.ManagerTaskListenerHandler"></activiti:taskListener>
 9       </extensionElements>
10     </userTask>
11     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="休假"></sequenceFlow>
12     <sequenceFlow id="flow2" sourceRef="休假" targetRef="endevent1"></sequenceFlow>
13   </process>
14   <bpmndi:BPMNDiagram id="BPMNDiagram_userDynamicTask2">
15     <bpmndi:BPMNPlane bpmnElement="userDynamicTask2" id="BPMNPlane_userDynamicTask2">
16       <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
17         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="110.0"></omgdc:Bounds>
18       </bpmndi:BPMNShape>
19       <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
20         <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="270.0"></omgdc:Bounds>
21       </bpmndi:BPMNShape>
22       <bpmndi:BPMNShape bpmnElement="休假" id="BPMNShape_休假">
23         <omgdc:Bounds height="55.0" width="105.0" x="305.0" y="180.0"></omgdc:Bounds>
24       </bpmndi:BPMNShape>
25       <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
26         <omgdi:waypoint x="357.0" y="145.0"></omgdi:waypoint>
27         <omgdi:waypoint x="357.0" y="180.0"></omgdi:waypoint>
28       </bpmndi:BPMNEdge>
29       <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
30         <omgdi:waypoint x="357.0" y="235.0"></omgdi:waypoint>
31         <omgdi:waypoint x="357.0" y="270.0"></omgdi:waypoint>
32       </bpmndi:BPMNEdge>
33     </bpmndi:BPMNPlane>
34   </bpmndi:BPMNDiagram>
35 </definitions>

4、发布流程

 1 /**
 2      * 4、发布一个流程:发布通过自定义任务分配处理器的流程
 3      *         自定义任务分配处理器步骤:
 4      *         1、创建一个类来充分“任务分配处理器”,需要实现TaskListener
 5     *        2、在实现方式中添加响应的处理逻辑;
 6     *        3、在流程中,配置/使用任务处理器。
 7      */
 8     @Test
 9     public void  testDeployProcess2() {
10         RepositoryService repositoryService = processEngine.getRepositoryService();
11         DeploymentBuilder builder = repositoryService.createDeployment();
12         // 加载发布资源
13         builder.name("动态任务处理流程2-测试") // 设置流程显示别名
14                 .addClasspathResource("leave4.bpmn") // 设置流程规则文件
15                 .addClasspathResource("leave4.png"); // 设置流程规则的图片
16         // 发布流程
17         builder.deploy();
18     }
19     

5、启动与测试流程

 1     /**
 2      * 5、启动流程、执行任务,并查看状态
 3      */
 4     @Test
 5     public void testUserTask2() {
 6         // 获取RuntimeService服务对象的实例
 7         RuntimeService runtimeService = processEngine.getRuntimeService();
 8         String processDefinitionKey = "userDynamicTask2";
 9         // 自动执行与Key相对应的流程的最高版本
10         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
11         String processInstanceId = processInstance.getId();
12         logger.info("processInstanceId:" + processInstance.getId());
13
14         // 获取TaskService服务对象的实例
15         TaskService taskService = processEngine.getTaskService();
16         String assignee = "王五";
17         List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
18         Assert.assertEquals(1, tasks.size());
19         Task task = tasks.get(0);
20         logger.info("taskName:" + task.getName());
21         logger.info("taskAssignee:" + task.getAssignee());
22         Assert.assertEquals("休假",task.getName());
23
24         //完成任务
25         taskService.complete(task.getId());
26
27         //检查结束状态
28         ProcessInstance pInstance = runtimeService
29                                                         .createProcessInstanceQuery()
30                                                         .processInstanceId(processInstanceId)
31                                                         .singleResult();
32         Assert.assertNull(pInstance);
33         logger.info("动态任务处理流程2,使用自定义任务分配处理器方式成功执行!");
34
35     }

6、运行结果

[INFO][2015-12-02 11:46:51,818][com.mcs.activiti.test.TestUserTaskDynamic]processInstanceId:132501
[INFO][2015-12-02 11:46:51,879][com.mcs.activiti.test.TestUserTaskDynamic]taskName:休假
[INFO][2015-12-02 11:46:51,879][com.mcs.activiti.test.TestUserTaskDynamic]taskAssignee:王五
[INFO][2015-12-02 11:46:52,192][com.mcs.activiti.test.TestUserTaskDynamic]动态任务处理流程2,使用自定义任务分配处理器方式成功执行!

时间: 2024-11-07 19:09:13

Activiti学习笔记10 — 动态任务分配的相关文章

Activiti学习笔记目录

1.Activiti学习笔记1 — 下载与开发环境的配置: 2.Activiti学习笔记2 — HelloWorld: 3.Activiti学习笔记3 — 流程定义: 4.Activiti学习笔记4 — 流程实例化: 5.Activiti学习笔记5 — 常用API解析: 6.Activiti学习笔记6 — 变量与历史记录: 7.Activiti学习笔记7 — ReceiveTask机器自动任务的使用: 8.Activiti学习笔记8 — UserTask私有任务的使用: 9.Activiti学习

《C++ Primer Plus》学习笔记10

<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&

Activiti 学习笔记记录(三)

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

jQuery学习笔记10:Ajax技术

jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. jQuery 采用了三层封装:最底层的封装方法为:$.ajax(),而通过这层封装了第二层有三种方法:.load().$.get()和$.post(),最高层是$.getScript()和$.getJSON()方法. 函数 描述 jQuery.ajax() 执行异步 HTTP (Ajax) 请求. .ajaxComplete() 当 Ajax 请求完成时注册要调用的处理程序.这是一个

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

sqlite学习笔记10:C语言中使用sqlite之查询和更新数据

前面说到的 sqlite_exec() 中的第三个参数, SQLite 将为 sql 参数内执行的每个 SELECT 语句中处理的每个记录调用这个回调函数. 本节添加了两个函数,selectFromTable和updateTable. 实例程序如下: #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db&quo

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

Activiti 学习笔记记录(二)

上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Activiti就是来走这个流程的.所以我们还需要将Activiti 和 业务结合起来,即部署定义(画一个流程图,生成 bpmn 格式的文件).本章,就来讲 bpmn 的图怎么画? 一.什么是 bpmn 业务流程建模标记法 BPMN (Business Process Model and Notation),是工作

python基础教程_学习笔记10:异常

异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by