Slickflow.NET核心开源工作流引擎
目录
介绍
背景
使用代码
I:简单顺序过程编码示例
1.创建流程图
2.流程启动和操作
3.流程撤回和回发
II:简单的并行分支处理代码编写示例
1.创建分支流程图
2.流程启动和操作
3.撤回和回发
III:简单或分支过程编码示例
1.创建或分支流程图
2.流程启动和操作
3.撤回和回发流程
开发工具
1)Slickflow流程设计器
2)Slickflow WebTest工具
GitHub项目
总结
介绍
对于渴望了解引擎功能的开发人员,在下载版本之后,他们想要尝试编写代码以完成流程的开发和测试。本文试图说明如何通过一个简单的过程快速理解引擎代码编写。
背景
带有完整源代码的.NET/.NET Core工作流引擎
GitHub: https://github.com/besley/Slickflow
1、同时支持.NET和.NET CORE版本:Slickflow是一个基于.NET Framework 4.5,.NET CORE 2的开源项目。易于将引擎产品用于跨平台应用程序。
2、BPMN图形样式流程图:Slickflow使用BPMN表示法来描述流程图,Slickflow设计器是HTML5图形编辑器,对业务流程通信和业务分析非常友好。
3、Dapper.NET库具有高性能:Dapper是.NET的简单对象映射器,就速度而言,它拥有Micro ORM之王的称号,实际上与使用原始ADO.NET数据读取器一样快。ORM是对象关系映射器,它负责数据库和编程语言之间的映射。(参考:https://dapper-tutorial.net/dapper)
4、支持多个数据库:Slickflow支持SQLSERVER,ORACLE,MySQL等数据库,它由Dapper.NET扩展库实现。使用EF Core支持不同数据库产品的.NET Core版本。
5、支持的工作流程模式:
- 序列(Sequence):最常用的处理模式
- 拆分/合并(Split/Merge):支持and/or网关,例如and/or拆分,and/or联接,以及过渡时的条件变量
- 子流程(Sub-process):在主流程中,子流程节点可以启动新的流程生命周期。
- 多实例(Multi-instance):多个执行者通过多个任务实例一起处理一个任务。所有执行者都在竞争他们的任务,然后可以继续进行该过程。有顺序和并行模式,可以在其上设置百分比或计数参数,以确保何时可以进行下一步。
- 事件互操作(Event interoperation):流程实例和活动实例事件委托服务,例如流程/活动的启动、执行和完成。还支持通过属性页面上节点的配置来调用外部方法的事件。例如WebApi、SQL、StoreProcedure和Python脚本。
- 计时器(Timer):与HangFire库集成,并支持CRON表达式
- 电子邮件(Email):待办事项或过期任务的电子邮件通知
- 撤回 (Withdraw):仅在发送给下一步用户后才撤回任务。
- 回发(Sendback):发送回上一步用户,因为有一些异常。
- 重新发送(Resend):在回发后合并,然后将任务重新发送给原始回发用户。
- 反向(Reverse):完成处理后,还可以对流程实例进行实时反向处理。
- 跳转(Jump):向前或向后跳过几个步骤。
6、流程版本:由于业务流程已更改,流程具有版本属性以升级新定义。
7、XML缓存:运行时实例使用缓存来使XML流程图保持过期时间。
使用代码
I:简单顺序过程编码示例
前言:对于渴望了解引擎功能的开发人员,下载版本后,他们想要尝试编写代码以完成流程的开发和测试。本文试图说明如何从一个简单的流程快速理解引擎代码编写。
版本:.NET Core 2.1
1.创建流程图
序列用于创建顺序过程,节点是顺序生成的。
var pmb = ProcessModelBuilder.CreateProcess("BookSeller Process", "BookSeller Process Code");
var process = pmb.Start("Start").Task("Package Books").Task("Deliver Books").End("End").Store();
上面的代码创建了一个简单的序列过程,该过程具有四个节点,即起始节点,两个任务节点,并且该Store()方法用于数据库存储过程。流程图示例如下:
2.流程启动和操作
启动和运行过程是两个最常用的API接口。
2.1 流程启动
启动需要处理流程实例的创建,以及启动节点之后的任务节点的创建。示例代码如下:
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack").UseApp( "BS-100", "Delivery-Books", "BS-100-LX").UseProcess( " BookSellerProcessCode ").Start( );
流程记录清单:
2.2 流程运行
流程运行是从当前待办任务开始并运行到下一步的流程。解析流程时,下一步可能会有多个处理步骤,要求用户明确选择步骤列表(通常由弹出窗口中的前端用户指定)。在这里,可以使用一个示例作为一个简单的单步实例运行。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack").UseApp( "BS-100", "Delivery-Books", "BS-100-LX").UseProcess( " BookSellerProcessCode ").OnTask(8027) // TaskID.NextStepInt( "20", "Alice").Run( );
流程记录清单:
3.流程撤回和回发
3.1 流程撤回
如果用户在完成待办任务并将其发送给下一个经销商时发现错误消息,则他可以自己发起吊销并撤回当前流程。撤消内部处理逻辑等效于返回处理,除了发起人位于不同的位置。代码示例如下:
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice").UseApp( "BS-100", "Delivery-Books", "BS-100-LX").UseProcess( " BookSellerProcessCode ").OnTask( 8027) // TaskID.Withdraw( );
流程记录清单:
3.2处理回发
流程返回由当前的待办任务处理程序启动,并返回到流程的上一步。解析过程时,上一步可能有多个处理步骤,要求用户明确选择步骤列表(通常由前一步弹出时前端用户指定),该PrevStepInt()方法用于简化处理仅返回的处理步骤之一。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice").UseApp( "BS-100", "Delivery-Books", "BS-100-LX").UseProcess( " BookSellerProcessCode ").PrevStepInt().OnTask( 8030) // TaskID.SendBack( );
流程记录清单:
II:简单的并行分支处理代码编写示例
前言:对于渴望了解引擎功能的开发人员,在下载版本之后,他们希望尝试编写代码以完成流程的开发和测试。本文试图说明如何通过最简单的并行分支过程快速理解引擎代码编写。
版本:.NET Core 2.1
1.创建分支流程图
分支过程是一个常见的决策过程。本文以汽车订购过程为例,说明并行分支过程。并行分支通常用于多个部门可以同时执行任务的场景,并且每个单独的分支也可以视为串行序列片段。最后,多个分支通过接收器节点合并。
var pmb = ProcessModelBuilder.CreateProcess(" LargeOrderProcess ", " LargeOrderProcessCode ");
var process = pmb.Start("Start").Task( "Large Order Received").AndSplit( " AndSplit ").Parallels(() => pmb.Branch (() => pmb.Task ( "Engineering Review")), ( ) => pmb.Branch (() => pmb.Task ( "Design Review"))).AndJoin( " AndJoin ").Task( "Management Approve").End( "End").Store();
上面的代码创建带有两个分支的并行分支过程,分支为AndSplit- AndJoin。通过直接分配代码来设置图中节点的属性类型。流程图示例如下:
2.流程启动和操作
启动和运行过程是两个最常用的API接口。
2.1 流程启动
启动需要处理流程实例的创建,以及启动节点和启动节点之后的任务节点的创建。示例代码如下:
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack").UseApp("PS-100", "Large-Car-Order", "PS-100-LX").UseProcess("LargeOrderProcessCode").Start( );
活动实例记录表如下:
2.2 流程运行
流程运行是从当前待办任务开始并运行到下一步的流程。并行分支表示多个分支被同时触发,如上面的流程图所示:并行网关节点(AndSplit)同时触发了Design Review和Engineering Review ,因此在活动实例表中一次生成了两个新的活动记录。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack").UseApp( "PS-100", "Large-Car-Order", "PS-100-LX").UseProcess( " LargeOrderProcessCode ").OnTask( 8033).NextStepInt( "20", "Alice").Run( );
活动实例记录表如下:
3.撤回和回发
3.1 流程撤回
如果用户在完成待办任务并将其发送给下一个经销商时发现错误消息,则他可以自己发起吊销并撤回当前流程。撤消并行分支时,两个并行分支也同时撤回并撤销,这表明该分支是两个强相关类型的活动。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "Jack").UseApp( "PS-100", "Large-Car-Order", "PS-100-LX").UseProcess( " LargeOrderProcessCode ").OnTask( 8033) // TaskID.Withdraw ( );
活动实例记录表如下:
3.2 处理回发
流程返回由当前的待办任务处理程序启动,并返回到流程的上一步。如果返回并行分支的一个分支,则默认值为仅将当前分支之前的任务节点返回到网关,而不会影响另一个分支。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice").UseApp( "PS-100", "Large-Car-Order", "PS-100-LX").UseProcess( " LargeOrderProcessCode ").PrevStepInt().OnTask( 8038) // TaskID.SendBack( );
活动实例记录表如下:
由于对相邻分支的处理,并行分支的撤消和回退在引擎中很特殊。这里,仅描述退货后的结果记录,并且将安排退货的内部处理逻辑以供将来要专门介绍的另一篇文章。
III:简单或分支过程编码示例
前言:对于渴望了解引擎功能的开发人员,下载版本后,他们想尝试编写代码以完成流程的开发和测试。本文试图从离开流程或分支模式快速了解引擎代码的编写。
版本:.NET CORE 2.1
1.创建或分支流程图
Or分支过程是一个常见的决策过程,用于处理不同决策场景中的业务处理,其中每个分支都可以视为序列过程的一部分。以下是leave过程的创建代码:
var pmb = ProcessModelBuilder.CreateProcess(" LeaveRequest ", " LeaveRequestCode ");
var process = pmb.Start("Start").Task( "Fill Leave Days").OrSplit( " OrSplit ").Parallels(() => pmb.Branch (() => pmb.Task (VertexBuilder.CreateTask( "CEO Evaluate"),LinkBuilder.CreateTransition( "days>=3").AddCondition( ConditionTypeEnum.Expression , "Days> =. 3"))), () => pmb.Branch (() => pmb.Task(VertexBuilder.CreateTask ( "Manager Evaluate"),LinkBuilder.CreateTransition ( "days<3").AddCondition( ConditionTypeEnum.Expression , "Days <. 3")))).OrJoin( " OrJoin ").Task( "the Notify HR").End( "End").Store( );
上面的代码创建了一个OrSplit- OrJoin流程,其中有两个分支代表实际业务流程中的请假流程。完整流程图的示例如下:
Or分支是两个条件表达式的过渡。对于分支网关节点,该过程将根据传入的条件变量days的值来决定采用哪个分支。此过程可以视为休假过程中休假天数的分支选择。例如,如果请假天数少于3天,则部门经理将审批它。如果请假天数超过(包括)3天,则总经理将要求审批。审批决策可以通过分支模式或分支模式来实现。
2.流程启动和操作
启动和运行过程是两个最常用的API接口。
2.1 流程启动
启动需要处理流程实例的创建,以及启动节点和启动节点之后的任务节点的创建。示例代码如下:
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack").UseApp( "DS-100", "Leave-Request", "DS-100-LX").UseProcess( " LeaveRequestCode ").Start( );
活动实例记录表如下:
类似地,以leave过程为例,可以将第一任务节点视为“提交休假表格”,当员工填写休假表格时,可以将其视为开始流程。
2.2 流程运行
流程运行是从当前待办任务开始并运行到下一步的流程。因为它是分支网关还是分支网关,所以必须指定条件变量的名称和值来确定下一个分支路径。在此,需要传递作为条件变量的请假天数。当请假天数为3天时,网关将决定执行长批准节点,因此将仅选择一个分支进行路由。代码示例如下:
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "jack").UseApp( "DS-100", "Leave-Request", "DS-100-LX").UseProcess( " LeaveRequestCode ").OnTask( 8017).IfCondition( "Days", "3").NextStepInt( "20", "Alice").Run( );
活动实例记录表如下:
3.撤回和回发流程
3.1 流程撤回
如果用户在完成待办任务并将其发送给下一个经销商时发现错误消息,则他可以自己发起吊销并撤回当前流程。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("10", "Jack").UseApp( "DS-100", "Leave-Request", "DS-100-LX").UseProcess( " LeaveRequestCode ").OnTask( 8017) // TaskID.Withdraw ( );
活动实例记录表如下:
3.2 处理回发
流程返回由当前的待办任务处理程序启动,并返回到流程的上一步。如果返回并行分支的一个分支,则默认值为仅将当前分支之前的任务节点返回到网关,而不会影响另一个分支。
IWorkflowService wfService = new WorkflowService( );
var wfResult = wfService.CreateRunner("20", "Alice").UseApp( "DS-100", "Leave-Request", "DS-100-LX").UseProcess( " LeaveRequestCode ").PrevStepInt().OnTask( 8020) // TaskID.SendBack( );
活动实例记录表如下:
开发工具
1)Slickflow流程设计器
- http://demo.slickflow.com/sfd/
2)Slickflow WebTest工具
- http://demo.slickflow.com/sfw2/
GitHub项目
- Https://github.com/besley/Slickflow
总结
- 上面的代码可以帮助开发人员快速熟悉引擎组件的界面以及简单或分支的实用功能。完整功能需要在企业版或更高版本中获取。
- 助手开发工具中的Process Designer和Web测试工具,可以为用户提供直观的体验操作,也适合不同类型的业务用户;
- 代码创建过程和测试过程方便开发人员学习和快速入门,这是提高工作效率的有效途径。
Slickflow.NET核心开源工作流引擎相关推荐
- 三大主流开源工作流引擎技术分析与市场预测
1.从<功夫>说起 时下的新新人类看到我,一定会认为在下是个十足的老古董,这不,<功夫>这样的片子我到今年2月底才看.不过看过<功夫>,我想的一定比一般的人多:周星 ...
- drools规则引擎可视化_一文看懂开源工作流引擎 Flowable「转」
原文链接:[https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c]. 一.工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能,一个最常见 ...
- 几种开源工作流引擎的简单比较(转)
摘要:目前开源工作流引擎用的最多的是jbpm , 各种特性都不错, 文档也比较多, 下面只简单列举一下 目前开源工作流引擎用的最多的是jbpm , 各种特性都不错, 文档也比较多, 下面只简单列举一下 ...
- Java三大主流开源工作流引擎技术分析
首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 三大主流工作流引擎:Shark,oswo ...
- Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow
首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 四大主流工作流引擎:Shark,oswo ...
- java开源工作流引擎优势是什么?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.流程引擎的自我介绍 二.java开源工作流引擎优势介绍 总结 前言 IBPSv3.5是流辰信息团队面向Java开发 ...
- 分布式开源工作流引擎有什么特点?
在竞争越来越激烈的社会中,拥有提质增效的办公软件,可以为企业带来更可观的市场价值.分布式开源工作流引擎在企业数字化发展进程中深受欢迎,在帮助企业提升办公效率上发挥了重要的作用.今天,我们就一起里盘点下 ...
- 哪个开源工作流引擎更好?Flowable or Camunda ?
哪个开源工作流引擎更好? lecture:波哥 当下在国内大家可以选择的开源的工作流引擎还是比较多的,但是对于具体选择用哪个产品,各自的优缺点有哪些其实并不是太清楚,为此波哥今天专门给大家来整理总 ...
- Java三大主流开源工作流引擎分析
Java三大主流开源工作流引擎分析 首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 三大 ...
最新文章
- 用枚举来处理java自定义异常
- Spring的配置文件详解
- 【JFreeChart】JFreeChart—输出组合图表
- 在Ubuntu 18.04上安装和使用Tesseract 4
- Java中的Set对象去重
- 主干开发前要知道的,4错误认识+3优势
- 转行AI需要看的一些文章
- css top 定位百分比,css 使用relative设置top为百分比值的方法(仿百度首页)
- linux下kafka安装与配置
- HP 360G5 IO性能提高方法
- Xampp mysql启动
- puppet 安装详解
- 小米华为鸿蒙,华为鸿蒙比小米MIUI快,老外上手出结果
- Qt中QScrollArea控件区域与滑动条的颜色不一致设置
- python turtle库下载_python3中安装turtle库
- 速度曲线规划 ---- 梯形速度曲线
- linux 没有network服务,求助,network起不来
- 2021-2027全球与中国超声波焊接头市场现状及未来发展趋势
- YOLO v3 详解
- 统计学习方法 学习笔记(1)统计学习方法及监督学习理论
热门文章
- html5+上下左右边界顺序,详解canvas绘制多张图的排列顺序问题
- linux系统编译qt代码需要编译qt,linux下如何静态编译QT库,以及如何静态编译自己的程序...
- 元宵节正月十五素材图片,可以做壁纸高清!
- 设计师值得拥有的设计导航
- java volatitl_Java中的关键字volatitle
- python watchdog_Python watchdog
- Stack Overflow RToax
- Linux网络协议栈:中断下半部处理
- 使用持久内存开发工具包 (PMDK) 创建持久内存感知队列
- 通过零拷贝进行有效的数据传输(java、c)