流程监听器-ExecutionListener
流程监听器
流程监听器,可监听流程开启、结束,流程审批达到哪个连线上或者流程审批达到那个节点的审批,节点审批完成、取消等操作时,是否触发某些业务逻辑。
流程监听器
- 全局的监听器。
全局监听器主要使用的场景就是监控这个流程的启动和结束。流程开始的时候可以监控,流程结束的时候可以监控。
主要监听事件:start、end
public interface BaseExecutionListener extends Serializable {
String EVENTNAME_START = "start";
String EVENTNAME_END = "end";
String EVENTNAME_TAKE = "take";
}
public class MyExecutionListener
implements ExecutionListener {}
-
连线的监听器。
在流程连线上使用的监听器,主要监听 take 事件。 -
节点的监听器。
TaskListener 监听节点是否到达、是否认领任务、是否完成任务等操作
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";
}
1、activiti:executionListener class 配置
<process id="test1" isClosed="false" isExecutable="true" processType="None">
<extensionElements>
<activiti:executionListener class="cn.maitian.form.activiti.listener.MyExecutionListener" event="start"/>
<activiti:executionListener class="cn.maitian.form.activiti.listener.MyExecutionListener" event="end"/>
</extensionElements>
<startEvent id="_2" name="StartEvent"/>
<serviceTask activiti:exclusive="true" id="_3" name="ServiceTask"/>
<userTask activiti:assignee="zyk" activiti:exclusive="true" id="_4" name="审批"/>
<endEvent id="_5" name="EndEvent"/>
<sequenceFlow id="_9" sourceRef="_2" targetRef="_4">
<extensionElements>
<activiti:executionListener event="take" class="cn.maitian.form.activiti.listener.MyExecutionListener"></activiti:executionListener>
</extensionElements>
</sequenceFlow>
<sequenceFlow id="_10" sourceRef="_4" targetRef="_3"/>
<sequenceFlow id="_11" sourceRef="_3" targetRef="_5"/>
</process>
2、类型定义
public class MyExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
String eventName = execution.getEventName();
System.out.println("eventName = " + eventName);
System.out.println("execution = " + execution);
System.out.println("流程监听器触发业务逻辑。。。");
}
}
3、节点 监听器配置及类型定义
<userTask activiti:assignee="zyk" activiti:exclusive="true" id="_4" name="审批">
<extensionElements>
<activiti:taskListener event="all" class="cn.maitian.form.activiti.listener.MyTaskListener">
</activiti:taskListener>
</extensionElements>
</userTask>
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String assignee = delegateTask.getAssignee();
String eventName = delegateTask.getEventName();
String formKey = delegateTask.getFormKey();
//camunda 可以在UserTask 节点的create类型事件上设置当前节点审批用户
if(eventName.equate("create")){
delegateTask.setAssignee("zyk");
}
System.out.println("eventName = " + eventName);
}
}
4、单元测试
@Test
public void complete(){
//部署流程
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/test1.bpmn")
.name("请假流程")
.deploy();
log.info("部署流程成功:Id:{},Key:{},Name:{}",deployment.getId(),deployment.getKey(),deployment.getName());
//开启流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("test1");
log.info("流程开启:{}",instance.getId());
String instanceId=instance.getId();
//审批流程
Map<String,Object> variables=new HashMap<>();
variables.put("assignee","jl1)");
variables.put("age",23);
Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
taskService.complete(task.getId(),variables);
log.info("流程{} - {} 任务已完成。",task.getProcessInstanceId(),task.getId());
}
监听器如何和Spring 集成?
1、expression 设置EL表达式
注意:
- myTaskListener Spring 管理的Bean名称,普通类即可。可以不实现接口TaskListener
- 注意是 expression="#{}" 不是"${}"
- task 如果接口第一次参数是DelegateTask 类型时,参数名称必须是task,否则会报异常
- 这个方法参数可以有多个,参数名称,必须是流程变量中的参数名称或者 Spring 管理的Bean名称,会IOC注入。
- 具体更多使用方式可参考**11、ServiceTask 服务任务-Spring集成**
1、用户审批节点监听器配置
<userTask activiti:assignee="zyk" activiti:exclusive="true" id="_4" name="审批">
<extensionElements>
<activiti:taskListener event="all" expression="#{myTaskListener.notify(task)}"/>
</extensionElements>
</userTask>
2、监听器类型定义
与Spring集成时,监听器类可以不实现接口 TaskListener
@Component("myTaskListener")
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask task) {
String assignee = task.getAssignee();
String eventName = task.getEventName();
String formKey = task.getFormKey();
System.out.println("eventName = " + eventName);
}
}