前情纪要
前面我记录了camunda的基本使用
传送门
还有用户任务和服务任务 以及 全局变量的使用
传送门
目前camunda已经可以正常运行,但是不正常的时候我们怎么办,就需要用到监听,需要程序帮我们盯着他看,到底执行到哪了,到哪坏了,方便事后查错(ps:我就是干这个用)还有前端实时显示目前工作流执行情况
监听器简介
监听器顾名思义,就是监听的机器(/手动滑稽),言归正传 这里我用到的监听大概有三种
分别是
start:启动监听 不能加在序列流上面
end:结束监听 不能加在序列流上面
take:执行监听 只能加在序列流上面
设计概要
我前面有提到过 前端给我传他的json结构 我解析成camunda需要的结构,就在这个解析的过程添加监听器
下面我会列出单节点的监听以及部分代码
代码部分
首先我们先看一下xml文件的格式 我列出一个开始节点
<bpmn:startEvent id="StartEvent_1">
<-- 这里是监听器开始 -->
<bpmn:extensionElements>
<-- 这里是数组 可以加多个监听 -->
<-- 其中class属性是监听器的实现类、event是监听类型 -->
<camunda:executionListener class="com.****.workflow.listener.StartEndListener" event="start" />
</bpmn:extensionElements>
<-- 到这里监听器部分结束 -->
<bpmn:outgoing>Flow_17ib737</bpmn:outgoing>
</bpmn:startEvent>
可以看到一个节点可以添加多个监听器
解释概要上面我已经加了注释 看起来是很简单的 其余的节点大同小异
我们看一下监听器类长什么样
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.springframework.stereotype.Component;
@Component
public class StartEndListener extends BaseWorkflowListener{
@Override
public void notify(DelegateExecution execution) throws Exception {
String eventName = execution.getEventName();
listenerLogic(eventName);
}
@Override
public void notify(DelegateTask delegateTask) {
}
}
public abstract class BaseWorkflowListener implements IWorkflowListener{
@Override
public void notify(DelegateExecution execution) throws Exception {
String eventName = execution.getEventName();
listenerLogic(eventName);
}
@Override
public void notify(DelegateTask delegateTask) {
}
protected void listenerLogic(String eventName) {
if("create".equals(eventName)){
System.out.println("create===========流程启动");
}else if("assigment".equals(eventName)){
System.out.println("assigment===========流程部署");
}else if("complete".equals(eventName)){
System.out.println("complete===========流程完成");
}else if("delete".equals(eventName)){
System.out.println("delete===========流程结束");
}else if("start".equals(eventName)){
System.out.println("start===========流程启动");
}else if("end".equals(eventName)){
System.out.println("end===========流程结束");
}else if("take".equals(eventName)) {
System.out.println("take===========流程执行");
}
}
}
/**
* 监听器
*/
public interface IWorkflowListener extends TaskListener, ExecutionListener {
}
这里需要实现camunda的接口 然后有实现方法 看了我前面的全局变量部分是不是很熟悉这个方法参数
是的他又来了DelegateExecution 这个神奇的东西 又可以操作各种变量 以及取到很多工作流相关的信息
其中最重要的就是取到事件类型 这样我们可以判断到底执行了什么事件,方便进行相关操作
注意事项来了
这里是大字
我使用的过程中,因为xml完全是自己拼出来的json转的,所以节点顺序是自己控制的
我使用过程中发现 <bpmn:outgoing> 必须在监听器后面,其他going同理
到这里基本监听器的使用就OK了