前言:引擎组件的基本职责是负责流程流转,但是在流转过程中,除了对内部控制逻辑进行实现外,也不可避免的要去调用或者响应外部事件。本文主要描述外部事件的类型,以及调用方法过程。

1. 外部事件的类型

外部事件的类型是随着引擎功能的需要而不断增加,开发人员也可以在此基础上进行扩展,目前主要常用的事件类型如下:

  1. public enum ActionMethodType
  2. {
  3.   LocalMethod, //本地程序
  4.   WebAPI, //调用WebAPI程序
  5.   SQL, //执行SQL脚本
  6.   StoreProcedure, //调用存储过程
  7.   Python, //执行Python脚本
  8. }

2. 外部事件的调用方法

2.1 本地程序

1) 节点属性定义

 2) 本地程序方法实现 

要调用的外部服务类,需要首先继承ExternalServiceBase类,同时实现IExternalService接口。下面的OrderSubmitService类就是一个具体实现类。请参考Slickflow.Module.External项目。

  1. /// <summary>
  2. /// 订单提交服务类(对应订单流程中订单提交节点)
  3. /// </summary>
  4. public class OrderSubmitService : ExternalServiceBase, IExternalService
  5. {
  6. /// <summary>
  7. /// 业务逻辑前置调用方法
  8. /// </summary>
  9. public override void Execute()
  10. {
  11. //实现用户自己的业务逻辑
  12. var id = DelegateService.GetID();
  13. var amount = DelegateService.GetVariable("amount");
  14. DoSomethingElse(amount, );
  15. }
  16.  
  17. /// <summary>
  18. /// 业务逻辑具体实现方法
  19. /// </summary>
  20. /// <param name="amount"></param>
  21. /// <param name="newAmount"></param>
  22. private void DoSomethingElse(string amount, int newAmount)
  23. {
  24. var intAmount = ;
  25. int.TryParse(amount, out intAmount);
  26.  
  27. if (intAmount < newAmount)
  28. {
  29. DelegateService.SetVariable("amount", newAmount.ToString());
  30. }
  31.  
  32. //调用其它业务处理逻辑
  33. var session = DelegateService.GetSession();
  34. //实现其它数据库业务逻辑
  35. //.............................
  36. }
  37. }

在引擎流转执行过程中,当解析到节点上有调用外部事件的Action定义时,将会使用反射方法,查找到组件是否有OrderSubmitService类,并且是实现了ExtneralServiceBase和IExternalService 接口的服务类,才能被执行其中的Execute()方法,必须满足上述的查找基类继承和接口实现条件才能被反射执行,否则是不能被执行的。这样可以确保是执行到了明确定义的事件程序代码。

2.2 WebAPI

 步骤1:节点属性上的事件定义

 步骤2:流程变量定义

通过WorkflowService接口写入流程变量(WfProcessVariable),变量用来传递WebApi方法的参数,此处作为示例:

 步骤3:被调用WebApi程序的接口方法实现示例

上述示例中有两个参数:runner和role, 在WebApi的方法代码中,可以使用JSON格式数据作为接收,然后根据做序列化处理。

2.3 SQL

在节点绑定事件中,可以执行SQL语句,SQL语句的文本和参数可以通过节点属性来定义,如下图所示:

流程变量的参数列表:

 2.4 StoreProcedure

存储过程是数据库定义的包含SQL脚本语法的程序过程(比如把上述的SQL脚本单独保存为存储过程),默认限定在同一个数据库实例中,支持入口参数,定义时,指定参数名称还有存储过程的名称就可以。

2.5 Python

Python脚本调用通SQL脚本调用,需要复制Python脚本,然后申明参数列表。需要主要的是目前仅支持IronPython版本。

3. 总结:

在跟外部事件交互调用过程中,调用逻辑统一封装在ActionExecutor.cs文件中,代码实现并没有特别复杂,主要是统一做了参数的存储和调用的处理,其中参数存在WfProcessVariable表中,然后在事件调用过程中,使用DelegateService方法来读取参数列表,从而完成最终方法的调用。

客户方如果对一些代码的实现有特殊的要求,客户方开发人员可以在此基础上完成二次开发或者定制,其基本要求是明白以下三个要素:节点属性定义读取、流程变量的存储和读取以及动态方法的调用。

Slickflow.NET 开源工作流引擎高级开发(五) -- 引擎和外部事件的交互的更多相关文章

  1. Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合

    前言:  流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...

  2. Slickflow.NET 开源工作流引擎高级开发(一) -- 流程外部事件的调用和变量存储实现

    前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响. 1. 流程事件 流程执行过程中,伴随各种事件的发生,而且 ...

  3. Slickflow.NET 开源工作流引擎高级开发(六) -- WebTest 引擎接口模拟测试工具集

    前言:引擎组件的接口测试不光是程序测试人员使用,而且也是产品负责人员需要用到的功能,因为在每一步流转过程中,就会完整模拟实际用户发生的场景,也就容易排查具体是程序问题还是业务问题,从而快速定位问题,及 ...

  4. Slickflow.NET 开源工作流引擎基础介绍(六)--模块化架构设计和实践

    前言:在集成Slickflow.NET 引擎组件过程中,引擎组件需要将用户,角色等资源数据读取进来,供引擎内部调用:而企业客户都是有自己的组织架构模型,在引入模块化架构设计后,引擎组件的集成性更加友好 ...

  5. Slickflow.NET 开源工作流引擎基础介绍(二) -- 引擎组件和业务模块的交互

    集成流程引擎的必要性 业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性.一种直接的方式是改造 ...

  6. Slickflow.NET 开源工作流引擎基础介绍(二) -- 引擎组件和业务系统的集成

    集成流程引擎的必要性 业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性.一种直接的方式是改造 ...

  7. .NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用

    前言:工作流流程过程中,除了正常的人工审批类型的节点外,事件类型的节点处理也尤为重要.比如比较常见的事件类型的节点有:Timer/Message/Signal等.本文重点阐述消息类型的节点处理,以及实 ...

  8. .NET 开源工作流: Slickflow流程引擎高级开发(十) -- BpmnJS流程设计器集成

    前言: 在Slickflow产品开发过程中,前端流程设计器经历了几个不同的版本(jsPlumb, mxGraph等),目的是为了在设计流程时的用户体验更加良好,得到客户的好评和认可.BpmnJS流程设 ...

  9. Slickflow.NET 开源工作流引擎高级开发(二) -- 流程快速测试增值服务工具介绍

    前言:流程是由若干个任务节点组成,流转过程就是从一个节点转移到下一个节点,通常需要不断切换用户身份来完成流程的测试,这样使得测试效率比较低下,本文从实战出发,介绍常见的两种快速测试方法,用于提升流程测 ...

随机推荐

  1. Centos7上离线搭建PHP-7.2.26

    一.下载php源安装包,解压至/home/php目录下 下载地址:https://www.php.net/distributions/php-7.2.26.tar.gz [root@localhost ...

  2. jquery实现商品sku多属性选择(商品详情页)

    转载于https://blog.csdn.net/csdn924618338/article/details/51455595 实现效果 源码 <!DOCTYPE HTML> <ht ...

  3. Node.js+Express+MongoDB数据库实现网页注册登入功能

    通过 Node.js + Express + MongoDB 实现网页注册账号 和 登入账号的功能 项目准备: 1: 事先准备好项目的页面 (首页页面 index.html)(登入页面 login.h ...

  4. JS---DOM---总结绑定事件的区别

    总结绑定事件的区别: addEventListener(); attachEvent()   相同点: 都可以为元素绑定事件 不同点: 1.方法名不一样 2.参数个数不一样addEventListen ...

  5. JS---DOM---part4 课程介绍 & part3 复习

    part4 课程介绍 事件 1. 绑定事件的区别 2. 移除绑定事件的方式及区别和兼容代码 3. 事件的三个阶段 4. 事件冒泡 5. 为同一个元素绑定多个不同的事件,指向的是同一个事件处理函数 6. ...

  6. ORA-27140: attach to post/wait facility failed

    Errors in file /home/u01/app/oracle/diag/rdbms/hnybdb21/hnybdb211/trace/hnybdb211_j000_143099.trc:OR ...

  7. linux学习第一周

    1. 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别 2. 安装Centos7.6操作系统,创建一个自己名字的用户名,并可以正常登录,将主要步骤截图. 3. 配置环境变量,实现执行hi ...

  8. 【UR #6】懒癌

    Problem Description 你绞尽脑汁也没有解开智商锁给的迷题,只见哐地一下门就开了:"您与锁的主人智商一致." 于是你们窃取了大量内部资料,最后端掉了 \(IIIS\ ...

  9. c++多个文件中共用一个全局变量 变量跨文件使用

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12047602.html 虽然很多博客都写过这个了 但是 我还是继续补充的详细一点吧  毕竟很多 ...

  10. python3 print() 函数带颜色输出 示例

    1.1 实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就 ...