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;
}

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

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

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

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

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

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

    前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...

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

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

  5. 【Slickflow学习】.NET开源工作流项目转换(二)

    第一次自己写博客文章,大家多多指教.写博客主要记录一下学习的过程,给初学者提供下参考,也留给自己做备忘. Slickflow .NET开源工作流-项目转换 上一篇文章里说了1.2版本的下载,下载解压后 ...

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

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

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

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

  8. Slickflow.NET 开源工作流引擎基础介绍(七) -- 并行分支多实例模式实现

    前言:并行审批是比较常见的流程模式,在工作流模式介绍中,通常是多个分支通过网关(Gateway)来控制实现.默认的分支类型是静态定义好的.本文扩展了并行网关的控制方式,实现了动态多实例的并行分支网关, ...

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

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

随机推荐

  1. STM8CubeMx来了

    几年前出来的STM32CubeMx是众多stm32开发者的福音,大大缩短了开发者的开发周期.就在前几天,st官网宣布针对stm8的图形配置工具stm8cube横空出世. 如果你还不知道STM32Cub ...

  2. sqlserver中一些常用的函数总结

    去掉空格方面 LTRIM('内容'):去掉字符串左边的空格 RTRIM('内容'):去掉右边的空格 LTRIM(RTRIM('内容')):去掉字符串左边和右边的空格 REPLACE(‘内容’,' ', ...

  3. 手淘移动适配方案flexible.js兼容bug处理

    什么是flexible.js 移动端自适应方案 https://www.jianshu.com/p/04efb4a1d2f8 什么是rem 这个单位代表根元素的 font-size 大小(例如 元素的 ...

  4. java基础70 负责静态的网页制作语言XML(网页知识)

    HTML:负责网页结构的CSS:负责网页的样式(美观)JavaScript:负责客户(浏览器)端与用户进行交互 1.HTML语言的特点 1.由标签组成    2.语法结构松散     3.大小写不区分 ...

  5. PlantUML——4.实例演示1

    给自己发消息 @startuml Alice -> Alice : This is a signal to self.\nIt also demonstrates \nmultiline tex ...

  6. Sqlserver双机热备文档(无域)

    1. 配制环境 OS:Win7    DB:SQL Server R2 2. 基本配制 1.      开启sqlServer服务如下图-1 图-1 2.      开启sqlServer的tcp/i ...

  7. MongoDB查询用法大全

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...

  8. HTML5练习1

    制作简历 主要代码: <!doctype html> <html> <head> <meta charset="utf-8"> &l ...

  9. lr参数化取值与连接数据库

    TXT文本,EXCEL表格以及数据库中的表都可以作为参数的数据集载体,LR都是支持的. 特别提醒: 1.在形成数据池之后,数据库中的数据变化不会影响数据池中的数据. 2.数据文件一定要以一个空行结束, ...

  10. C# 中从网络上下载文件保存到本地文件

    下面是C#中常用的从Internet上下载文件保存到本地的一些方法,没有太多的技巧. 1.通过  WebClient  类下载文件 WebClient webClient = new WebClien ...