Flowable源码注释(四十二)历史解析器

本文详细探讨Flowable的历史解析器,包括ProcessHistoryParseHandler、StartEventHistoryParseHandler、UserTaskHistoryParseHandler和FlowNodeHistoryParseHandler。通过源码注释,深入理解流程引擎的历史数据处理机制。

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

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

历史解析器,包路径:org.activiti.engine.impl.history.parse

ProcessHistoryParseHandler 流程历史解析器

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

import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler;
import org.activiti.engine.impl.history.handler.ProcessInstanceEndHandler;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.Process;

/**
 * 流程历史解析器
 * 负责解析Process实例对象并为其添加事件类型为end的监听器
 *
 * @author Joram Barrez
 */
public class ProcessHistoryParseHandler extends AbstractBpmnParseHandler<Process> {

    protected static final ProcessInstanceEndHandler PROCESS_INSTANCE_END_HANDLER = new ProcessInstanceEndHandler();

    @Override
    protected Class<? extends BaseElement> getHandledType() {
        return Process.class;
    }

    // 执行解析,为其添加类型为end的监听器
    @Override
    protected void executeParse(BpmnParse bpmnParse, Process element) {
        bpmnParse.getCurrentProcessDefinition().addExecutionListener(org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END, PROCESS_INSTANCE_END_HANDLER);
    }

}

StartEventHistoryParseHandler 开始事件历史解析器

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

import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler;
import org.activiti.engine.impl.history.handler.StartEventEndHandler;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.StartEvent;

/**
 * 开始事件历史解析器
 * 负责解析开始事件实例对象并为其添加事件类型为end的监听器
 *
 * @author Joram Barrez
 */
public class StartEventHistoryParseHandler extends AbstractBpmnParseHandler<StartEvent> {

    protected static final StartEventEndHandler START_EVENT_END_HANDLER = new StartEventEndHandler();

    @Override
    protected Class<? extends BaseElement> getHandledType() {
        return StartEvent.class;
    }

    @Override
    protected void executeParse(BpmnParse bpmnParse, StartEvent element) {
        bpmnParse.getCurrentActivity().addExecutionListener(org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END, START_EVENT_END_HANDLER);
    }

}

UserTaskHistoryParseHandler 用户任务历史解析器

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

import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler;
import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler;
import org.activiti.engine.impl.history.handler.UserTaskAssignmentHandler;
import org.activiti.engine.impl.history.handler.UserTaskIdHandler;
import org.activiti.engine.impl.task.TaskDefinition;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.TaskListener;

/**
 * 用户任务历史解析器
 * 负责解析用户任务实例对象并为其添加类型为代理assigment和创建create的监听器
 *
 * @author Joram Barrez
 */
public class UserTaskHistoryParseHandler extends AbstractBpmnParseHandler<UserTask> {

    protected static final UserTaskAssignmentHandler USER_TASK_ASSIGNMENT_HANDLER = new UserTaskAssignmentHandler();

    protected static final UserTaskIdHandler USER_TASK_ID_HANDLER = new UserTaskIdHandler();

    @Override
    protected Class<? extends BaseElement> getHandledType() {
        return UserTask.class;
    }

    @Override
    protected void executeParse(BpmnParse bpmnParse, UserTask element) {
        TaskDefinition taskDefinition = (TaskDefinition) bpmnParse.getCurrentActivity().getProperty(UserTaskParseHandler.PROPERTY_TASK_DEFINITION);
        // 添加ASSIGNMENT类型的监听器
        taskDefinition.addTaskListener(TaskListener.EVENTNAME_ASSIGNMENT, USER_TASK_ASSIGNMENT_HANDLER);
        // 添加 CREATE类型的监听器
        taskDefinition.addTaskListener(TaskListener.EVENTNAME_CREATE, USER_TASK_ID_HANDLER);
    }

}

FlowNodeHistoryParseHandler 流节点历史解析器

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

import java.util.HashSet;
import java.util.Set;

import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.history.handler.ActivityInstanceEndHandler;
import org.activiti.engine.impl.history.handler.ActivityInstanceStartHandler;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.parse.BpmnParseHandler;
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.BoundaryEvent;
import org.flowable.bpmn.model.BusinessRuleTask;
import org.flowable.bpmn.model.CallActivity;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.EventGateway;
import org.flowable.bpmn.model.ExclusiveGateway;
import org.flowable.bpmn.model.InclusiveGateway;
import org.flowable.bpmn.model.IntermediateCatchEvent;
import org.flowable.bpmn.model.ManualTask;
import org.flowable.bpmn.model.ParallelGateway;
import org.flowable.bpmn.model.ReceiveTask;
import org.flowable.bpmn.model.ScriptTask;
import org.flowable.bpmn.model.SendTask;
import org.flowable.bpmn.model.ServiceTask;
import org.flowable.bpmn.model.SubProcess;
import org.flowable.bpmn.model.Task;
import org.flowable.bpmn.model.ThrowEvent;
import org.flowable.bpmn.model.UserTask;

/**
 * 流节点历史解析器
 * 负责解析流程三大要素并为其添加事件类型为start和end的监听器
 *
 * @author Joram Barrez
 */
public class FlowNodeHistoryParseHandler implements BpmnParseHandler {

    protected static final ActivityInstanceEndHandler ACTIVITI_INSTANCE_END_LISTENER = new ActivityInstanceEndHandler();

    // 实例活动实例开始处理器对象,负责将基本信息插入到历史节点表中
    protected static final ActivityInstanceStartHandler ACTIVITY_INSTANCE_START_LISTENER = new ActivityInstanceStartHandler();

    protected static Set<Class<? extends BaseElement>> supportedElementClasses = new HashSet<>();

    static {
        supportedElementClasses.add(EndEvent.class);
        supportedElementClasses.add(ThrowEvent.class);
        supportedElementClasses.add(BoundaryEvent.class);
        supportedElementClasses.add(IntermediateCatchEvent.class);

        supportedElementClasses.add(ExclusiveGateway.class);
        supportedElementClasses.add(InclusiveGateway.class);
        supportedElementClasses.add(ParallelGateway.class);
        supportedElementClasses.add(EventGateway.class);

        supportedElementClasses.add(Task.class);
        supportedElementClasses.add(ManualTask.class);
        supportedElementClasses.add(ReceiveTask.class);
        supportedElementClasses.add(ScriptTask.class);
        supportedElementClasses.add(ServiceTask.class);
        supportedElementClasses.add(BusinessRuleTask.class);
        supportedElementClasses.add(SendTask.class);
        supportedElementClasses.add(UserTask.class);

        supportedElementClasses.add(CallActivity.class);
        supportedElementClasses.add(SubProcess.class);
    }

    @Override
    public Set<Class<? extends BaseElement>> getHandledTypes() {
        return supportedElementClasses;
    }

    @Override
    public void parse(BpmnParse bpmnParse, BaseElement element) {
        ActivityImpl activity = bpmnParse.getCurrentScope().findActivity(element.getId());
        if (element instanceof BoundaryEvent) {
            // 边界事件从不接收活动开始事件
            activity.addExecutionListener(org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END, ACTIVITY_INSTANCE_START_LISTENER, 0);
            activity.addExecutionListener(org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END, ACTIVITI_INSTANCE_END_LISTENER, 1);
        } else {
            activity.addExecutionListener(org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_START, ACTIVITY_INSTANCE_START_LISTENER, 0);
            activity.addExecutionListener(org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END, ACTIVITI_INSTANCE_END_LISTENER);
        }
    }

}
### Flowable 工作流引擎源码详细解析 #### 一、环境搭建 针对希望深入了解 Flowable 源码的开发者而言,构建一个有效的开发环境至关重要。具体来说,在基于 IntelliJ IDEA 进行 Flowable 源码分析环境搭建的过程中,首要步骤涉及源码获取并将其顺利导入至 IDE 中[^1]。 #### 二、BPMN 解析机制 当涉及到 BPMN 文件(即 `bpmn20.xml`)向 BpmnModel 实体对象转变这一环节时,该过程被细致拆解成了一级标签、二级标签及其下辖子标签三个层面来进行专门化处理。这种分层方式不仅简化了理解难度,还使得追踪特定标签的功能实现变得更加便捷[^2]。 #### 三、流程部署剖析 完成上述准备工作之后,则需关注如何把准备好的业务逻辑封装进可由 Flowable 引擎识别的形式——即将设计阶段产出的模型正式引入运行环境中去。此部分着重描述了从原始 XML 描述直至成为实际可用的工作单元之间的转化路径,包括但不限于资源加载、验证及注册等一系列必要动作[^3]。 #### 四、流程实例创建探究 最后,在一切就绪的前提下,真正的挑战在于怎样依据既定模板高效地触发新的事务序列。这里会详细介绍调用链路的设计思路和技术细节,解释清楚每一个关键节点的作用原理,从而帮助读者掌握利用 API 或者其他手段激活新案例的方法论[^4]。 ```java // 示例代码片段展示如何启动一个新的流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processKey"); System.out.println("Started process instance id " + processInstance.getId()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值