基于Camunda实现bpmn2.0各种类型监听器Listeners
监听器是在 BPMN 2.0 规范基础上扩展的功能,能扩展业务功能与流程的联系。 可以通过配置监听器的方式和各种动作。
监听器在生产中通常会用在几个方面:
- 动态分配节点受理人,通过前一个节点设置的变量,在运行到下一个节点时设置对应的审核人(也可以通过 UEL方法表达式 的方式来实现);
- 当流程运行到某个节点时,发送邮件或者短信给代办用户(消息提醒);
- 统计流程除了时长,统计是否超时等操作;
- 业务层面的数据处理操作。
一、监听器的分类(事件类型Event type)
监听器主要分为两类分别为:执行监听器(Execution Listeners)、任务监听(Task Listeners)。
1.2 任务监听器
任务监听器(Task Listeners)主要是对任务的各种动作进行监听。包含动作有:创建(create)、删除(delete)、完成(complete)、更新(update)、设置审核人(Assignment)等 动作时机的监听。
当流程引擎触发这几种事件类型时,对应的任务监听器会捕获其事件类型,再按照监听器的处理逻辑(Listener type 监听器实现类型 后续介绍)进行处理。
任务监听器(Task Listeners)的执行顺序如下:
1.1 执行监听器
执行监听器(Execution Listeners)主要功能为监听流程的所有节点和连线。主要监听动作有:开始(start)、结束(end)、事件(task)。
在节点中的执行监听器(Execution Listeners)只包含了 开始(start)、结束(end) 事件。在连线中的执行监听器只是包含了 事件(task) 类型。
执行监听器(Execution Listeners)的执行顺序如下:
二、监听器的实现方式(Listener type)
在所有类型的监听器中,所有的**实现方式(Listener type)**都包含有四种:java类路径(Java class)、表达式(Expression)、委托表达式(Delegate expression)、脚本(Script)。
下面通过代码来演示各种 Listener type 的方式,在代码在的实现示例。
2.1 Java类实现
监听器通过Java类来实现,需要在 Java class栏目中填写对应的java类路径和类名称信息。当流程引擎执行到该任务节点后,会根据对应的类路径调用该类。
在代码中对应的类上中,需要实现对应的对应的监听器类型接口;如果对应的是 任务监听器(Task Listeners)则对应类需要实现 org.camunda.bpm.engine.delegate.TaskListener 接口,同时重写 notify方法; 当实现的是 执行监听器(Execution Listeners) 则对应需要实现 org.camunda.bpm.engine.delegate.ExecutionListener; 接口,同时重写 notify() 方法。
上面示例中 是任务监听器(task Listeners)类型监听器,所以对应类的代码如下:
2.2 表达式实现
当监听器采用 Expression 的方式来实现时,需要在对应的 Expression栏目填写 UEL方法表达式。当流程引擎执行到该节点时,会解析该UEL表达式 。
在示例图片中的 UEL方法表达式: ${uelMethodBean.getAssignee(execution)} ;流程引擎会调用系统中 BeanName为 uelMethodBean的getAssignee()方法,同时会将节点相关数据信息通过 org.camunda.bpm.engine.delegate.DelegateExecution; 对象的方式作为参数传递到对应的方法中去。
对应的后台代码如下:
2.3 委托表达式实现
Listener type 监听器实现类型选择 Delegate expression时。在Delegate expression 栏目中需要填写UEL表达式 ${BeanName}。
当流程引擎执行到该监听器后,会自动通过BeanName 去代码中执行对应业务代码。
当采用了代理表达式方式实现监听器时。对应 BeanName对象所在的类需要实现 org.camunda.bpm.engine.delegate.JavaDelegate; 接口,并且重写execute() 方法。流程引擎会自动执行 execute() 方法中的业务代码。
示例代码如下:
三、监听器参数传递的实现
通过监听器自定义携带的参数,在监听器触发时,也能在对应的实现类代码中获取到自定义的参数数据。
通过监听器下方的 Field injection 栏目中设置监听器参数。
在对应实现类中获取参数时,首先是需要申明一个 org.camunda.bpm.engine.delegate.Expression; 类型的变量,变量名称需要与监听器中设置参数名称Name保持一致;如果存在多个参数传入,则声明多个 Expression 变量即可;在业务代码中通过声明的Expression类型变量的getValue(delegateExecution) 方法即可获取到对应参数数据。示例代码如下: