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. 在VS中让一个JS文件智能提示另一个JS文件中的成员2--具体引用

    我们知道,在html中,利用<script language="javascript" type="text/javascript" src=" ...

  2. Little C Loves 3 I

    CF#511 div2 A 现场掉分赛(翻车),就是这道题被叉了...qwq 其实就是一道水题: 因为CF有spj,所以直接构建特殊情况就行了. 当 n 是3的倍数的时候,显然 1,1,(n-2) 显 ...

  3. 嵌入式 探讨父子线程、进程终止顺序不同产生的结果_skdkjxy_新浪博客

    嵌入式 探讨父子线程.进程终止顺序不同产生的结果 Linux下编程,线程.进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会做什么处理呢?反之,如果子进程/线程先于父进程/线 程终 ...

  4. ROS新动态获取网址汇总

    ROS新动态获取网址汇总 1 planet ROS http://planet.ros.org/ 2 ROS news http://www.ros.org/news/ 3 ROS-Industria ...

  5. CVE-2010-2553 Microsoft Windows Cinepak 编码解码器解压缩漏洞 分析

      Microsoft Windows是微软发布的非常流行的操作系统.         Microsoft Windows XP SP2和SP3,Windows Vista SP1和SP2,以及Win ...

  6. 更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了

    说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图   ...       现则Settings,出现的界面如下 ...            ...

  7. oracle数据库11g(11.2.0.1)安装报错:提示ins_ctx.mk编译错误。

    https://blog.csdn.net/weixin_42967330/article/details/81668404

  8. USACO 5.3 Network of Schools

    Network of SchoolsIOI '96 Day 1 Problem 3 A number of schools are connected to a computer network. A ...

  9. USACO 5.1 Musical Themes(哈希+二分)

    Musical ThemesBrian Dean A musical melody is represented as a sequence of N (1 <= N <= 5000) n ...

  10. memory_get_usage()查看PHP脚本使用内存

    memory_get_usage()可以查看当前php使用的内存大小.对于优化算法提高内存使用效率还是很实用的,尤其是对当下的移动端程序. <?php echo memory_get_usage ...