在 Flowable 工作流引擎中,监听器(Listeners) 是扩展流程行为的关键机制,它允许开发者在流程执行的特定节点注入自定义逻辑。监听器提供了非侵入式的扩展方式,无需修改流程定义就能增强流程功能。

在流程引擎中,ExecutionListenerTaskListener 和 EventListener 是三种不同粒度的监听器,它们在作用范围、触发时机和使用场景上有显著区别。

1、ExecutionListener(执行监听器)

核心特点:绑定到流程节点(如ServiceTask、SequenceFlow)

场景:自动服务调用、动态路由决策、节点级审计日志

2、TaskListener(任务监听器)

核心特点:绑定到用户任务

场景:动态任务分配、任务通知、自动添加参与者

3、EventListener(事件监听器)

核心特点全局监听引擎所有事件

监听事件类型(部分):

事件类型 触发时机
PROCESS_STARTED 流程实例启动
TASK_CREATED 用户任务创建
VARIABLE_CREATED 流程变量创建/修改
ACTIVITY_COMPLETED 节点完成
ENGINE_CREATED 流程引擎初始化完成

 场景:全流程审计跟踪、系统性能监控、安全合规检查

需求场景 推荐监听器 原因
处理节点进入/离开时的业务逻辑 ExecutionListener 直接绑定节点执行过程
动态设置任务负责人 TaskListener 访问任务上下文(assignee/candidate)
任务创建时发送通知 TaskListener 精确捕获任务生命周期事件
记录所有流程启动事件 EventListener 全局监听,无需修改流程定义
监控敏感变量变更 EventListener 跨流程跟踪关键数据变化
节点级数据转换 ExecutionListener 在流程执行上下文中操作变量
系统性能统计 EventListener 聚合所有流程/任务事件数据
  • 节点级逻辑 → ExecutionListener

  • 任务级操作 → TaskListener

  • 系统级监控 → EventListener

监听器的核心作用:

1. 事件驱动扩展

在流程生命周期关键点触发自定义逻辑:

  • 流程实例启动/结束

  • 任务创建/分配/完成

  • 节点进入/离开

  • 变量变更等

2. 解耦业务逻辑

将非核心流程逻辑(如通知、日志、数据分析)与核心流程分离

3. 动态行为控制

运行时动态修改流程行为:

  • 动态分配任务处理人

  • 基于业务条件跳过节点

  • 自动填充表单数据

4. 跨流程监控

实现全局的流程审计和监控

监听器的使用场景:

1. 执行监听器(Execution Listener)

作用:监控流程节点(活动)的执行事件
事件点

  • start:进入节点时

  • end:离开节点时

  • take:流经顺序流时

    public class BudgetCheckListener implements ExecutionListener {
        @Override
        public void notify(DelegateExecution execution) {
            // 1. 预算检查
            double amount = (double) execution.getVariable("amount");
            if (amount > 10000) {
                execution.setVariable("requireCFOApproval", true);
            }
            
            // 2. 自动记录审计日志
            auditService.log(execution.getProcessInstanceId(), 
                            "进入预算检查节点");
        }
    }
  • 作用:当监听的流程节点事件(如节点进入、离开)触发时,引擎会自动调用此方法。

  • 参数DelegateExecution execution
    封装了当前流程实例的上下文信息(如流程变量、实例ID等)。

  • 步骤解析

    1. 获取流程变量
      从流程上下文中读取名为 "amount" 的变量(通常由上游节点设置),并将其转换为 double 类型。

    2. 金额判断
      如果金额 amount 超过 10000,则执行分支逻辑。

    3. 设置审批标记
      向流程上下文中写入一个布尔变量 "requireCFOApproval",值为 true,表示需要 CFO(首席财务官)审批。

  • 业务含义
    实现了一个简单的预算控制规则:当金额超过阈值时,标记后续流程需要高管审批。

  • BPMN绑定:

    <serviceTask id="budgetCheck" flowable:class="...">
      <extensionElements>
        <flowable:executionListener event="start" 
                       class="com.example.BudgetCheckListener"/>
      </extensionElements>
    </serviceTask>
    2. 任务监听器(Task Listener)

    作用:监控用户任务生命周期
    事件点

  • create:任务创建时

  • assignment:任务分配时

  • complete:任务完成时

  • delete:任务删除时

    public class ManagerTaskListener implements TaskListener {
        @Override
        public void notify(DelegateTask task) {
            // 1. 自动分配任务给部门经理
            String dept = (String) task.getVariable("department");
            String manager = departmentService.getManager(dept);
            task.setAssignee(manager);
            
            // 2. 发送企业微信通知
            wechatService.sendTaskAlert(manager, task.getName());
        }
    }
  • 作用:当监听的用户任务事件触发时,流程引擎自动调用此方法

  • 参数DelegateTask task
    封装了当前用户任务的上下文信息(任务ID、名称、办理人、流程变量等)

  • 步骤解析

    1. 获取部门信息
      从流程变量中读取 "department" 变量(字符串类型)

    2. 查询部门经理
      通过 departmentService 服务根据部门名称获取对应的经理账号

    3. 设置任务办理人
      将查询到的经理设置为当前任务的办理人(assignee)

  • 业务含义
    实现动态任务分配机制,根据流程中的部门信息自动确定任务负责人

  • BPMN绑定:

    <userTask id="managerApproval" name="经理审批">
      <extensionElements>
        <flowable:taskListener event="create" 
                      class="com.example.ManagerTaskListener"/>
      </extensionElements>
    </userTask>
    3. 事件监听器(Event Listener)

    作用:全局监听引擎所有事件
    事件类型:40+ 种事件(如流程启动、任务创建、变量更新等)

    public class GlobalAuditListener implements FlowableEventListener {
        @Override
        public void onEvent(FlowableEvent event) {
            // 记录所有事件到审计系统
            FlowableEngineEventType type = (FlowableEngineEventType) event.getType();
            if(type == FlowableEngineEventType.PROCESS_STARTED) {
                // 流程启动审计
                auditService.logProcessStart(event);
            } else if(type == FlowableEngineEventType.VARIABLE_CREATED) {
                // 变量变更审计
                auditService.logVariableChange(event);
            }
        }
        
        @Override
        public boolean isFailOnException() {
            return false; // 异常不中断流程
        }
    }
  • 功能:事件触发时的回调方法

  • 参数FlowableEvent event(包含事件类型和上下文信息)

  • 处理逻辑

    1. 获取事件类型
      FlowableEngineEventType type = (FlowableEngineEventType) event.getType();

    2. 流程启动事件处理
      当检测到PROCESS_STARTED(流程启动)事件时,调用审计服务记录流程启动

    3. 变量创建事件处理
      当检测到VARIABLE_CREATED(变量创建)事件时,调用审计服务记录变量变更

注册方式:

processEngineConfiguration.getEventDispatcher()
    .addEventListener(new GlobalAuditListener());

核心应用场景:

1、动态任务分配:

// 根据角色动态分配审批人
task.setAssignee(userService.findRoleUser("finance_approver"));

2、自动数据填充:

// 任务创建时自动加载用户数据
task.setVariable("userProfile", userService.getProfile(task.getAssignee()));

3、实时通知提醒:

// 任务分配时发送通知
notificationService.send(task.getAssignee(), 
    "您有新任务: " + task.getName());

4、自动化审批规则:

// 金额小于5000自动通过
if (amount < 5000) {
    task.setVariable("autoApproved", true);
    task.complete(); // 自动完成任务
}

5、审计日志追踪:

// 记录所有关键操作
auditLog.save(
    event.getProcessInstanceId(),
    "TASK_COMPLETED",
    task.getName()
);

6、跨系统集成:

// 流程结束时同步到ERP
erpService.createOrder(
    execution.getVariable("orderDetails")
);

典型应用案例:

案例1:自动加签审批
public class AddApproverListener implements TaskListener {
    @Override
    public void notify(DelegateTask task) {
        if ("highRisk".equals(task.getVariable("riskLevel"))) {
            // 高风险任务自动添加法务审批
            task.addCandidateUser("legal_advisor@company.com");
        }
    }
}
案例2:超时自动升级:
public class EscalationListener implements ExecutionListener {
    @Override
    public void notify(DelegateExecution execution) {
        if ("timeout".equals(execution.getEventName())) {
            // 任务超时升级给上级
            String currentAssignee = task.getAssignee();
            String supervisor = orgService.getSupervisor(currentAssignee);
            task.setAssignee(supervisor);
            
            // 发送升级通知
            notifyService.sendEscalation(supervisor, task);
        }
    }
}
案例3:合规检查拦截:
public class ComplianceCheckListener implements ExecutionListener {
    @Override
    public void notify(DelegateExecution execution) {
        // 反洗钱检查
        if (amlService.checkHighRisk(execution.getVariables())) {
            execution.setVariable("complianceBlocked", true);
            throw new FlowableException("AML compliance check failed");
        }
    }
}
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐