使用监听器的方式来指定负责人,那么在流程设计时就不需要指定assignee。
任务监听器是发生对应的任务相关事件时执行自定义 java 逻辑或表达式。
<br/>
使用监听器分配负责人的步骤如下:
**1. 指定监听器属性**
:-: ![](https://img.kancloud.cn/58/db/58dbf83d53243532bc0884038d25e274_410x161.png)
![](https://img.kancloud.cn/ef/bc/efbc4e9e391e2ab24a116ada37f87bbb_1195x135.png)
`evection-listener.bpmn`
```java
// Event可选值:
public interface BaseTaskListener extends Serializable {
String EVENTNAME_CREATE = "create"; // 任务创建后触发
String EVENTNAME_ASSIGNMENT = "assignment"; // 任务分配后触发
String EVENTNAME_COMPLETE = "complete"; // 任务完成后触发
String EVENTNAME_DELETE = "delete"; // 任务删除后触发
String EVENTNAME_ALL_EVENTS = "all"; // 所有事件发生都触发
}
Type可选值:
Class
Expression
Delegate Expression
```
我就不用上面的图形化操作了,直接在XML中指定。
```xml
...
<userTask activiti:exclusive="true" id="_4" name="创建出差申请单">
<extensionElements>
<!-- event=all,class就是指定的监听器 -->
<activiti:taskListener class="com.example.learn.flowable.listener.MyTaskListener" event="all" />
</extensionElements>
</userTask>
<userTask activiti:exclusive="true" id="_5" name="总经理审批">
<extensionElements>
<activiti:taskListener class="com.example.learn.flowable.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 ListenerDemo {
/**
* 1. 先进行流程部署
*/
@Test
public void testDeployment() {
//1、获取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、部署流程
Deployment deploy = repositoryService.createDeployment()
.name("测试监听器") //部署名称
.addClasspathResource("bpmn/evection-listener.bpmn")
.deploy();
//流程部署id=15001
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();
//根据流程key启动流程实例
runtimeService.startProcessInstanceByKey("evection-listener");
}
}
```
```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 | evection-listener:1:15004 | 创建出差申请单 | NULL | NULL | _4 | NULL | 张三 | ...
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
```
****
参考文档:https://tkjohn.github.io/flowable-userguide/#taskListeners
- Activiti流程引擎
- 工作流介绍
- Activiti是什么
- Activiti流程处理步骤
- Activiti环境搭建
- 搭建步骤
- 表结构介绍
- ActivitiAPI结构
- 认识流程符号
- 流程设计器的使用
- 流程处理步骤
- 乱码问题
- 流程实例
- 流程实例是什么
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 个人任务
- 分配任务负责人
- 查询待办任务
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 使用流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 4种网关类型
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable与Activiti
- Flowable环境搭建
- FlowableAPI
- 流程引擎API与服务
- 流程处理步骤
- 流程部署
- 流程部署方式
- 流程定义版本
- 删除已部署的流程
- 下载资源
- 流程实例
- 什么是流程实例
- 业务标识
- 查询流程实例
- 挂起/激活流程实例
- 分配任务负责人
- 固定分配
- UEL表达式分配
- 监听器分配
- 办理权限
- 流程变量
- 流程变量类型
- 流程变量作用域
- 流程变量控制流程
- 组任务
- 设置任务候选人
- 组任务办理流程
- 网关
- 排他网关
- 并行网关
- 包含网关
- 事件网关
- 历史查询
- 查询历史
- Spring整合Flowable
- 配置文件整合
- 配置类整合
- SpringBoot整合Flowable