Slickflow.NET 开源工作流引擎基础介绍(二)

  1. 集成流程引擎的必要性

    业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性。一种直接的方式是改造业务代码,适应业务过程的变化,这将会面临不断改写代码的需求;还有一种方式是使用流程引擎控制业务过程的变化,将改写业务代码的操作交由流程引擎,通过流程引擎解析业务规则,驱动业务过程流转,从而将改写业务代码的可能性降到最低。

    显而易见,流程引擎带来的好处是为了更好解决业务过程变化后带来的重构风险,信息系统如果是柔性的,可伸缩,可动态适应的,那么它才可以保持不被很快被替代的可能性,自然就能够为企业降低不断升级或实施产生的成本费用。

  2. 业务过程和流程引擎的交互方式

    业务过程中嵌入流程引擎中间件,是一种常见而直接的方式;虽然有些引擎组件能够配置业务模块的反射接口,但是我们目前认为比较合理的方式是:流程引擎不应过多地绑定业务接口,因为业务接口的变化是始终不可避免,会一直发生的,而引擎组件同样需要保持稳定。

    通常在业务模块中,当处理业务功能后,也会调用引擎组件的服务接口,驱动业务流程流转。我们一直把业务变化部分交由业务过程的服务处理,流程引擎中间件始终只处理解析规则,驱动流转的职责。这样可以避免引擎组件的功能膨胀,保持引擎组件的灵巧。

    常见的业务过程调用流程引擎服务接口的图示:

    Step 1:  当前正在执行功能单元发起的调用

    Step 2:  执行完毕,下一步已经处在等待中的功能单元

  3. 流程引擎中间件集成方式的优势

    首先,流程引擎中间件的职责是解析业务规则,驱动业务过程运转。人们不断地将引擎功能封装为组件,从而方便业务模块的调用。将最复杂,最容易变化的部分交由引擎中间件处理,才可以让用户更加专注于业务功能的实现。将引擎组件的功能从业务模块中分离出来,整体上降低了整个系统的复杂程度,使业务系统变得更加容易维护。

    其次,流程引擎中间件提供动态组件引用,以及WebService访问;可以满足多种架构系统的集成需求。在当前互联网云端模式的软件架构盛行的模式下,中间件可以以WebService方式提供Restful的API接口,使得引擎提供的服务能够跨越系统结构,组织边界来驱动业务过程流转,这种分布式的模式极大地发挥了引擎中间件的功能效用。

  4. 代码示例

    以下代码演示业务类(生产订单)如何集成工作流引擎并调用服务接口的过程。

  4.1 实现IWfServiceRegister接口

    /// <summary>
    /// 工作流注册接口
    /// </summary>
    public interface IWfServiceRegister
    {
        WfAppRunner WfAppRunner { get; set; }
        void RegisterWfAppRunner(WfAppRunner runner);
    }

  4.2 接口实现代码示例

    /// <summary>
    /// 生产订单服务
    /// 示例代码,请勿直接作为生产项目代码使用。
    /// </summary>
    public partial class ProductOrderService : ServiceBase, IProductOrderService, IWfServiceRegister
    {
        #region IWorkflowRegister members
        public WfAppRunner WfAppRunner
        {
            get;
            set;
        }
        public void RegisterWfAppRunner(WfAppRunner runner)
        {
            WfAppRunner = runner;
        }
        #endregion
    }

  4.3 业务调用示例

  1) WfService服务接口注册

    IWfServiceRegister sr = ProductOrderService as IWfServiceRegister;
    sr.RegisterWfAppRunner(runner);
    WfAppResult appResult = ProductOrderService.Sample(productOrder);     //此处调用业务类的节点方法,内部有流程交互代码。
    if (appResult.Status == 1)
        result = ResponseResult.Success("打样操作成功!");
    else
        result = ResponseResult.Error(string.Format("打样操作失败:{0}", appResult.Message));

  2) 业务类方法实现

    /// <summary>
    /// 打样
    /// </summary>
    /// <param name="entity"></param>
    public WfAppResult Sample(ProductOrderEntity entity)
    {
        var appResult = WfAppResult.Default();
        var wfas = new WfAppInteropService();
        var session = SessionFactory.CreateSession();
        try
        {
            session.BeginTrans();
            //流程运行
            var result = wfas.RunProcess(session, WfAppRunner, WfAppRunner.Conditions);    //流程交互类调用
            if (result.Status == WfExecutedStatus.Success)
            {
                //写步骤记录表
                Write(session, WfAppRunner, "打样", entity.ID.ToString(), entity.OrderCode, "完成打样");
                //业务数据处理部分,此处是简单示例...
                UpdateStatus(entity.ID, (short)ProductOrderStatusEnum.Sampled, session);
                session.Commit();
                appResult = WfAppResult.Success();
            }
            else
            {
                session.Rollback();
                appResult = WfAppResult.Error(result.Message);
            }
        }
        catch (System.Exception ex)
        {
            session.Rollback();
            appResult = WfAppResult.Error(ex.Message);
        }
        finally
        {
            session.Dispose();
        }
        return appResult;
    }

  4.4 流程应用交互API封装

    /// <summary>
    /// 工作流运行
    /// </summary>
    /// <param name="session"></param>
    /// <param name="runner"></param>
    /// <returns></returns>
    public WfExecutedResult RunProcess(IDbSession session, WfAppRunner runner, IDictionary<string, string> conditions = null)
    {
        var result = new WfExecutedResult();
        var wfService = new WorkflowService();
        var nodeViewList = wfService.GetNextActivityTree(runner, conditions).ToList<NodeView>();
        foreach (var node in nodeViewList)
        {
            var performerList = wfService.GetPerformerList(node);       //根据节点角色定义,读取执行者列表
            Dictionary<string, PerformerList> dict = new Dictionary<string, PerformerList>();
            dict.Add(node.ActivityGUID, performerList);
            runner.NextActivityPerformers = dict;
            if (node.IsSkipTo == true)        //特定节点上的判断处理
            {
                result = wfService.JumpProcess(session.Connection, runner, session.Transaction);
            }
            else
            {
                result = wfService.RunProcessApp(session.Connection, runner, session.Transaction);
            }
        }
        return result;
    }
时间: 2024-08-02 07:01:56

Slickflow.NET 开源工作流引擎基础介绍(二)的相关文章

Slickflow.NET 开源工作流引擎基础介绍(十)--邮件轮询异步发送模块集成

前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. 1. 邮件发送通知的位置 通常任务数据生成时,就需要发送一封邮件通知,邮件内容包括正文和页面地址信息:任务办理人员在接收到邮件后,会及时登录系统进行任务处理,发送邮件通知的好处就在于方便和及时. 但是邮件发送并不是所有的业务客户都需要的一个功能,它不便于紧耦合地在引擎流转环节,即跟任务数据的生成绑

Slickflow.NET 开源工作流引擎基础介绍(三)

1. Slickflow Designer 技术优势 1) 基于HTML5技术,兼容常见浏览器; 2) 纯Javascript / JsPlumb 脚本实现SVG图形化显示; JsPlumb允许您使用SVG.Canvas 或者 VML链接屏幕上的元素,这些取决于您使用的浏览器的能力; 3) 图形元素参考BPMN定义,XML存储,更加适合商务人员理解业务过程定义; 4) 富客户端开发技术,使用JQuery/SlickGrid等组件,用户体验良好; 4) 前端架构开放,可允许程序开发人员扩展新的节点

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

前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响. 1. 流程事件 流程执行过程中,伴随各种事件的发生,而且是存在于整个流程的生命周期,即从流程启动一直到流程结束的整个过程都有事件发生.这些事件的发生,业务系统通常也需要知道一些流程过程的关键节点,或里程碑状态.我们统称为流程事件. 1.1  流程事件触发类型 流程事件类型的定义是按照事件发生的位置来确定划分,跟流程直接有关的比如有:启动.运行.撤销.退回

.net开源工作流引擎ccflow

关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款100%开源软件,我们向社会承诺,核心代码100%的开源,多年以来我们践行自己的诺言,努力提高产品质量,奉献社会,成为了国内知名的老牌工作流引擎. ccflow1.0 发展于2003年,xxx省税收业务管理信息系统. ccflow5.0 诞生于2013年北京亿阳信通股份有限公司,应用于xx省电信,xx

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

目录 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 二,IStepBuilder 节点 三,工作流节点的逻辑和操作 容器操作 普通节点 事件 条件体和循环体 节点的异步或多线程 用于事务的操作 四,条件或开关 迭代 条件判断 节点并发 五,其它 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 为了避免歧义,事先约定. 工作流有很多节点组成,一个节点成为步骤点(Step). 1,IWorkflow / IWork

几种开源工作流引擎的简单比较(转)

摘要:目前开源工作流引擎用的最多的是jbpm , 各种特性都不错, 文档也比较多, 下面只简单列举一下 目前开源工作流引擎用的最多的是jbpm , 各种特性都不错, 文档也比较多, 下面只简单列举一下 其他几种工作流引擎的特性.   Apache ODE Enhydra Shark Bonita Open Business Engine Eclipse JWT  支持的流程建模标准  WS-BPEL 2.0,流程定义必须使用该标准编写才能执行 WfMC和OMG标准 符合WfMC规范 遵循WfMC

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

Java三大主流开源工作流引擎技术分析 首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 三大主流工作流引擎:Shark,osworkflow,jbpm! Shark的靠山是Enhydra.Enhydra做过什么呢?多了!从j2ee应用服务器,到o/r mapping工具,到这个工作流引擎等等.为什么Shark的持久层采用DODS来实现?就是因为他们是一家人. Jbpm的靠山是jboss

Avaya Exrience Portal(AEP)基础介绍 二(四大组件总结)

什么是Avaya Exrience Portal(AEP)? 1:提供语音(或者多媒体)自动化用户体验的软件平台:  2:基于标准的VXML(定义了如何使用语音识别.语音合成.互联网访问.数据库访问.语音文件播放.DTMF输入等功能开发一个完整的语音应用系统.)和CCXML(它基于XML定义了一系列开放标准的呼叫控制API)的应用:  3:支持多媒体处理:  4:完全基于Web架构:  5:支持TTS文语转换和语音识别技术:     2)AEP包含的组件   EPM:AEP集成的管理,报表,监控

开源工作流引擎内核主要关心的是什么?

JBPM是开源工作流引擎中最突出的一种,这种引擎模式现在使用的范围是比较广的.目前,开源工作流引擎有很多,不同的开源工作流引擎不管是设计还是实现方式都是不同的,其选型.算法.机制等各不相同.说起开源工作流引擎内核,我相信大家最关心的莫过于其引擎内核问题了.开源工作流的引擎内核最关注的是什么呢?下面我们一起来看看: 其实,引擎内核所关注的,只是一个抽象层面的问题,它的职责是很精简的,主要是为了确保流程从一个节点运行到另一个节点上,保证能够执行当前的节点.概括地来说,开源工作流引擎内核所关注的问题有