5.1 activiti执行监听器ExecutionListener

2023-10-26

1. 执行监听器的使用场景

1.1 人员动态分配

  • 节点审批人员需要在流程运行过程中动态分配
  • 当前任务节点完成的时候,指定需要指定下一个节点的处理人(比如,一个请假流程,a员工请假,需要指定下一步需要处理请假流程的领导。)。

1.2 任务节点调取业务

任务节点完成的时候,需要一些复杂业务,(比如当前节点完成的时候,需要调用我们的jms消息系统发送消息)。

任务流转到当前的节点的时候,需要监控当前任务节点的一些信息或者其他的业务信息。

当前的任务节点分配处理人的时候,需要触发自定义的一些业务。

1.3 流程上处理业务

流程开始结束的时候,需要处理业务信息。

1.4 连线上处理业务

经过任务节点的出线,也就是连线的时候,需要触发自定义的业务。

1.5 等等...

2. 执行监听器的监听事件

源码中如下:

/** Callback interface to be notified of execution events like starting a process instance,
 * ending an activity instance or taking a transition.
 *  
 * @author Tom Baeyens
 * @author Joram Barrez
 */
public interface ExecutionListener extends Serializable {

  String EVENTNAME_START = "start";//作用在流程实例的开始事件
  String EVENTNAME_END = "end";//作用在流程实例的结束事件
  String EVENTNAME_TAKE = "take";//作用在流程实例的连线上

  void notify(DelegateExecution execution) throws Exception;
}

3.流程监听器实现方式——类class

3.1 实现ExecutionListener方式

3.1.1 xml文件

流程定义文件:

<process id="process_id_or_key" name="企业信息完善审批流程模型" isExecutable="true">
    定义在流程上的监听器
    <extensionElements>
      <activiti:executionListener event="start" class="org.jeecg.modules.activiti.ext.listener.SiteReportExecutionListener"></activiti:executionListener>
    </extensionElements>
    <startEvent id="sid-2C00B4D7-2746-4AFB-904E-A2B17C071EC7"></startEvent>
    <userTask id="sid-4BDFBF55-11C2-465E-A90E-8D926ABD2D90" name="办事处审批"></userTask>
    <userTask id="sid-D3C34D06-9E4D-4EA3-BF9C-20CF9BFB0F71" name="县区审批">
    定义在任务节点上的监听
      <extensionElements>
        <activiti:executionListener event="start" class="org.jeecg.modules.activiti.ext.listener.SiteReportExecutionListener"></activiti:executionListener>
      </extensionElements>
    </userTask>
    <userTask id="sid-BCAA6507-465C-4B7D-9319-3E92909BA897" name="市审批"></userTask>
    <sequenceFlow id="sid-B010604D-1D3F-4296-8FD4-136F18A08A61" sourceRef="sid-D3C34D06-9E4D-4EA3-BF9C-20CF9BFB0F71" targetRef="sid-BCAA6507-465C-4B7D-9319-3E92909BA897"></sequenceFlow>
    <endEvent id="sid-70082386-CA2C-4B0C-BC20-40642ACBA994"></endEvent>
    <sequenceFlow id="sid-F7AD426E-DE89-42AB-8EB5-0E9873DEEA71" sourceRef="sid-BCAA6507-465C-4B7D-9319-3E92909BA897" targetRef="sid-70082386-CA2C-4B0C-BC20-40642ACBA994"></sequenceFlow>
    <sequenceFlow id="sid-9F804DC4-CBC3-455F-B11F-D82C405E93F3" sourceRef="sid-2C00B4D7-2746-4AFB-904E-A2B17C071EC7" targetRef="sid-4BDFBF55-11C2-465E-A90E-8D926ABD2D90"></sequenceFlow>
定义在流转连线上的监听器
    <sequenceFlow id="sid-9B00C62D-3355-4FEE-95B8-04C7C157D8BB" sourceRef="sid-4BDFBF55-11C2-465E-A90E-8D926ABD2D90" targetRef="sid-D3C34D06-9E4D-4EA3-BF9C-20CF9BFB0F71">
      <extensionElements>
        <activiti:executionListener event="start" class="org.jeecg.modules.activiti.ext.listener.SiteReportExecutionListener"></activiti:executionListener>
      </extensionElements>
    </sequenceFlow>
  </process>

3.1.2 监听器代码


/**
 * 执行监听器可以在流程执行中发生特定的事件时,执行外部Java代码或计算表达式。可以被捕获的事件有
 *
 * >> 流程实例的start(启动)和end(结束)。
 * >> take(进行)转移(transition)。(这里是指顺序流线 上监听事件只有take)
 * >> 活动的start和end。
 * >> 网关的start和end。
 * >> 中间事件的start和end。
 * >> 启动事件的end,和结束事件的start。
 *

 */
public class SiteReportExecutionListener implements ExecutionListener {
    private static final long serialVersionUID = 8282921521567009453L;

    @Override
    public void notify(DelegateExecution execution) throws Exception {

        //【1】监听的时间
        String eventName = execution.getEventName();//监听的事件名称
        if(EVENTNAME_START.equals(eventName)){//start

        }else if(EVENTNAME_END.equals(eventName)){//end

        }else if(EVENTNAME_TAKE.equals(eventName)){//序流线 上监听事件只有take

        }


        //【2】流程定义 以及 当前活动节点
        String currentExecutionId = execution.getId();//正在执行的流程对象的执行id
        String currentActivityId = execution.getCurrentActivityId();//正在执行的流程对象的活动节点id 获取当前的.Activityid
        String currentActivityName = execution.getCurrentActivityName();//正在执行的流程对象的活动节点名称
        String processInstanceId = execution.getProcessInstanceId();//当前流程实例id
        String processDefinitionId = execution.getProcessDefinitionId();//流程定义id
        String parentExecutionId = execution.getParentId();//获取父id,并发的时候有用

        String tenantId = execution.getTenantId();//获取TenantId 当有多个TenantId 有用

        String businessKey = execution.getBusinessKey();//业务id已经废弃
        String processBusinessKey = execution.getProcessBusinessKey();//业务id


        /**
         * 这个非常有用吧。当拿到EngineServices 对象所有的xxxService都可以拿到
         */
        EngineServices engineServices = execution.getEngineServices();
        TaskService taskService = engineServices.getTaskService();
        RuntimeService runtimeService = engineServices.getRuntimeService();

        //【3】流程变量的获取与设置,删除 增晒改查
        execution.getVariable("");
        execution.setVariable("","");
    }


 

3.2 委托类DelegateExecution介绍

/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.activiti.engine.delegate;

import org.activiti.engine.EngineServices;



/**
 * Execution used in {@link JavaDelegate}s and {@link ExecutionListener}s.
 * 
 * @author Tom Baeyens
 */
public interface DelegateExecution extends VariableScope {

  /** Unique id of this path of execution that can be used as a handle to provide external signals back into the engine after wait states. */
  String getId();

  /** Reference to the overall process instance */
  String getProcessInstanceId();

  /** The {@link ExecutionListener#EVENTNAME_START event name} in case this execution is passed in for an {@link ExecutionListener}  */
  String getEventName();
  
  /** The business key for this execution. Only returns a value if the delegate execution
   * is a process instance.
   *  
   * @deprecated use {@link #getProcessBusinessKey()} to get the business key for the process
   *             associated with this execution, regardless whether or not this execution is a 
   *             process-instance. 
   */
  String getBusinessKey();
  
  /**
   * The business key for the process instance this execution is associated with.
   */
  String getProcessBusinessKey();
  
  /**
   * The process definition key for the process instance this execution is associated with.
   */
  String getProcessDefinitionId();
  
  /**
   * Gets the id of the parent of this execution. If null, the execution represents a process-instance.
   */
  String getParentId();
  
  /**
   * Gets the id of the calling execution. If not null, the execution is part of a subprocess. 
   */
  String getSuperExecutionId();
  
  /**
   * Gets the id of the current activity.
   */
  String getCurrentActivityId();
  
  /**
   * Gets the name of the current activity.
   */
  String getCurrentActivityName();
  
  /**
   * Returns the tenant id, if any is set before on the process definition or process instance.
   */
  String getTenantId();
  
  /**
   * All Activiti services can be accessed through this interface.
   */
  EngineServices getEngineServices();
  
}

4. 流程监听器实现方式——表达式

5.2 activiti任务监听器TaskListener_青苔猿猿的博客-CSDN博客

5. 流程监听器实现方式——委托表达式

 同5.2 activiti任务监听器TaskListener_青苔猿猿的博客-CSDN博客

6. 实现JavaDelegate方式

实现了接口JavaDelegate

6.1 实现代码

package org.jeecg.modules.activiti.ext.listener;

import org.activiti.engine.EngineServices;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.JavaDelegate;

/**
 * 委托类的实现方式
 *

 */
public class SiteReportJavaDelegate implements JavaDelegate {

    /**
     * 自定义方法
     */
    public void test1(){
        System.out.println("coming_2");
    }
    @Override
    public void execute(DelegateExecution execution) throws Exception {
 

        //【1】监听的时间
        String eventName = execution.getEventName();//监听的事件名称
        if(ExecutionListener.EVENTNAME_START.equals(eventName)){//start

        }else if(ExecutionListener.EVENTNAME_END.equals(eventName)){//end

        }else if(ExecutionListener.EVENTNAME_TAKE.equals(eventName)){//序流线 上监听事件只有take

        }


        //【2】流程定义 以及 当前活动节点
        String currentExecutionId = execution.getId();//正在执行的流程对象的执行id
        String currentActivityId = execution.getCurrentActivityId();//正在执行的流程对象的活动节点id 获取当前的.Activityid
        String currentActivityName = execution.getCurrentActivityName();//正在执行的流程对象的活动节点名称
        String processInstanceId = execution.getProcessInstanceId();//当前流程实例id
        String processDefinitionId = execution.getProcessDefinitionId();//流程定义id
        String parentExecutionId = execution.getParentId();//获取父id,并发的时候有用

        String tenantId = execution.getTenantId();//获取TenantId 当有多个TenantId 有用

        String businessKey = execution.getBusinessKey();//业务id已经废弃
        String processBusinessKey = execution.getProcessBusinessKey();//业务id


        /**
         * 这个非常有用吧。当拿到EngineServices 对象所有的xxxService都可以拿到
         */
        EngineServices engineServices = execution.getEngineServices();
        TaskService taskService = engineServices.getTaskService();
        RuntimeService runtimeService = engineServices.getRuntimeService();

        //【3】流程变量的获取与设置,删除 增晒改查
        execution.getVariable("");
        execution.setVariable("","");
    }
}

6.2 xml定义三种实现方式

6.2.1  xml定义在类上

<extensionElements>
      <activiti:executionListener event="start" class="org.jeecg.modules.activiti.ext.listener.SiteReportJavaDelegate"></activiti:executionListener>
</extensionElements>

6.2.2 xml定义在表达式上

 

 

表达式处:${siteReportJavaDelegate.test1()}会执行test1方法

6.2.2 xml定义在委托表达式上

 

委托表达式:${siteReportJavaDelegate} 直接执行execute方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5.1 activiti执行监听器ExecutionListener 的相关文章

  • Activiti之一:部署activiti-admin、activiti-app、activiti-rest

    文章目录 各组件版本下载部署将war包放入tomcat 访问 在网上查找activiti相关资料 xff0c 发现对于activiti rest的使用很少 xff0c 而官网对于api的支持还是比较多的 xff0c 如果考虑的是一个纯粹的工
  • activiti-serviceTask(服务任务)

    Activiti服务任务 serviceTask Activiti服务任务 serviceTask 作者 邓家海 都有一段沉默的时间 等待厚积薄发 应用场景 当客户有这么一个需求 下一个任务我需要自动执行一些操作 并且这个节点不需要任何的人
  • Activiti6.0学习实践(4)-流程引擎配置一

    在上一节 我们进行了一个hello world 的简单应用搭建 本节继续对activiti的一些重要组件进行更进一步的分析 目录 1 activiti工程骨架 1 2 添加demo类到骨架工程 1 3 创建基于骨架的maven工程 2 流程
  • ACTIVITI 5.22.0 流程退回上一节点,实现多实例串行与并行退回

    import java util ArrayList import java util Date import java util HashSet import java util List import java util Map imp
  • 2023最新版本Activiti7系列-网关服务

    网关篇 网关可控制流程的执行流向 常用于拆分或合并复杂的流程场景 在Activiti7中 有以下几种类型的网关 排他网关 Exclusive Gateway 用于在流程中进行条件判断 根据不同的条件选择不同的分支路径 只有满足条件的分支会被
  • activiti源码解析系列8 - 任务完成命令类

    我们在完成任务的时候都执行了哪些操作呢 主要涉及删除表 默认非级联 ACT RU TASK ACT RU IDENTITYLINK ACT RU VARIABLE 主要看一个CompleteTaskCmd protected Void ex
  • SpringBoot整合activiti5-流程部署

    系列文章目录 springboot整合activiti5 在Activiti中 定义了多种资源 其中 bpmn和 bpmn20 xml都是流程定义文件 这两种格式都可以被系统识别并进行解释 但是目前最新版本的Activiti Designe
  • activiti-Cancel activity属性(cancelActivity)作用

    流程设计工具 activiti explorer activiti版本 5 22 在使用边界计时器事件时 事件有一个参数 Cancel activity 作用上图 如下 Cancel activity选中 在事件中设置5秒计时 当开始流程后
  • Activiti6.0学习实践(1)-基础和部署

    工作流是现在信息化建设过程中经常用于解决业务流程管理问题的工具 因此工作流是一个比较专业化的话题 当前流行的工作流主要有JBPM和activiti 本系列学习实践的目的就是掌握activiti的部署 开发和应用 重要说明 本系列学习实践都是
  • Activiti6.0学习实践(2)-源码工程构建

    上节对工作流和activiti有了一个基本认识 本节主要目的是构建源码工程 了解如何从git上创建本地的工程 同时对源码有个基本的了解 目录 1 克隆到本地 2 建立远程git库分支 3 导入到工程 4 源码基本结构 5 基于源码启动act
  • Activiti 工作流引擎 详解

    Activiti 工作流引擎 详解 1 Activiti工作流概述 1 1 工作流概述 1 2 工作流系统 1 3 Activiti概述 1 4 BPM 2 Activiti工作流环境搭建 3 Activiti 类 配置文件之间的关系 3
  • 工作流Activiti7整合SpringBoot使用

    前言 一个软件系统中具有工作流的功能 我们把它称为工作流系统 一个系统中工作流的功能是什么 就是对系统的业务流程进行自动化管理 所以工作流是建立在业务流程的基础上 所以一个软件的系统核心根本上还是系统的业务流程 工作流只是协助进行业务流程管
  • 关于activiti流程通过、驳回、会签、转办、中止、挂起等核心操作功能的封装

    package com famousPro process service impl import java util ArrayList import java util HashMap import java util List imp
  • activiti学习--06流程变量:流程变量+变量的类型+流程变量api+设置流程变量1或2+查询流程变量的历史表

    流程变量 1流程变量的作用域范围是只对应一个流程实例 所以只要设置就行了 不用管在哪个阶段设置 2各个流程实例的流程变量是不相互影响的 3流程实例结束完成以后流程变量还保存在数据库中 存放到流程变量的历史表中 4基本类型设置流程变量 在ta
  • Activiti使用教程

    1 概念 首先需要分清三个概念 流程 流程实例 任务实例 Activiti提供4个bean来操作流程 RepositoryService RuntimeService TaskService HistoryService 2 流程 针对于某
  • 2023最新版本Activiti7系列-源码篇-初始化过程

    源码分析 1 设计模式 1 1 命令模式 https dpb bobokaoya sm blog csdn net article details 89115420 1 2 责任链模式 https dpb bobokaoya sm blog
  • Activiti7源码分析

    文章目录 Activiti7源码分析 整体架构 命令模式 责任链模式 事务拦截器 命令上下文拦截器 流程定义解析 Activiti之PVM执行树 核心理念 PVM对流程定义期的描述 PVM对流程运行期的描述 PVM综述 ActivitiIm
  • 使用 Maven 集成 Activiti Modeler

    如何将 Activiti Modeler 集成到自己的 Web 应用程序中并保留 Maven 建议的所有优点 问题是Maven中的Activiti Modeler是Activiti Explorer的一部分 网上有一些问题来自那些想要开发自
  • Alfresco:在另一个任务中显示任务字段(查看它们)

    我正在将新的工作流程部署到 alfresco 4 0 e 我有一个 formkey cwf submitLeaveTask 的任务 这是代码
  • 如何获取控制器中流程实例的ID?

    我的环境 Alfresco Share v5 2 d r134641 b15 Aikau 1 0 101 3 Spring Surf 5 2 d Spring WebScripts 6 13 Freemarker 2 3 20 alfres

随机推荐

  • spring cloud使用JpaRepository,dao层无法注入容器,调试报空指针的解决思路

    公司岗位调整 我从一个安卓开发转后台开发 以前在其他公司也接触过后台 那时公司用的是ssm框架 不过安卓还是 主业务 后台业务也只是略而兼之 并未深研 想着公司这次给机会做后台 本着技多不压身 就欣然接受 此时已经2019年了 微服务方兴未
  • 算法笔记之GD,BGD,SGD

    在讨论GBDT前 先来看看什么是GD BGD和SGD GD Gradient Descent 梯度下降 求损失函数最小值 梯度下降 求损失函数最大值 梯度上升 假设线性模型 其中 是参数 损失函数为 那么每次GD的更新算法为 BGD Bat
  • UE4如何动态修改材质(材质参数集)

    UE4如何动态修改材质 材质参数集 UE4如何动态修改材质 一 Material Parameter collection是什么 二 使用步骤 1 创建材质参数集 2 创建参数 3 添加到材质 4 动态修改材质参数集 UE4如何动态修改材质
  • linux系统编程

    fcntl 改变文件属性 include
  • Rust 交叉编译:在Windows 10 64位系统编译 32位的Rust 库

    1 添加 x86编译链接器 rustup target add i686 pc windows msvc 如果没有相应的 x86 编译环境 执行x86的编译命令 会有截图找不到crate的错误 2 编译x86版本库 继续沿用 C 调用 Ru
  • 千锋老师回忆起Hadoop大数据时代

    在大数据领域 Hadoop是一个具有重要意义的技术框架 它为处理大规模数据集提供了可靠且高效的解决方案 本文将回顾千锋老师对于Hadoop大数据时代的追忆 并通过相关的源代码展示其强大的功能 Hadoop最著名的组件之一是Hadoop分布式
  • 五年的努力!年薪达40W,Java程序员奋斗史

    金九银十 面试季刚开始不久 前几天跟朋友在一起聚会的时候提了一个问题 说Java程序员年薪如何达到40W 技术水平需要达到什么程度 有人回答说这只能是大企业或者互联网企业工程师才能拿到 也许是的 小公司或者非互联网企业拿到40W的不太可能是
  • QT 串口的监控

    QSocketNotifier 用来监听系统文件操作 将操作转换为Qt事件进入系统的消息循环队列 并调用预先设置的事件接受函数 处理事件 一共存在3类事件 read write exception QSocketNotifier Read
  • Kafka日志清除

    25条消息 Kafka日志清除策略 鸭梨山大哎的博客 CSDN博客 kafka 日志删除策略 修改server properties The minimum age of a log file to be eligible for dele
  • Faceswap安装及使用(附图文介绍,简单易上手)

    Faceswap是github上面的一个项目 可以用于实现换脸 本章分为两节 分别介绍了faceswap具体的安装步骤以及使用方法 操作简单易上手 阅读完本文觉得有用的记得点个赞奥 谢谢大家 一 faceswap安装 1 打开faceswa
  • docker “no space left on device” 解决方案

    问题原因 出现此问题一般是 docker 根目录空间不足导致 解决方案 修改 Docker Root Dir 的值 指向一个更大空间的目录 1 查看docker磁盘使用情况 docker system df 2 查看docker挂载目录 d
  • 在ubantu下安装sublime

    1添加Sublime text 3软件包的软件源sudo add apt repository ppa webupd8team sublime text 32使用以下命令更新系统软件源sudo apt get update3使用以下命令安装
  • 五、Jvm调优

    Jvm调优调什么 这个疑问必须要有 当对一个技术或者系统调优的时候 我们一定要知道去调什么 这样有一个出发点 有一个目标 不能胡乱的调对吧 那么Jvm调优 主要调以下 1 减少Full GC 2 解决OOM 3 总的来说就是 使用较小的内存
  • 【JAVA与C#比较】语言选择

    JAVA与C 是当下使用率很高的高级语言中 最为相近的两门语言 在语言特性上非常相似 其差别比起其它流行的高级编程语言 例如c object c swift 也是最小的 在版本演进中 也存在相互借签 取长补短 java 语言是1996 年发
  • MyBatisPlus 分页查询

    首先要定义一个配置类 MybatisConfig 放在 config 类下 他的生效是通过拦截生效的 所以是要写拦截器的 这段拦截器的配置是固定的 CV 也可以 Configuration public class MybatisConfi
  • 卷积神经网络CNN原理——结合实例matlab实现

    程序及数据下载链接 https download csdn net download u010540396 10839936 程序及数据下载链接 https download csdn net download u010540396 108
  • INVALID_USER_SCODE问题的解决办法

    在用高德地图API的时候 还会遇见一个为题 就是总是提示 INVALID USER SCODE 当遇见这个问题的时候 一般的问题都是 注册key之后没有十分钟就开始使用这个key值了 另外一种情况就是注册的key值有问题 应该重新注册一个k
  • 使用STM32让示波器显示图片及播放动画思路的经验分享

    到手了一块某夕夕上一百三入手的STM32F407VE的开发板 一个字 香 把玩时发现了DAC这个看起来就很有意思的功能 软件输出了正弦波三角波之后突然想起了示波器的XY模式 刚好这个芯片有一个DAC两路通道 于是便折腾了一下用XY模式显示图
  • pgbackrest 简要使用说明

    测试环境 CentOS Linux release 7 4 1708 Core X64 PostgreSQL 10 1 Source pgbackrest pgbackrest release 1 27 tar gz 1 Test Simp
  • 5.1 activiti执行监听器ExecutionListener

    1 执行监听器的使用场景 1 1 人员动态分配 节点审批人员需要在流程运行过程中动态分配 当前任务节点完成的时候 指定需要指定下一个节点的处理人 比如 一个请假流程 a员工请假 需要指定下一步需要处理请假流程的领导 1 2 任务节点调取业务