使用監聽器的方式來指定負責人,那么在流程設計時就不需要指定assignee。
任務監聽器是發生對應的任務相關事件時執行自定義 java 邏輯或表達式。
<br/>
使用監聽器分配負責人的步驟如下:
**1. 指定監聽器屬性**
:-: 

`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