前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响。

1. 流程事件

流程执行过程中,伴随各种事件的发生,而且是存在于整个流程的生命周期,即从流程启动一直到流程结束的整个过程都有事件发生。这些事件的发生,业务系统通常也需要知道一些流程过程的关键节点,或里程碑状态。我们统称为流程事件。

1.1  流程事件触发类型

流程事件类型的定义是按照事件发生的位置来确定划分,跟流程直接有关的比如有:启动、运行、撤销、退回、返送、跳转、返签和结束等。而跟活动有关的事件类型有:创建、执行和结束等。我们可以用下图来描述常见的事件触发:

1.2  流程事件触发实现

流程事件的触发,是按照先订阅,后触发的机制来实现。订阅(Subscribe)是流程服务接口开放出来的方法,可以直接在这个方法里面注册匿名函数来绑定事件。程序代码如下:

IWorkflowService wfService = new WorkflowService();
var wfResult = wfService.CreateRunner(runner.UserID, runner.UserName)
.UseApp(runner.AppInstanceID, runner.AppName, runner.AppInstanceCode)
.UseProcess(runner.ProcessGUID, runner.Version)
.NextStep(runner.NextActivityPerformers)
.IfCondition(runner.Conditions) //condition on the transiton
.Subscribe(EventFireTypeEnum.OnActivityExecuting, (activityInstanceID, activityCode, delegateService) => {
if (activityCode == "Task1")
{
delegateService.SetVariable("name", "book-task1");
delegateService.SetVariable("amount", "50");
}
return true;
})
.Run();

  

2. 事件类型节点

BPMN规范里面,涉及到事件类型的节点,虽然不同于任务类型的节点,但是事件类型的节点通常都是表示一种流程的状态,比如流程的开始和结束是最基本的两个状态。中间事件(Intermediate Event)是本次我们主要涉及到的事件类型的节点,其它事件类型的节点将在后期的文章中描述到。

2.1 中间事件(Intermediate Event)

中间事件(Intermediate Event)类型的节点一般用于流程中间状态的变换,而且可以作为流程里程碑的事件或状态触发,用于通知业务系统流程的里程碑状态已经发生,或者也可以收到业务系统的反馈的信息,用于一些流程下一步路径的解析。

比如在中间事件触发时,只有从业务系统中读取到业务变量,然后传入流程的下一步分支选择条件变量中,才能确定下一步的流转路径。这样的处理过程是经常的一种业务场景。一个有中间事件类型节点的流程图示意如下:

2.2 节点上事件的定义

在流程设计器中,节点上的事件定义主要有两个属性:事件触发的位置(执行前和执行后)、以及事件执行的表达式。一个定义示例描述如下:

        触发位置:执行前

        表达式:Slickflow.Module.External.OrderSubmitService

2.3 业务服务的代码实现

上文中提到的表达式是业务服务的程序代码,业务服务的逻辑实现,除了本身的功能代码实现,还需要继承如下的两个接口: ExternalServiceBase 和 IExternalService。 主要用于明确定义Execute()执行方法,然后在引擎内部执行过程中,在调用和执行这个接口方法。具体代码示例如下:

 /// <summary>
/// 订单提交服务类(对应订单流程中订单提交节点)
/// </summary>
public class OrderSubmitService : ExternalServiceBase, IExternalService
{
/// <summary>
/// 业务逻辑前置调用方法
/// </summary>
public override void Execute()
{
//实现用户自己的业务逻辑
var id = DelegateService.GetID();
var amount = DelegateService.GetVariable("amount"); DoSomethingElse(amount, 20);
} /// <summary>
/// 业务逻辑具体实现方法
/// </summary>
/// <param name="amount"></param>
/// <param name="newAmount"></param>
private void DoSomethingElse(string amount, int newAmount)
{
var intAmount = 0;
int.TryParse(amount, out intAmount); if (intAmount < newAmount)
{
DelegateService.SetVariable("amount", newAmount.ToString());
} //调用其它业务处理逻辑
var session = DelegateService.GetSession(); //实现其它数据库业务逻辑
//.............................
}
}

  

3. 委托服务的内部机制

委托服务用于统一处理所有流程发生的时间,跟事件交互过程中,除了触发事件本身以外,还要考虑引擎内部和外部业务系统之间的交互。比如流程变量的保存和读取就是一种交互应用。

3.1 委托服务接口

委托服务接口定义出事件订阅时候的接口类型,具体代码如下:

 /// <summary>
/// 委托接口
/// </summary>
public interface IDelegateService
{
int ID { get; set; }
int GetID();
IDbSession GetSession();
string GetVariable(string name, Nullable<ScopeTypeEnum> scopeType = null);
void SetVariable(string name, string value, Nullable<ScopeTypeEnum> scopeType = null);
string GetCondition(string name);
void SetCondition(string name, string value);
T GetInstance<T>(int id) where T : class;
}

3.2 委托服务继承类

继承委托服务的接口实现目前有两种类型,一是流程委托服务接口,而是活动委托服务接口。实现的主要目的是对流程变量的读取和存储,还有给外部应用展示流程实例的关键信息。

4. 流程变量

流程变量是流程流转过程发生的一些数据变化,这些变量一般是来自业务系统的关键参数,而且在流程流转时,通过条件表达式传入,可以决定流程流转下一步的路径选择。

4.1 流程变量类型

流程变量类型分为全局变量和局部变量。在程序中也可以命名为流程变量(ProcessVariable)和活动变量(ActivityVariable)。

4.2 流程变量存储

流程变量的存储是持久化存储在数据库表(WfProcessVariables)中,变量名和数值的key-value是其记录格式。

 delegateService.SetVariable("name", "book-task1");
delegateService.SetVariable("amount", "50");

  

5. 总结

流程引擎跟外部事件的交互实现,可以丰富业务过程的状态变化和响应,通过流程变量的存储,记录业务过程中的关键数据变化,同时也做到了对流程分支选择的路径跟踪。程序开发人员可以通过实现外部事件的委托服务,然后再订阅流程过程事件,来彻底实现业务系统跟引擎内部的进一步协作整合。

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

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

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

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

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

  3. Slickflow.NET 开源工作流引擎高级开发(五) -- 引擎和外部事件的交互

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

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

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

  5. Slickflow.NET 开源工作流引擎高级开发(四) -- 硬核编码:代码式快速构建流程图

    前言:通过设计器交互来创建流程图是比较常见的方式,这种方式是比较方便业务人员对流程的操作.然而,在需要流程模板,或者技术开发阶段以及一些自动化流程的处理过程中,使用代码快速创建流程图也是一种非常有必要 ...

  6. Slickflow.NET 开源工作流引擎快速入门之三: 简单或分支流程代码编写示例

    前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试.本文试图从请假流程,或分支模式来快速了解引擎代码的编写. 1. 创建或分支流程图形 或分支流程是常见的 ...

  7. Slickflow.NET 开源工作流引擎基础介绍(一) -- 引擎基本服务接口API介绍

    1. 工作流术语图示                                              图1 流程图形的BPMN图形元素表示 1) 流程模型定义说明流程(Process):是企 ...

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

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

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

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

随机推荐

  1. AngularJs -- 指令中使用子作用域

    下面将要介绍的指令会以父级作用域为原型生成子作用域.这种继承的机制可以创建一个隔离层,用来将需要协同工作的方法和数据模型对象放置在一起. ng-app和ng-controller是特殊的指令,因为它们 ...

  2. python技巧 合并两个字典

    python 3.5+ 版本 In [1]: a={'x':2,'y':4} In [2]: b={'c':1,'d':3} In [3]: c={'c':3,'y':6} In [4]:  w={* ...

  3. Replication容量和错误日志

    gtid排错 set sql_log_bin=off;  #人为关闭二进制日志

  4. C# XML 文档注释

    原文链接:http://www.shinater.com/DocsBuilder/help.html <summary>description</summary> 描述类型或类 ...

  5. 【坐在马桶上看算法】算法4:队列——解密QQ号

            新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的.所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则. ...

  6. How to fix Eclipse Tomcat startup timeout in 45 seconds?

    命题:怎么修复 Eclipse 里启动 Tomcat 时, 默认启动超时时间为 45 秒的问题? 在 Eclipse 的 J2EE 项目里启动 Tomcat 来调试 Servlet 之类的,断点以后, ...

  7. hadoop-2.7.2-HA安装笔记

    配置方案如图   NN DN ZK ZKFC JN RM NM(任务管理器) HMaster Region Server Node1 1 1 1 1 1 Node2 1 1 1 1 1 1 1 Nod ...

  8. TcxGrid 复选框

  9. 【OpenCV for Android】Android Studio JNI和NDK配置及采坑记录

    在配置好Android studio的OpenCV环境后,我们就可以通过Java代码调用OpenCV的API了,但是在通常情况下,用Java代码编写图像处理算法的运行效率是没有C++代码高的,在应用层 ...

  10. .NetCore使用FluentValidation实现友好验证提示

    Nuget包导入FluentValidation.AspNetCore 官方的用法是在services中添加如下来操作 services.AddMvc().AddFluentValidation(co ...