当前位置: 首页 > news >正文

【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 工作流管理系统中,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按照顺序执行了。

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

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

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

  1. 程序化工作流

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

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

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

小结

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

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

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 能够支持复杂的业务流程自动化,从而提高业务效率和透明度。

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()}};}
}

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 完成工作流的构建。


http://www.mrgr.cn/news/60400.html

相关文章:

  • appium+mumu模拟器 嚼碎菜鸟教程
  • YOLO11 目标检测 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签
  • 微信小程序的日期区间选择组件的封装和使用
  • 【WiFi7】 支持wifi7的手机
  • OpenCV视觉分析之运动分析(3)背景减除类:BackgroundSubtractorKNN的一系列get函数的使用
  • WPF+MVVM案例实战(七)- 系统初始化界面字体描边效果实现
  • Cobalt Strike隐藏特征与混淆流量
  • 元空间--JVM基础(8)
  • 拍拍贷鸿蒙版H5容器之路
  • 项目管理平台如何体现工程项目管理的主要特征?
  • 数据分析-38-关于互联网企业黑名单的探索
  • HarmonyOS NEXT应用元服务开发控件状态变化场景
  • Faster R-CNN
  • 2024第二届新能源汽车热管理论坛
  • 尚硅谷 | Nginx | 学习笔记
  • 开始实施!《商业银行业务档案管理规范》(DA/T 98-2023)
  • 【AI大模型】使用谷歌 Gemini API 构建自己的 ChatGPT(二)
  • Hugging Face | 个人使用笔记
  • Node-RED的面板的认识及操作
  • Linux第二讲:Linux权限理解
  • 海南华志亿星电子商务有限公司助力品牌销量飙升
  • 基于 ThinkPHP+Mysql 灵活用工_灵活用工系统_灵活用工平台
  • 通信原理概论复习笔记(2):模拟调制与数字调制
  • Spring Boot实用小技巧8 - 第530篇
  • 北京本盛数字科技有限公司-持续深耕AI智能化健康管理领域
  • nginx------HTTP模块配置详解