Elsa工作流简介
工作流是什么?
引用维基百科中对工作流的解释:
是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算
Elsa 是一个功能强大的工作流库,支持在任何 .NET 应用程序中执行工作流。Elsa 可以使用C#代码或使用基于Web的可视化设计器生成JSON等方式定义工作流程。
Elsa 可用于多种场景,包括:
- 长时间运行的工作流程,例如订单履行和产品批准。
- 运行时间较短的工作流程,例如发送电子邮件和生成 PDF。
- 计划的工作流,例如发送每日报告。
- 事件驱动的工作流,例如在用户注册时发送欢迎电子邮件。
Elsa免费且开源,并且有较完善的文档,了解更多请访问官网和官方仓库
工作流的基本概念
要定义一个工作流,需要包含两个最基本的信息:
- 对一系列任务的执行过程的描述;
- 各任务之间执行关系的描述。
在Elsa中,这些被抽象为:
- 活动(Activity): 执行任务的实体,如:写入文本、发送邮件、执行SQL、执行HTTP请求等;
- 工作流(Workflow):包含多个活动,以及活动之间的执行关系, 如:并行、串行、分支、循环等;
有了活动和工作流,就可以描述一个任务的执行过程了。但为了满足业务的复杂性,Elsa还引入了更多的功能和概念。
上下文系统
活动的本质是执行任务,任务的执行需要数据支持,或返回结果。下游的任务也可能依赖于上游任务的返回结果,如:一个发送执行结果邮件任务,需要知道接收信息和前一个任务的执行结果。上下文系统就是用来支持任务执行过程中的数据传递的。
上下文系统包括:
- 变量(Variable);
- 工作流输入/输出(Input/Output);
- 活动输入/输出;
- 结果(OutCome)。
阻断/恢复功能
一些场景下,任务不会连续执行,需要暂停任务,任务恢复后,需要继续执行。
这些场景包括:
- 延时触发,或按计时器规则触发的任务;
- 接收到某个消息才执行的任务。
这些功能在Elsa中使用书签(Bookmark) 和 事件(Event)等类型实现。
设计器(Designer)
硬编码的方式已经无法满足复杂的业务场景,设计器可以将工作流设计为一个图形化的界面,用户可以拖拽活动,连线,设置活动的属性;活动被打包成一个节点(Node),与活动之间的连线表示活动之间的依赖关系。
定义(Definition)与实例化(Instance)
工作流定义描述了一个工作流的结构,比如:名称,变量,包含的活动等,可以理解为一个工作流的模板。
工作流定义在Elsa初始化时会“注册” 到资源池中,每个工作流定义都有一个唯一的ID。
使用设计器生成的工作流,通过序列化成JSON字符串,并持久化到数据库。
使用硬编码创建的工作流,在Elsa初始化时将工作流注册到工作流定义并持久化到数据库。
实例化是根据定义创建一个工作流的实例,工作流实例包含工作流状态(WorkflowState)以及活动实例(ActivityState)。与定义一样,它们通过序列化成JSON字符串,并持久化到数据库。当程序重新启动时,会从数据库中恢复工作流实例。