基于Camunda实现bpmn2.0各种类型监听器Listeners

基于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) 方法即可获取到对应参数数据。示例代码如下:在这里插入图片描述

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值