添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如上图所示为流程启动关键节点图,主要由以下几部分组成:

1. 启动命令封装(橙色部分)

主要功能: 通过将bpmnXML格式文件解析为程序可执行的内存对象:Process。

a. 获取流程定义 ProcessDefinition(通过入参<流程key or 流程id>找到对应的流程定义)

b. 加载解析bpmn.xml文件(工作流原始文件)

c. 生成bpmnModel(工作流描述)

d. 生成Process(工作流执行)

2. 命令执行器(蓝色部分)

主要功能 :流程执行过程中会添加各种拦截器 其中最为核心的是CommandInvokerInterceptor

a. LogInterceptor:当日志级别为debug时,会输出启动日志

b. SpringTransactionInterceptor

Spring事务管理,用户事务的doTransaction、commit、rollback

c. CommandContextInterceptor:执行SqlSession close方法,将数据进行持久化

d. TransactionContextInterceptor

e. BpmnOverrideContextInterceptor

f. CommandInvokerInterceptor:真正执行启动流程命令的拦截器

3. 节点流转(绿色部分)
主要功能 :完成对流程节点的执行,及找到下一个可执行的节点,直至流程运行完成。其最核心的包括DefaulFlowableEngineAgenda,该类持有operations,通过对节点操作封装为不同的Operation,进行节点的流转。

2.2. 命令执行器(CommandExecutor)

Flowable是通过命令模式 + 责任链模式完成对操作的执行,flowable启动代码中,构造ProcessEngine时会调用 init()方法进行引擎初始化,如下图所示:

重点: 上图为节点流转图,节点流转的核心是 AbstractAgenda ,其默认的实现是 DefaultFlowableEngineAgenda ,该类持有变量operations,operations是个一个堆栈,在流转过程中,通过DefaultFlowableEngineAgenda一系列操作可以

将不同的操作压入栈中,然后运转过程中,将每一个操作弹出栈进行命令的执行。这里的operation指默认实现了AbstractOperation的操作类,AbstractOperation的实现类如下所示:

比如要继续流转,则压入ContinueProcessOperation,需要结束流程则需要压入 EndExecutionOperation。


Step 2: 取出栈顶操作元素开始节点并执,首先进行节点开始持久化操作,之后调用节点行为类执行,开始节点的行为类是 NoneStartEventActivityBehavior,如下图所示为空操作,

其并没有实现execute()方法,还是复用了父类FlowNodeActivityBehavior的execute()方法,执行leave方法,压入TakeOutgoingSequenceOperation操作,此时execution的当前节点为开始节点

Step 3: 弹出栈顶TakeOutgoingSequenceOperation(开始节点),首先进行节点结束持久化操作,之后获取开始节点的后置可用分支,压入ContinueProcessOperation堆栈,

此时execution的当前节点为 开始节点-创建变量节点顺序流

Step 4: 取出栈顶ContinueProcessOperation(开始节点-创建变量节点顺序流) 并执行,其目标节点为 创建变量节点,开始执行,首先执行节点开始持久化操作,接着执行其行为类JavaDelegate,

执行完成后,压入TakeOutgoingSequenceOperation操作,此时execution的当前节点为创建变量节点

计算节点后置节点以及其他逻辑后,压入操作类,此时execution的当前节点为开始节点-->创建变量的连线。

Step 5: 弹出栈顶TakeOutgoingSequenceOperation(创建变量节点),首先进行节点结束持久化操作,之后获取创建变量节点的可用分支,压入ContinueProcessOperation堆栈,

此时此时execution的当前节点为创建变量节点-结束事件顺序流

Step 6: 弹出栈顶ContinueProcessOperation(创建变量节点-结束事件),其目标节点为结束事件,开始执行,首先进行节点开始持久化操作,接着执行其行为类 NoneEndEventActivityBehavior,如下图可得,