[.NET项目实战] Elsa开源工作流组件应用(一): Elsa工作流简介
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字符串,并持久化到数据库。当程序重新启动时,会从数据库中恢复工作流实例。
[.NET项目实战] Elsa开源工作流组件应用(一): Elsa工作流简介的更多相关文章
- react 项目实战(四)组件化表单/表单控件 高阶组件
高阶组件:formProvider 高阶组件就是返回组件的组件(函数) 为什么要通过一个组件去返回另一个组件? 使用高阶组件可以在不修改原组件代码的情况下,修改原组件的行为或增强功能. 我们现在已经有 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-5.开源工具的优缺点选择和抽象方法的建议
笔记 5.开源工具的优缺点选择和抽象方法的建议 简介:讲解开源工具的好处和弊端,如pageHeper分页拦截器,tk自动生成工具,抽象方法的利弊等 1.开源工具 好处: ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总
2018年Spring Boot 2.x整合微信支付在线教育网站高级项目实战视频课程 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在 ...
- ②SpringCloud 实战:引入Feign组件,完善服务间调用
这是SpringCloud实战系列中第二篇文章,了解前面第一篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 简介 Feign 是一个声明式的 RE ...
- ⑥SpringCloud 实战:引入gateway组件,开启网关路由功能
这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...
- .NET Core/.NET5/.NET6 开源项目汇总3:工作流组件
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- 开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用
微软的Workflow Foundation基于.Net Framework,并且没有向.Net Core迁移的计划.我们的很多项目使用了工作流引擎,这些项目向.Net Core以及更高版本迁移时遇到 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- 基于开源SuperSocket实现客户端和服务端通信项目实战
一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...
随机推荐
- Linux 中通过虚拟地址获取物理地址并锁定
在 Linux 开发过程中,申请内存后,某些时候需要用物理地址传给其他外设进行写入或者读取操作,同时考虑到防止被操作系统 sawp,导致实际的物理地址发生变化,从而在操作对应的虚拟地址时无法正常运行等 ...
- 如何修改11g RAC集群名称
背景:有一套11.2.0.4 RAC集群的环境,为了测试DG,直接复制了一套一模一样的环境,修改过IP之后,依然有问题,无法同时启动. 初步判断是因为在同一子网存在两个同名的集群(都是jystdrac ...
- FolkMQ "单线程"消息中间件 v1.0.32 发布
简介 采用 "单线程" + "多路复用" + "内存运行" + "快照持久化" + "Broker 集群模式& ...
- Python Rich:美化终端显示效果
Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),它帮助开发者在控制台(命令行)输出中创建丰富.多彩和具有格式化的文本. 本篇总结了如何使用Rich库让我们的命令行工具更加美观 ...
- Vue DevTools 安装和浏览器跳转到编辑器指定组件
Vue DevTools install and Open component in editor 1.在谷歌浏览器安装vue 插件 1.1下载vue插件 链接:https://pan.baidu.c ...
- Spring Boot图书管理系统项目实战-2.项目搭建
导航: pre: 1.系统功能和架构介绍 next:3.用户登录 只挑重点的讲,具体的请看项目源码. 1.项目源码: 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.添加依赖 <depe ...
- Jsp+Servlet实现文件上传下载(三)--删除上传文件
接着上一篇讲: Jsp+Servlet实现文件上传下载(二)--文件列表展示点击打开链接 本章来实现一下删除已上传文件,同时优化了一下第一章中的代码. 废话少说,上代码 --------------- ...
- python第五章pta习题总结
四.编程部分 1.sorted函数: sorted(iterable, cmp=None, key=None, reverse=False) #iterable:可迭代的对象 #cmp:比较规则 #k ...
- Spring源码之容器的功能拓展-ApplicationContext
目录 一.解析预备 刷新上下文环境 例如对系统属性或者环境变量进行校验和准备 二.初始化 BeanFactory 并进行 Xml 配置文件的读取 三.对BeanFactory 各种功能填充 四.激活以 ...
- Android里使用AspectJ实现双击自定义注解
创建注解 首先创建一个双击注解. import java.lang.annotation.ElementType; import java.lang.annotation.Retention; imp ...