在 Activiti 工作流引擎中,任务监听器(Task Listener)和执行监听器(Execution Listener)是两种常用的监听器类型,用于在流程的不同阶段添加自定义逻辑。它们可以在流程定义中配置,以便在特定事件发生时触发预定义的操作。比如,动态分配节点处理人。通过前一个节点设置的变量,在运行到下一个节点时设置对应的处理人; 当流程运行到某个节点时,发送邮件或短信给待办用户;统计流程处理时长,是否超时等;业务层面数据处理。
任务监听器是一种允许你在任务生命周期内的不同事件上执行操作的机制。每当一个与任务相关的事件发生时,任务监听器可以被触发,以便在任务开始、分配、完成等阶段执行特定的逻辑。
activiti的源码中,任务监听器事件包括:
可以通过配置任务监听器来执行以下类型的操作:
在 Activiti 中,可以通过以下方式配置任务监听器:
xml复制代码
实现自定义任务监听的代码如下:
java复制代码package com.test.activiti.activiti.listener;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.DelegateTask;
import org.springframework.stereotype.Service;
/**
* 测试任务监听器
* @Author dzf62
* @Description TODO
* @Date 2023/8/11 18:30
* @Version 1.0
*/
@Slf4j
@Service
public class TaskListener implements org.activiti.engine.delegate.TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String eventName = delegateTask.getEventName();
switch (eventName){
case EVENTNAME_CREATE:
create(delegateTask);
break;
case EVENTNAME_ASSIGNMENT:
assigment(delegateTask);
break;
case EVENTNAME_COMPLETE:
complete(delegateTask);
break;
case EVENTNAME_DELETE:
delete(delegateTask);
break;
default:
break;
}
}
public void create(DelegateTask delegateTask){
System.out.println("============TaskListener start============");
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
String eventName = delegateTask.getEventName();
System.out.println("事件名称:" + eventName);
System.out.println("taskDefinitionKey:" + taskDefinitionKey);
System.out.println("============TaskListener end============");
}
public void assigment(DelegateTask delegateTask){
System.out.println("============TaskListener start============");
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
String eventName = delegateTask.getEventName();
System.out.println("事件名称:" + eventName);
System.out.println("taskDefinitionKey:" + taskDefinitionKey);
System.out.println("============TaskListener end============");
}
public void complete(DelegateTask delegateTask){
System.out.println("============TaskListener start============");
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
String eventName = delegateTask.getEventName();
System.out.println("事件名称:" + eventName);
System.out.println("taskDefinitionKey:" + taskDefinitionKey);
System.out.println("============TaskListener end============");
}
public void delete(DelegateTask delegateTask){
System.out.println("============TaskListener start============");
String taskDefinitionKey = delegateTask.getTaskDefinitionKey();
String eventName = delegateTask.getEventName();
System.out.println("事件名称:" + eventName);
System.out.println("taskDefinitionKey:" + taskDefinitionKey);
System.out.println("============TaskListener end============");
}
}
执行监听器是一种允许你在流程实例的不同生命周期事件上执行操作的机制。与任务监听器类似,执行监听器在流程实例创建、开始、结束等事件发生时可以被触发。
activiti的源码中,执行监听器事件包括:
可以通过配置执行监听器来执行以下类型的操作:
在 Activiti 中,可以通过以下方式配置执行监听器:
xml复制代码
实现自定义执行监听器代码如下:
java复制代码package com.test.activiti.activiti.listener;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
/**
* @Author dzf62
* @Description TODO
* @Date 2023/8/12 21:17
* @Version 1.0
*/
public class ExecuteListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) throws Exception {
String eventName = execution.getEventName();
switch (eventName){
case EVENTNAME_START:
start(execution);
break;
case EVENTNAME_END:
end(execution);
break;
case EVENTNAME_TAKE:
take(execution);
break;
default:
break;
}
}
public void start(DelegateExecution execution){
System.out.println("============executionListener start============");
String eventName = execution.getEventName();
String currentActivitiId = execution.getCurrentActivityId();
System.out.println("事件名称:" + eventName);
System.out.println("ActivitiId:" + currentActivitiId);
System.out.println("============executionListener end============");
}
public void end(DelegateExecution execution){
System.out.println("============executionListener start============");
String eventName = execution.getEventName();
String currentActivitiId = execution.getCurrentActivityId();
System.out.println("事件名称:" + eventName);
System.out.println("ActivitiId:" + currentActivitiId);
System.out.println("============executionListener end============");
}
public void take(DelegateExecution execution){
System.out.println("============executionListener start============");
String eventName = execution.getEventName();
String currentActivitiId = execution.getCurrentActivityId();
System.out.println("事件名称:" + eventName);
System.out.println("ActivitiId:" + currentActivitiId);
System.out.println("============executionListener end============");
}
}
首先设计一个最简单的流程图,设计如下,使用原生的activiti的modeler,重点是添加任务监听器和执行监听器:
对应bpmn如下:
xml复制代码
在测试任务监听器与执行监听器的执行顺序时,我们对该用户任务节点的任务监听器和执行监听器都添加了所有的监听事件,接下来只需要在启动流程和办理第一个节点的任务,查看打印的内容就可以看出任务监听器和执行监听器各个事件监听的触发时机
首先,启动流程时的打印日志如下:
js复制代码============executionListener start============
事件名称:start
ActivitiId:testListener
============executionListener end============
============TaskListener start============
事件名称:assignment
taskDefinitionKey:testListener
============TaskListener end============
============TaskListener start============
事件名称:create
taskDefinitionKey:testListener
============TaskListener end============
说明流程在到达用户任务节点时,任务监听器的事件监听顺序如下:assignment->create;而执行监听器只会触发start事件
然后,办理该用户任务时,打印日志如下:
js复制代码============TaskListener start============
事件名称:complete
taskDefinitionKey:testListener
============TaskListener end============
============TaskListener start============
事件名称:delete
taskDefinitionKey:testListener
============TaskListener end============
============executionListener start============
事件名称:end
ActivitiId:testListener
============executionListener end============
任务监听器的事件监听顺序如下:complete->delete;执行监听器只触发了end事件