【Elsa 3】Elsa 3 中的一些基本概念梳理
目录
- 背景:
- 我有一个想法
- 概念梳理
- 1 Workflow
- 2 Sequence 和 Flowchart
- 程序化工作流 和设计器工作流
- 小结
- Activitie
- FlowJoin
- FlowScope
- 最终的目的
背景:
作为一名视觉工程师,见过很多成熟的视觉软件,都是基于拖拉拽的,通过托选构成整个流程。这样可以解放视觉工程师,把拖拉拽的任务可以交给售后工程师。
这个拖拉拽形成流程的过程,就是工作流的概念。
ps:不得不说,后端服务开发的一些新的技术概念往往走在工业软件开发的前面。
我有一个想法
Elsa 3 就是为数不多面向C#的优秀的工作流框架(还有很多出名的工作流框架都是面向java的)。Elsa 3 更多的是面向后台服务的开发的。但是并不影响我将他引入视觉软件的开发。
前面说到,很多成熟的视觉软件,都是基于拖拉拽的,比如海康的的视觉软件,可以像编写流程图的的方式编写软件。
之前,我也尝试过,但是自己想实现一个质量较高工作流还是比较困难。直到遇到Elsa 3,它几乎实现了我所有的想法!
概念梳理
1 Workflow
Workflow(工作流):
Workflow 用于表示一个包含一系列活动的流程,活动按指定的逻辑和顺序执行。它是工作的整体流程图。
在 Elsa Workflows 中,Workflow 是最高层次的概念,包含所有的活动、条件、分支和执行逻辑。Workflow 可以由多个子流程或活动(如 Sequence 和 Flowchart)构成。
可以把 Workflow 视为执行步骤的容器,用来组织流程中的所有元素,提供整体结构。
2 Sequence 和 Flowchart
在 Elsa 工作流管理系统中,Flowchart
和 Sequence
是定义工作流的两种不同方法:
Sequence 和 Flowchart 都可以用来封装复合活动。
var subWorkflow1 = new Sequence{Activities ={new WriteLine("SubWorkflow 1 - Step 1"),new WriteLine("SubWorkflow 1 - Step 2")}};var workflow3 = new Workflow
{Root = new Sequence{Activities ={new WriteLine("请告诉我你的名字:"),new If{Condition = new(false),Then = new WriteLine("你好,世界!999999"),Else = new WriteLine("再见,残酷的世界99999!")},iif,subWorkflow1}}
};
以上就是Sequence构建带有分支的工作流。
// 定义一个工作流变量来捕获ReadLine活动的输出。
var nameVariable = new Variable<string>();// 定义要放入流程图的活动:
var writeLine1 = new WriteLine("请输入您的名字:");
var writeLine2 = new ReadLine(nameVariable);
var writeLine3 = new WriteLine(context => $"很高兴认识你,{nameVariable.Get(context)}!");// 定义一个流程图工作流:
var workflow = new Flowchart
{// 注册名称变量。Variables = { nameVariable },// 添加活动。Activities ={writeLine1,writeLine2,writeLine3},// 设置活动之间的连接。Connections ={new Connection(writeLine1, writeLine2),new Connection(writeLine2, writeLine3)}
};
而 Flowchart需要包含具体的连线Connections,
一来,方便构建可视化的流程图。
二来,通过存储多个Activity和他们连接关系的集合。有了这些数据,flowchart就可以根据connections中的连接关系对activity按照顺序执行了。
程序化工作流 和设计器工作流
下面是Elsa3原文档中的一段话:
活动管理 复合活动:如 Sequence 和 Flowchart 这类可以封装其他活动的活动。您可以编程方式或使用视觉设计工具设计自己的复合活动,这些可以在不同的工作流中复用。
-
程序化工作流:
- 通过编程方式创建,实例化
IActivity
对象并设置它们的属性。 - 可以定义为
Sequence
(程序化工作流)或Flowchart
(流程图工作流)。
- 通过编程方式创建,实例化
-
设计器工作流:
- 通过图形界面拖放活动并连接它们来定义工作流。
- 设计器底层使用的也是
Flowchart
活动作为工作流的根活动。 - 设计器中的工作流定义以 JSON 形式存储,运行时用于重建实际的
Workflow
对象。 - 在设计器中,输入值使用脚本表达式定义,通常是 JavaScript 表达式,而不是 C# Lambda 语句。
上图是elsa提供的web界面,可以通过设计器的模式设计整个工作流,当然我不打算使用这种方式,我打算通过wpf实现这个部分。
总结来说,Elsa 工作流管理系统提供了灵活的工作流定义方式,无论是通过编程还是通过图形化设计,都能够创建出功能丰富的工作流。通过理解程序化工作流和设计器工作流的相似之处和差异,用户可以根据自己的需求和偏好选择合适的工作流定义方法。
小结
程序化工作流:可以使用 Sequence
(程序化工作流)或 Flowchart
(流程图工作流)。
设计器工作流:默认使用的是 Flowchart
。
Sequence
被直译为顺序的。 虽然可以是复合的,也可以包含IF这种工作节点,但是确实还是顺序执行的。
如果想并行执行一些节点,估计还是得使用 Flowchart
。 ps:关注我,后续持续进行分析。
Activitie
Activiti 是一个开源的工作流引擎,用于业务流程管理(BPM)。它允许开发者和业务分析师创建、执行、监控和优化业务流程。Activiti 基于 BPMN 2.0 标准,这使得它能够支持复杂的业务流程建模和执行。
在 Activiti 中,有几个核心概念,其中之一就是 Activity(活动)。在 BPMN 模型中,Activity 表示流程中的一个工作单元或任务。它是流程实例的一部分,可以是以下类型的操作之一:
- Task(任务):需要由人员执行的工作单元,如用户任务或自动任务。
- Event(事件):发生的事情,可以是开始、结束、中间捕获或中间抛出事件。
- Gateway(网关):用于控制流程中路径的分歧和合并,如排他网关(XOR)、并行网关(AND)和包容网关(OR)。
- Flow(流转):定义了从一个活动到另一个活动的路径。
Activities 可以有不同的行为和属性,例如:
- User Task:需要人工干预的任务,如审批、填写表单等。
- Service Task:由系统执行的任务,可以调用外部服务或脚本。
- Script Task:允许在流程中嵌入脚本代码。
- Business Rule Task:用于实现复杂的业务规则决策。
总的来说,Activiti 的 Activity 是构成流程定义的基本单元,它们定义了流程中需要执行的具体操作,并且可以通过 Activiti 提供的服务进行管理。通过这些活动,Activiti 能够支持复杂的业务流程自动化,从而提高业务效率和透明度。
FlowJoin
FlowJoin 就是一个比较特殊的Activiti。
FlowJoin 是一种特定的活动,用于在 Flowchart 中处理并行路径的合并。当多个并行执行的活动路径需要汇合时,FlowJoin 可以确保这些分支在继续执行下一个活动之前都已经完成。这对于处理复杂的工作流路径非常重要,尤其在 Flowchart 中存在并行任务时。
FlowJoin 的主要功能
同步并行路径:当多个分支并行执行时,FlowJoin 等待所有分支完成后才继续。它类似于并行编程中的“同步”概念,用来确保在某一执行点上所有前序活动都已完成。
执行控制:在 Flowchart 逻辑中,FlowJoin 帮助控制流的执行,避免在某些活动未完成时提前进入下一个步骤。
Flowchart
和 Sequence
是定义工作流的两种不同方法。本身都是继承Container!
而 FlowJoin继承的是Activity,所以它是一个活动节点。和 IF 还有 Switch类似,用来抽象流程的走向。
FlowJoin 是可以放在 Flowchart
里面的,一下是Elsa3的部分源码:
public class SingleJoinWorkflow : WorkflowBase
{protected override void Build(IWorkflowBuilder builder){builder.Root = new Flowchart{Activities ={new FlowJoin()}};}
}
FlowScope
你的 FlowScope
类实现了一个内部的活动流范围管理器,用于追踪活动的执行状态。它主要的功能包括:
-
构造方法:包含一个无参构造和一个带
ownerActivityId
的构造,后者会将ownerActivityId
添加到Activities
字典中,并设置执行计数为1
。 -
属性
Activities
:用于存储活动的状态,使用Dictionary<string, ActivityFlowState>
来存储活动 ID 和对应的执行状态ActivityFlowState
。 -
方法:
AddActivities
和AddActivity
:分别批量或单个添加活动,调用EnsureActivity
确保活动状态在字典中存在。EnsureActivity
:检查Activities
中是否已包含指定的活动,如果没有则创建一个新的ActivityFlowState
。ContainsActivity
:检查活动是否已经存在于Activities
中。RegisterActivityExecution
:用于记录活动的执行次数,如果活动不在Activities
中则添加,并更新ExecutionCount
。ExcludeExecutedActivities
:筛选出尚未执行的活动。HasPendingActivities
:检测是否存在尚未完成的活动。GetExecutionCount
:获取指定活动的执行计数。Clear
:清空Activities
。
作用总结:FlowScope
通过维护 Activities
的执行状态,可以支持流程控制和状态管理。
通过查询Elsa3的源码,我只在 Flowchart 和 FlowJoin 发现 FlowScope 的身影。
Sequence 却没有FlowScope
的影子。看来 FlowScope
主要还是服务于 Flowchart
的。
最终的目的
通过wpf实现流程图的拖拉拽,同时通过 Elsa 3
完成工作流的构建。