zoukankan      html  css  js  c++  java
  • .NET 开源工作流: Slickflow流程引擎高级开发(五) -- 引擎和外部事件的交互

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

    1. 外部事件的类型

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

    public enum ActionMethodType
    {
      LocalMethod, //本地程序
      WebAPI,  //调用WebAPI程序
      SQL,    //执行SQL脚本
      StoreProcedure,    //调用存储过程
      Python,     //执行Python脚本
    }
    

    2. 外部事件的调用方法

    2.1 本地程序

    1) 节点属性定义

      2) 本地程序方法实现 

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

    /// <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();
                 //实现其它数据库业务逻辑
                //.............................
            }
    }

        在引擎流转执行过程中,当解析到节点上有调用外部事件的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方法来读取参数列表,从而完成最终方法的调用。

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

  • 相关阅读:
    GB28181 流媒体几种数据传输模式UDP、TCP(被动、主动)
    LiveGBS
    利用ffmpeg采集纯音频推流到LiveQing实现RTMP、FLV、HLS web直播与录像回放
    LiveQing高性能RTMP、FLV、HLS视频流媒体服务器软件如何自定义修改成自己的服务软件名称
    LiveQing
    LiveQing直播流媒体服务解决直播录像存储、直播录像回看、直播录像计划排班配置
    GB28181流媒体服务LiveGBS前端源码(vue+webpack)
    LiveNVR
    华为、科达、海康、大华等厂家摄像头通过非标方式(RTSP)接入流媒体服务实现WEB直播与录像
    LiveNVR RTSP流媒体服器软件通过按需直播降低企业服务带宽
  • 原文地址:https://www.cnblogs.com/slickflow/p/11495413.html
Copyright © 2011-2022 走看看