Flowable源码注释(四十一)执行监听器

本文深入探讨Flowable流程引擎中的执行监听器,包括ExecutionListener接口、ProcessInstanceEndHandler、StartEventEndHandler、CallActivityStartHandler、ActivityInstanceStartHandler、ActivityInstanceEndHandler、ExpressionExecutionListener和DelegateExpressionExecutionListener。通过源码注释,解析这些类在流程实例和活动实例生命周期中的作用。
摘要由CSDN通过智能技术生成

Flowable源码地址:https://github.com/flowable/flowable-engine

Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated

包路径:org.flowable.engine.delegate

ExecutionListener 执行监听器接口类

/**
 * 回调接口,用于通知执行事件,如启动流程实例、结束活动实例或进行转换。
 * 
 * @author Tom Baeyens
 * @author Joram Barrez
 * @author Yvo Swillens
 */
public interface ExecutionListener extends BaseExecutionListener {

    void notify(DelegateExecution execution);
}

ProcessInstanceEndHandler 流程实例结束处理类

package org.activiti.engine.impl.history.handler;

import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 负责更新ACT_HI_PROCINST表中的数据
 *
 * @author Tom Baeyens
 */
public class ProcessInstanceEndHandler implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        Context.getCommandContext().getHistoryManager().recordProcessInstanceEnd(
                execution.getProcessInstanceId(), ((ExecutionEntity) execution).getDeleteReason(), ((ExecutionEntity) execution).getActivityId());
    }
}

StartEventEndHandler 开始事件结束处理类

package org.activiti.engine.impl.history.handler;

import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 负责将开始节点的信息插入到ACT_HI_ACTINST表中
 *
 * @author Tom Baeyens
 */
public class StartEventEndHandler implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        String activityId = ((ExecutionEntity) execution).getActivityId();

        Context.getCommandContext().getHistoryManager()
                .recordStartEventEnded((ExecutionEntity) execution, activityId);
    }

}

CallActivityStartHandler 调用活动开始处理类

package org.activiti.engine.impl.history.handler;

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 流程引擎暂时没有对其进行实现
 */

public class CallActivityStartHandler implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {

    }

}

ActivityInstanceStartHandler 活动实例开始处理类

package org.activiti.engine.impl.history.handler;

import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 负责将历史数据插入到ACT_HI_ACTINST表中
 *
 * @author Tom Baeyens
 * 
 *         请注意:对于开始事件,这是在ProcessDefinitionEntity中完成的!
 */
public class ActivityInstanceStartHandler implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        Context.getCommandContext().getHistoryManager()
                .recordActivityStart((ExecutionEntity) execution);
    }
}

ActivityInstanceEndHandler 活动实例结束处理类

package org.activiti.engine.impl.history.handler;

import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 负责更新ACT_HI_ACTINST表中的删除原因(非必须)、结束时间、节点持续时间
 *
 * @author Tom Baeyens
 */
public class ActivityInstanceEndHandler implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        Context.getCommandContext().getHistoryManager()
                .recordActivityEnd((ExecutionEntity) execution);
    }
}

ExpressionExecutionListener Expression执行监听器

package org.flowable.engine.impl.bpmn.listener;

import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;

/**
 * 一个执行监听器{@link ExecutionListener},在收到通知时对表达式{@link Expression}求值。
 * 负责调度执行expression方式创建的执行监听器
 *
 * @author Frederik Heremans
 */
public class ExpressionExecutionListener implements ExecutionListener {

    protected Expression expression;

    public ExpressionExecutionListener(Expression expression) {
        this.expression = expression;
    }

    @Override
    public void notify(DelegateExecution execution) {
        // Return value of expression is ignored
        expression.getValue(execution);
    }

    /**
     * 返回此执行监听器的表达式文本。如果你想检查你已经有了哪些监听器,这很有用。
     */
    public String getExpressionText() {
        return expression.getExpressionText();
    }
}

DelegateExpressionExecutionListener DelegateExpression执行监听器

/**
 * 负责调度执行DelegateExpression方式创建的执行监听器
 *
 * @author Joram Barrez
 */
public class DelegateExpressionExecutionListener implements ExecutionListener {

    protected Expression expression;
    private final List<FieldDeclaration> fieldDeclarations;

    public DelegateExpressionExecutionListener(Expression expression, List<FieldDeclaration> fieldDeclarations) {
        this.expression = expression;
        this.fieldDeclarations = fieldDeclarations;
    }

    @Override
    public void notify(DelegateExecution execution) {
        Object delegate = DelegateExpressionUtil.resolveDelegateExpression(expression, execution, fieldDeclarations);
        if (delegate instanceof ExecutionListener) {
            CommandContextUtil.getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(new ExecutionListenerInvocation((ExecutionListener) delegate, execution));
        } else if (delegate instanceof JavaDelegate) {
            CommandContextUtil.getProcessEngineConfiguration().getDelegateInterceptor().handleInvocation(new JavaDelegateInvocation((JavaDelegate) delegate, execution));
        } else {
            throw new FlowableIllegalArgumentException("Delegate expression " + expression + " did not resolve to an implementation of " + ExecutionListener.class + " nor " + JavaDelegate.class);
        }
    }

    /**
     * 返回此执行监听器的表达式文本。如果你想检查你已经有了哪些监听器,这很有用。
     */
    public String getExpressionText() {
        return expression.getExpressionText();
    }

}
Flowable执行监听器和任务监听器是用来在流程执行中发生特定事件时执行外部Java代码或计算表达式的机制。执行监听器可以被捕获的事件包括流程实例的启动和结束、流程执行转移、活动的启动和结束、网关的启动和结束、中间事件的启动和结束、启动事件的结束和结束事件的启动。\[2\]任务监听器可以被应用于多种BPMN任务类型,包括任务、服务任务、脚本任务、业务规则任务、发送任务、接收任务、用户任务、子流程和调用活动。对于用户任务、接收任务和其他等待状态的任务,异步操作允许在一个独立的线程/事务中启动执行监听器。\[3\] #### 引用[.reference_title] - *1* [Flowable学习笔记(二):flowable实战](https://blog.csdn.net/u012734723/article/details/128431796)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [flowable简介](https://blog.csdn.net/qq_35466392/article/details/126658791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值