给一个任务分配负责人可以采用如下3种方式进行分配。
[TOC]
# 1. 固定分配
![](https://img.kancloud.cn/c1/8b/c18b1c7c3b34d5cc4a8b372f10bf1e57_1292x441.png)
# 2. UEL表达式分配
UEL 表达式是 java EE6 规范的一部分, UEL(Unified Expression Language)即 统一表达式语言, activiti 支持两个 UEL 表达式: UEL-value 和 UEL-method。
**1. UEL-value**
:-: ![](https://img.kancloud.cn/57/5b/575b5d43342f7728065cfcbe5c5723da_1212x408.png)
写法一
![](https://img.kancloud.cn/95/73/957325f3731860b695b543c01ddf4737_1238x427.png)
写法二
**2. UEL-method**
![](https://img.kancloud.cn/50/a3/50a33917a2a762f8611809730d5f371f_1304x412.png)
**3. UEL-value与UEL-method配合使用**
![](https://img.kancloud.cn/fd/67/fd67ee21dc6c3374f9bdf73785ac8302_1410x431.png)
**4. 其他**
表达式支持解析基础类型、 bean、 list、 array 和 map,也可作为条件判断。
```
${order.price > 100 && order.price < 250}
```
<br/>
需要注意:由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:某个任务使用了表达式`${order.price > 100 && order.price < 250}`,当执行该任务时必须保证 order 在流程变量中存在,否则 activiti 异常。
<br/>
下面演示UEL-value的使用,其他的也是一样的道理,步骤如下:
**1. 定义流程变量**
![](https://img.kancloud.cn/9e/20/9e20c3e02ba15956df1a59c0ed09ee7b_1157x172.png)
**2. 设置流程变量**
```java
/**
* 测试 使用uel 设置负责人
*/
public class TestAssigneeUel {
/**
* 流程部署
*/
@Test
public void testDeployment() {
//1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
Deployment deploy = repositoryService.createDeployment()
.name("出差申请流程")
.addClasspathResource("bpmn-02/evection.bpmn")
.addClasspathResource("bpmn-02/image/evection.png")
.deploy();
//4、输出部署信息
System.out.println("流程部署id=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
//启动流程创建流程实例
@Test
public void startAssigneeUel() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//设定assignee的值,用来替换uel表达式
Map<String, Object> assigneeMap = new HashMap<String, Object>();
assigneeMap.put("assignee0", "张三");
assigneeMap.put("assignee1", "李经理");
assigneeMap.put("assignee2", "王总经理");
assigneeMap.put("assignee3", "赵财务");
//启动流程实例
runtimeService.startProcessInstanceByKey("myEvection", assigneeMap);
}
}
```
```sql
#设置的流程变量如下
mysql> select * from act_ru_variable;
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
| ID_ | REV_ | TYPE_ | NAME_ | EXECUTION_ID_ | PROC_INST_ID_ | TASK_ID_ | BYTEARRAY_ID_ | DOUBLE_ | LONG_ | TEXT_ | TEXT2_ |
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
| 2502 | 1 | string | assignee3 | 2501 | 2501 | NULL | NULL | NULL | NULL | 赵财务 | NULL |
| 2503 | 1 | string | assignee0 | 2501 | 2501 | NULL | NULL | NULL | NULL | 张三 | NULL |
| 2504 | 1 | string | assignee2 | 2501 | 2501 | NULL | NULL | NULL | NULL | 王总经理 | NULL |
| 2505 | 1 | string | assignee1 | 2501 | 2501 | NULL | NULL | NULL | NULL | 李经理 | NULL |
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
```
# 3. 监听器分配
使用监听器的方式来指定负责人,那么在流程设计时就不需要指定assignee。
任务监听器是发生对应的任务相关事件时执行自定义 java 逻辑或表达式。
<br/>
使用监听器分配负责人的步骤如下:
**1. 指定监听器属性**
:-: ![](https://img.kancloud.cn/58/db/58dbf83d53243532bc0884038d25e274_410x161.png)
![](https://img.kancloud.cn/ef/bc/efbc4e9e391e2ab24a116ada37f87bbb_1195x135.png)
```
Event可选值:
Create:任务创建后触发
Assignment:任务分配后触发
Delete:任务完成后触发
All:所有事件发生都触发
Type可选值:
Class
Expression
Delegate Expression
```
我就不用上面的图形化操作了,直接在XML中指定。
```xml
...
<userTask activiti:exclusive="true" id="_4" name="创建出差申请单">
<extensionElements>
<!-- event=all,class就是指定的监听器 -->
<activiti:taskListener class="com.itheima.demo.listener.MyTaskListener" event="all" />
</extensionElements>
</userTask>
<userTask activiti:exclusive="true" id="_5" name="总经理审批">
<extensionElements>
<activiti:taskListener class="com.itheima.demo.listener.MyTaskListener" event="all" />
</extensionElements>
</userTask>
...
```
**2. 定义监听器**
```java
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
//判断当前的任务 是 创建出差申请单 并且 是 create事件
if ("创建出差申请单".equals(delegateTask.getName()) &&
"create".equals(delegateTask.getEventName())) {
delegateTask.setAssignee("张三");
}
}
}
```
**3. 测试**
```java
public class TestListener {
/**
* 1. 先进行流程部署
*/
@Test
public void testDeployment() {
//1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
Deployment deploy = repositoryService.createDeployment()
.name("测试监听器")
.addClasspathResource("bpmn/demo-listen.bpmn")
.deploy();
//4、输出部署信息
System.out.println("流程部署id=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
/**
* 2. 启动流程,创建流程实例
*/
@Test
public void startDemoListener() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//启动流程实例
runtimeService.startProcessInstanceByKey("testListener");
}
}
```
```sql
# 创建出差申请单这个节点就会分配一个负责人为张三
mysql> select * from act_ru_task;
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
| ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | NAME_ | PARENT_TASK_ID_ | DESCRIPTION_ | TASK_D...
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
| 5005 | 1 | 5002 | 5001 | testListener:1:3 | 创建出差申请单 | NULL | NULL | _4 | NULL | 张三 | ...
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
```
- Activiti流程引擎
- 工作流介绍
- Activiti是什么
- Activiti流程处理步骤
- Activiti环境搭建
- 搭建步骤
- 表结构介绍
- ActivitiAPI结构
- 认识流程符号
- 流程设计器的使用
- 流程处理步骤
- 乱码问题
- 流程实例
- 流程实例是什么
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 个人任务
- 分配任务负责人
- 查询待办任务
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 使用流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 4种网关类型
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable与Activiti
- Flowable环境搭建
- FlowableAPI
- 流程引擎API与服务
- 流程处理步骤
- 流程部署
- 流程部署方式
- 流程定义版本
- 删除已部署的流程
- 下载资源
- 流程实例
- 什么是流程实例
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 分配任务负责人
- 固定分配
- UEL表达式分配
- 监听器分配
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- 历史查询
- 查询历史
- Spring整合Flowable
- 配置文件整合
- 配置类整合
- SpringBoot整合Flowable