今天假期第一天,研究了.NET 5开源工作流框架elsa,现在分享给大家。

一、框架简介

elsa是一个开源的.NET Standard 工作流框架,官方网站:https://elsa-workflows.github.io/elsa-core/

以下列出了Elsa的一些关键功能:

  • 小巧,简单,快速。该库非常精简易用,同时快速执行并且易于通过自定义活动进行扩展。
  • 调用任意工作流程,就好像它们是我应用程序的功能一样。
  • 触发事件,使相应的工作流程基于该事件自动启动/恢复。
  • 支持长期运行的工作流程。当工作流程执行并遇到需要进行例如用户输入后,工作流将停止,保留并耗尽内存,直到可以恢复为止。这可能是几秒钟后,几分钟,几小时,几天甚至几年的时间。
  • 将工作流与特定于应用程序的数据相关联。这是长时间运行的工作流程的关键要求。
  • 以基于文件的格式存储工作流,因此我可以使其成为源代码管理的一部分。
  • 当我不想让工作流成为源代码管理的一部分时,可以将其存储在数据库中。
  • 基于Web版本的流程设计器。无论是将工作流存储在文件系统还是数据库中,还是将设计器在线托管还是仅在本地计算机上托管,都需要能够在线编辑工作流。
  • 使用表达式配置工作流程活动。通常,工作流处理的信息本质上是动态的,活动需要一种与该信息进行交互的方式。工作流表达式支持这类场景。
  • 可通过特定于应用程序的活动,支持自定义存储和脚本引擎进行扩展。
  • 调用其他工作流程。这允许从各种工作流程中调用可重用的应用程序逻辑。就像从C#调用通用功能一样。
  • 查看和分析执行的工作流程实例。查看工作流采用的路径,运行时状态,发生故障的位置并补偿发生故障的工作流。
  • 支持Web的工作流设计器嵌入我自己的仪表板应用程序中。可以选择创建一个运行所有应用程序逻辑的工作流主机,还可以选择在单个微服务中托管工作流运行时(允许进行编排和编排)。
  • 关注点分离:工作流核心库,运行时和设计器设计上完全分离。即当工作流宿主不应该依赖于基于Web的设计器时。例如,这允许您实施基于桌面的设计器,或者根本不使用设计器,而仅使用YAML文件。最后,主机只需要工作流程定义和对持久性存储的访问。
  • 支持本地或云端管理,因为Elsa只是您从应用程序引用的一组NuGet软件包。

二、产品主要功能

1. 可视化的工作流编辑器

Elsa带有一个独立的,可重复使用的HTML5工作流设计器Web组件,您可以将其嵌入自己的HTML网页中。设计器完全在客户端运行,并具有丰富的JavaScript API,该API可让您定义自定义插件以扩展其功能。

   2. Dashboard 看板

Elsa看板使您能够定义工作流程定义并检查执行的工作流程。要设计工作流程,只需右键单击画布,从活动选择器中选择一个活动,对其进行配置,然后拖动多个活动之间的连接以创建从简单的短期运行的工作流程到高级的长期运行的工作流程的流程。

  3. 支持长期和短期的工作流模式

Elsa提供了短期和长期工作流程。可以理解为简单的和复杂的流程设计

例如,当您需要实现业务规则引擎时,短时运行的工作流程非常有用,在该流程中,如果工作流程是一个接收输入并返回结果的函数,则可以从应用程序中调用它。

长时间运行的工作流能够轻松地实现涉及人和机器的复杂过程。长期运行过程的典型示例是文档批准工作流,其中某些文档的审阅过程涉及多方。这样的工作流程可能涉及计时器,电子邮件,提醒,HTTP请求,用户操作等。

 4. 丰富的工作流活动

     基本元语:是低级的技术活动。

  • SetVariable

      控制流:控制流活动提供对过程的控制。例如,Fork活动会将工作流程分为两个或多个执行分支。

  • ForEach
  • Fork
  • IfElse
  • Join
  • Switch
  • While

     工作流活动:活动代表工作流程中的单个步骤。开箱即用的Elsa NuGet套件套件为您提供了一系列不错的活动,主要包含以下工作流活动

工作流程:工作流类别中的活动与工作流级别的功能相关,例如相关性和信令。

  • Correlate
  • Finish
  • Signaled
  • Start
  • TriggerSignal
  • TriggerWorkflow

控制台活动:在实施带有工作流的基于控制台的应用程序时,控制台活动非常有用。

  • ReadLine
  • WriteLine

DropBox活动:Dropbox活动可帮助实现与Dropbox API集成。

  • SaveToDropbox

      电子邮件活动:电子邮件活动允许您使用SMTP发送电子邮件。

  • SendEmail

       HTTP活动:能够实现发送传出HTTP请求并响应传入HTTP请求的工作流,非常适合与基于外部Web的API集成。

  • ReceiveHttpRequest
  • SendHttpRequest
  • WriteHttpResponse

      定时器活动:定时器活动可以基于某些基于时间的事件(例如CRON表达式,常规计时器)或在将来的特定时间触发工作流。

  • CronEvent
  • InstantEvent
  • TimerEvent

       User Task:用户任务事件是用户自定义配置的活动,用户可以执行一系列可能的操作。每个动作对应于活动的结果。用户执行任何这些操作后,工作流将沿适当的路径恢复。这里的想法是您的应用程序将使用选定的操作触发工作流。

例如,这可以表示为一组简单的按钮。由您的应用程序决定如何呈现这些操作。

5. 版本控制

每个工作流程定义都是版本化的。发布工作流程的新版本时,其版本号会增加。现有工作流程实例仍将使用工作流程定义的先前版本,但新工作流程将使用最新版本。

    6. 持久化支持

  • CosmosDB (DocumentDB)

  • Entity Framework Core:各类关系型数据库,支持SQLServer

  • Memory:Non-persistent, use only for tests and/or short-lived workflows.

  • MongoDB

  • YesSQL

    7. 表达式

工作流活动可以使用表达式,这些表达式可以炸运行时执行,使用表达式可以引用其他活动产生的值。Elsa支持以下三种类似的表达式:

  文字表达式:

文字表达式不是一个真正的解释,当你需要设置,无需运行时计算活动属性的值才会被使用。

  JavaScript表达式:

当你需要计算一些数值或读取工作流程中的过程值时通常使用JavaScript表达式。

             液体表达式(这个名字很奇怪,目前还在研究中)

当你需要创建一个HTTP请求,HTTP响应的计算通常使用流式表达式,或例如其中主体被标记使用液体发送电子邮件时。

    三、产品扩展能力

Elsa的最重要和最强大的功能之一就是其可扩展性。

1. 工作流活动
许多过程是特定业务领域的,并且能够使用代表业务领域的特定语言的一组活动来创建工作流是一项强大的功能。

用特定领域的活动扩展Elsa非常简单。只需实现一个继承自C#的C#类,Activity并在服务容器中注册它,就可以使用了。活动将在工作流设计器中自动变为可用,并且默认情况下其所有公共属性都是可编辑的。

2. 持久化扩展
Elsa附带了许多持久性提供程序,例如内存,EF Core,MongoDB,YesSQL和CosmosDB。尽管这些提供程序应满足最常见的需求,但当然不限于这些。实现IWorkflowDefinitionStore为工作流定义提供定制存储,并实现IWorkflowInstanceStore为工作流实例提供定制存储。请注意,用户可以混合和匹配,这意味着您可以例如将EntityFrameworkCoreWorkflowDefinitionStorefor用于工作流定义``。

3. JavaScript函数
JavaScript表达式附带了一些您可能经常使用的有用的JavaScript函数。例如,它允许您从工作流程中读取变量并引用活动输出值。但是,如果您发现自己需要其他功能,则可以很容易地从您自己的应用程序中扩展功能集。

4. 液体表达式
Liquid表达式还附带了一些可能经常使用的有用过滤器。例如,它允许您从工作流程中读取变量并引用活动输出值。但是,如果您发现自己需要其他功能,可以很容易地从您自己的应用程序中扩展过滤器集。

5. 表达式解析执行
也许JavaScript和Liquid还不够好,可以使用用C#,VBScript或Python编写表达式。只需实现您自己的版本IExpressionEvaluator,即可在服务容器中注册它,即可在任何活动中使用自定义评估程序语法。

  四、与Windows Workflow Foundation对比
    目前,微软已经停止更新发展 Windows Workflow Foundation,同时技术社区也在努力做WF to .NET Standard, 但是elsa有以下2点优势:

  • Elsa intrinsically supports triggering events that starts new workflows and resumes halted workflow instances in an easy to use manner. E.g. workflowHost.TriggerWorkflowAsync("HttpRequestTrigger");"will start and resume all workflows that either start with or are halted on the HttpRequestTrigger.Elsa has a web-based workflow designer. I once worked on a project for a customer that was building a huge SaaS platform.
  • One of the requirements was to provide a workflow engine and a web-based editor.Although there are commercial workflow libraries and editors out there, the business model required open-source software. We used WF and the re-hosted Workflow Designer. It worked, but it wasn't great.

  五、源代码编译构建

项目源代码地址:https://github.com/elsa-workflows/elsa-core

通过VS2019,使用克隆的方式,将代码克隆到本地编译构建。

项目使用了Angular,在调试运行前,本地需要完成NPM包安装和JS 编译,所以本地需要先安装NodeJS

切换到XX\src\dashboard\Elsa.Dashboard\Theme\argon-dashboard, 执行NPM Install

安装过程中,涉及到Python相关的组件和环境变量配置,所以可能会安装失败,出现异常:

checking for Python executable "python2" in the PATH Can't find Python executable "python2.7", you can set the PYTHON env variable.

此时,先删除delete node_modules文件夹, 然后执行: npm install --global windows-build-tools

python组件安装完成后,执行以下命令:

npm config set python C:\Users\zhougq\.windows-build-tools\python27\python.exe

npm install

  

NPM Install成功后,在目录src\dashboard\Elsa.Dashboard\Theme\argon-dashboard下执行以下指令:gulp build

     

此时elsa Dashboard前端项目全部编译通过。

接下来可以通过:

VS:Elsa.Dashboard.Web 项目工程调式

也可以在Elsa.Dashboard.Web文件件下运行dotnet run.

浏览器中直接访问:http://localhost:port/elsa/home,就可以使用了elsa了。

以上是对elsa的初步研究,分享给大家。

周国庆

2021/1/1

.NET 5 开源工作流框架elsa技术研究的更多相关文章

  1. 详解工作流框架Activiti的服务架构和组件

    摘要:通过这篇文章,可以对工作流有一个基本的认识,为后续工作流框架Activiti的学习打下坚实的基础. 本文分享自华为云社区<BPMN工作流的基本概念!详解工作流框架Activiti的服务架构 ...

  2. Java三大主流开源工作流引擎技术分析

    首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 三大主流工作流引擎:Shark,oswo ...

  3. 开源工作流引擎 Workflow Core 的研究和使用教程

    目录 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 二,IStepBuilder 节点 三,工作流节点的逻辑和操作 容器操作 普通节点 事件 条件体和循环体 ...

  4. .Net开源工作流Roadflow的使用与集成

    序言 最近公司要整理公司内部oa系统,需要使用到工作流,所以就开始了开源工作流挑选,使用,到集成到公司内部系统的工作. 首先在网上搜了文档,自己也有补充,整理啦国内几款工作流的比较,由于没有个个击破式 ...

  5. .Net开源工作流Roadflow的使用与集成(转)

    序言 最近公司要整理公司内部oa系统,需要使用到工作流,所以就开始了开源工作流挑选,使用,到集成到公司内部系统的工作. 首先在网上搜了文档,自己也有补充,整理啦国内几款工作流的比较,由于没有个个击破式 ...

  6. .net 开源工作流比较及应用

    送上比较内容图: 鉴于这个表的内容,与公司技术与需求的结合,我们选择啦RoadFlow工作流引擎. 下面踏上RoadFlow的征程. RoadFlow的下载.部署.及使用 官方网址:http://cq ...

  7. 移动app框架inoic功能研究

    原生移动app框架inoic功能研究 本篇只侧重框架提供的功能和能力的研究,请关注后续实际部署使用体验. 一.inoic是什么? inoic是一个可以使用Web技术以hybird方式开发移动app的前 ...

  8. Java开源 开源工作流

    OpenEbXML   点击次数7801 Werkflow   点击次数11181 OSWorkflow   点击次数14988 wfmOpen   点击次数7997 OFBiz   点击次数1234 ...

  9. .net开源工作流引擎ccflow

    关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...

随机推荐

  1. 【2020.11.30提高组模拟】删边(delete)

    删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...

  2. 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    [GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...

  3. PyQt(Python+Qt)学习随笔:containers容器类部件QStackedWidget堆叠窗口属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.堆叠窗口简介 StackedWidget堆叠窗口部件为一系列窗口部件的堆叠,对应类为QStack ...

  4. Nodepad++ 没有TextFX Characters插件

    Nodepad++ 没有TextFX Characters插件 原因:从6.5以上的某个版本开始,就没有了默认的这个插件. 我试了最新的版本下载插件也不行,只好下载一个6.4.5的版本,再更新插件管理 ...

  5. Dell R740 使用U盘安装 CentOS7.4 出现Warning:dracut-initqueue timeout - starting timeout scripts解决办法

    使用使用UltraISO软碟通刻录U盘,然后在Dell R740服务器安装CentOS7.4会出现如下错误: 解决办法: 1.使用blkid确认U盘的盘符,截图如下: 2.按F11键重启 3.进入启动 ...

  6. MySQL技术内幕InnoDB存储引擎(五)——索引及其相关算法

    索引概述 索引太多可能会降低运行性能,太少就会影响查询性能. 最开始就要在需要的地方添加索引. 常见的索引: B+树索引 全文索引 哈希索引 B+树索引 B+树 所有的叶子节点存放完整的数据,非叶子节 ...

  7. Android全面解析之由浅及深Handler消息机制

    前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Handler的博客可谓是俯拾皆是,而这也是一个老生常谈的话题,可见的他非常基础,也非常重要.但很多的博客,却很少有从入门开始介绍,这在我一开始学习的时候 ...

  8. K8s 终将废弃 docker,TKE 早已支持 containerd

    近日 K8s 官方称最早将在 1.23版本弃用 docker 作为容器运行时,并在博客中强调可以使用如 containerd 等 CRI 运行时来代替 docker.本文会做详细解读,并介绍 dock ...

  9. web服务器专题:tomcat(二)模块组件与server.xml 配置文件

    web服务器专题:tomcat(二)模块组件与server.xml 配置文件 回顾: Web服务器专题:tomcat(一) 基础模块 一个Server.xml的实例 <?xml version= ...

  10. Flink 自定义触发器

    import org.apache.flink.api.common.state.ReducingState; import org.apache.flink.api.common.state.Red ...