【Elsa 3】Elsa 3 中的一些基本概念梳理

背景:

作为一名视觉工程师,见过很多成熟的视觉软件,都是基于拖拉拽的,通过托选构成整个流程。这样可以解放视觉工程师,把拖拉拽的任务可以交给售后工程师。

这个拖拉拽形成流程的过程,就是工作流的概念。

ps:不得不说,后端服务开发的一些新的技术概念往往走在工业软件开发的前面。

我有一个想法

Elsa 3 就是为数不多面向C#的优秀的工作流框架(还有很多出名的工作流框架都是面向java的)。Elsa 3 更多的是面向后台服务的开发的。但是并不影响我将他引入视觉软件的开发。
前面说到,很多成熟的视觉软件,都是基于拖拉拽的,比如海康的的视觉软件,可以像编写流程图的的方式编写软件。
之前,我也尝试过,但是自己想实现一个质量较高工作流还是比较困难。直到遇到Elsa 3,它几乎实现了我所有的想法!

概念梳理

1 Workflow

Workflow(工作流):

Workflow 用于表示一个包含一系列活动的流程,活动按指定的逻辑和顺序执行。它是工作的整体流程图。
在 Elsa Workflows 中,Workflow 是最高层次的概念,包含所有的活动、条件、分支和执行逻辑。Workflow 可以由多个子流程或活动(如 Sequence 和 Flowchart)构成。
可以把 Workflow 视为执行步骤的容器,用来组织流程中的所有元素,提供整体结构。

2 Sequence 和 Flowchart

在 Elsa 工作流管理系统中,FlowchartSequence 是定义工作流的两种不同方法:

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按照顺序执行了。

3 程序化工作流 和设计器工作流

下面是Elsa3原文档中的一段话:

活动管理 复合活动:如 Sequence 和 Flowchart 这类可以封装其他活动的活动。您可以编程方式或使用视觉设计工具设计自己的复合活动,这些可以在不同的工作流中复用。

  1. 程序化工作流

    • 通过编程方式创建,实例化 IActivity 对象并设置它们的属性。
    • 可以定义为 Sequence(程序化工作流)或 Flowchart(流程图工作流)。
  2. 设计器工作流

    • 通过图形界面拖放活动并连接它们来定义工作流。
    • 设计器底层使用的也是 Flowchart 活动作为工作流的根活动。
    • 设计器中的工作流定义以 JSON 形式存储,运行时用于重建实际的 Workflow 对象。
    • 在设计器中,输入值使用脚本表达式定义,通常是 JavaScript 表达式,而不是 C# Lambda 语句。
      在这里插入图片描述
      上图是elsa提供的web界面,可以通过设计器的模式设计整个工作流,当然我不打算使用这种方式,我打算通过wpf实现这个部分。

总结来说,Elsa 工作流管理系统提供了灵活的工作流定义方式,无论是通过编程还是通过图形化设计,都能够创建出功能丰富的工作流。通过理解程序化工作流和设计器工作流的相似之处和差异,用户可以根据自己的需求和偏好选择合适的工作流定义方法。

小结

程序化工作流:可以使用 Sequence(程序化工作流)或 Flowchart(流程图工作流)。
设计器工作流:默认使用的是 Flowchart

Sequence 被直译为顺序的。 虽然可以是复合的,也可以包含IF这种工作节点,但是确实还是顺序执行的。
如果想并行执行一些节点,估计还是得使用 Flowchartps:关注我,后续持续进行分析。

4 Activitie

Activiti 是一个开源的工作流引擎,用于业务流程管理(BPM)。它允许开发者和业务分析师创建、执行、监控和优化业务流程。Activiti 基于 BPMN 2.0 标准,这使得它能够支持复杂的业务流程建模和执行。

在 Activiti 中,有几个核心概念,其中之一就是 Activity(活动)。在 BPMN 模型中,Activity 表示流程中的一个工作单元或任务。它是流程实例的一部分,可以是以下类型的操作之一:

  1. Task(任务):需要由人员执行的工作单元,如用户任务或自动任务。
  2. Event(事件):发生的事情,可以是开始、结束、中间捕获或中间抛出事件。
  3. Gateway(网关):用于控制流程中路径的分歧和合并,如排他网关(XOR)、并行网关(AND)和包容网关(OR)。
  4. Flow(流转):定义了从一个活动到另一个活动的路径。

Activities 可以有不同的行为和属性,例如:

  • User Task:需要人工干预的任务,如审批、填写表单等。
  • Service Task:由系统执行的任务,可以调用外部服务或脚本。
  • Script Task:允许在流程中嵌入脚本代码。
  • Business Rule Task:用于实现复杂的业务规则决策。

总的来说,Activiti 的 Activity 是构成流程定义的基本单元,它们定义了流程中需要执行的具体操作,并且可以通过 Activiti 提供的服务进行管理。通过这些活动,Activiti 能够支持复杂的业务流程自动化,从而提高业务效率和透明度。

5 FlowJoin

FlowJoin 就是一个比较特殊的Activiti。

FlowJoin 是一种特定的活动,用于在 Flowchart 中处理并行路径的合并。当多个并行执行的活动路径需要汇合时,FlowJoin 可以确保这些分支在继续执行下一个活动之前都已经完成。这对于处理复杂的工作流路径非常重要,尤其在 Flowchart 中存在并行任务时。

FlowJoin 的主要功能
同步并行路径:当多个分支并行执行时,FlowJoin 等待所有分支完成后才继续。它类似于并行编程中的“同步”概念,用来确保在某一执行点上所有前序活动都已完成。
执行控制:在 Flowchart 逻辑中,FlowJoin 帮助控制流的执行,避免在某些活动未完成时提前进入下一个步骤。
在这里插入图片描述
FlowchartSequence 是定义工作流的两种不同方法。本身都是继承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()
            }
        };
    }
}

6 FlowScope

你的 FlowScope 类实现了一个内部的活动流范围管理器,用于追踪活动的执行状态。它主要的功能包括:

  1. 构造方法:包含一个无参构造和一个带 ownerActivityId 的构造,后者会将 ownerActivityId 添加到 Activities 字典中,并设置执行计数为 1

  2. 属性 Activities:用于存储活动的状态,使用 Dictionary<string, ActivityFlowState> 来存储活动 ID 和对应的执行状态 ActivityFlowState

  3. 方法

    • AddActivitiesAddActivity:分别批量或单个添加活动,调用 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 完成工作流的构建。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code bean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值