Slickflow.NET 开源工作流引擎基础介绍(二) -- 引擎组件和业务模块的交互
集成流程引擎的必要性
业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性。一种直接的方式是改造业务代码,适应业务过程的变化,这将会面临不断改写代码的需求;还有一种方式是使用流程引擎控制业务过程的变化,将改写业务代码的操作交由流程引擎,通过流程引擎解析业务规则,驱动业务过程流转,从而将改写业务代码的可能性降到最低。
显而易见,流程引擎带来的好处是为了更好解决业务过程变化后带来的重构风险,信息系统如果是柔性的,可伸缩,可动态适应的,那么它才可以保持不被很快被替代的可能性,自然就能够为企业降低不断升级或实施产生的成本费用。
业务系统和流程引擎的交互方式
业务系统中嵌入流程引擎中间件,是一种常见而直接的方式;虽然有些引擎组件能够配置业务模块的反射接口,但是我们目前认为比较合理的方式是:流程引擎不应过多地绑定业务接口,因为业务接口的变化是始终不可避免,会一直发生的,而引擎组件同样需要保持稳定。
通常在业务模块中,当处理业务功能后,也会调用引擎组件的服务接口,驱动业务流程流转。我们一直把业务变化部分交由业务过程的服务处理,流程引擎中间件始终只处理解析规则,驱动流转的职责。这样可以避免引擎组件的功能膨胀,保持引擎组件的灵巧。
常见的业务过程调用流程引擎服务接口的图示:
Step 1: 当前正在执行功能单元发起的调用
Step 2: 执行完毕,下一步已经处在等待中的功能单元
流程引擎中间件集成方式的优势
首先,流程引擎中间件的职责是解析业务规则,驱动业务过程运转。人们不断地将引擎功能封装为组件,从而方便业务模块的调用。将最复杂,最容易变化的部分交由引擎中间件处理,才可以让用户更加专注于业务功能的实现。将引擎组件的功能从业务模块中分离出来,整体上降低了整个系统的复杂程度,使业务系统变得更加容易维护。
其次,流程引擎中间件提供动态组件引用,以及WebService访问;可以满足多种架构系统的集成需求。在当前互联网云端模式的软件架构盛行的模式下,中间件可以以WebService方式提供Restful的API接口,使得引擎提供的服务能够跨越系统结构,组织边界来驱动业务过程流转,这种分布式的模式极大地发挥了引擎中间件的功能效用。
- 代码示例
以下代码演示业务类(生产订单)如何集成工作流引擎并调用服务接口的过程。
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 开源工作流引擎基础介绍(二) -- 引擎组件和业务模块的交互的更多相关文章
- Slickflow.NET 开源工作流引擎基础介绍(二) -- 引擎组件和业务系统的集成
集成流程引擎的必要性 业务过程的变化是在BPM系统中常见的现象,企业管理层需要不断优化组织架构,改造业务流程,不可避免地带来了业务流程的变化,企业信息系统就会随之面临重构的可能性.一种直接的方式是改造 ...
- Slickflow.NET 开源工作流引擎基础介绍(一) -- 引擎基本服务接口API介绍
1. 工作流术语图示 图1 流程图形的BPMN图形元素表示 1) 流程模型定义说明流程(Process):是企 ...
- Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合
前言: 流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...
- 【Slickflow学习】.NET开源工作流项目转换(二)
第一次自己写博客文章,大家多多指教.写博客主要记录一下学习的过程,给初学者提供下参考,也留给自己做备忘. Slickflow .NET开源工作流-项目转换 上一篇文章里说了1.2版本的下载,下载解压后 ...
- Slickflow.NET 开源工作流引擎高级开发(二) -- 流程快速测试增值服务工具介绍
前言:流程是由若干个任务节点组成,流转过程就是从一个节点转移到下一个节点,通常需要不断切换用户身份来完成流程的测试,这样使得测试效率比较低下,本文从实战出发,介绍常见的两种快速测试方法,用于提升流程测 ...
- Slickflow.NET 开源工作流引擎基础介绍(六)--模块化架构设计和实践
前言:在集成Slickflow.NET 引擎组件过程中,引擎组件需要将用户,角色等资源数据读取进来,供引擎内部调用:而企业客户都是有自己的组织架构模型,在引入模块化架构设计后,引擎组件的集成性更加友好 ...
- Slickflow.NET 开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成
前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...
- Slickflow.NET 开源工作流引擎高级开发(一) -- 流程外部事件的调用和变量存储实现
前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响. 1. 流程事件 流程执行过程中,伴随各种事件的发生,而且 ...
- Slickflow.NET 开源工作流引擎基础介绍(七) -- 并行分支多实例模式实现
前言:并行审批是比较常见的流程模式,在工作流模式介绍中,通常是多个分支通过网关(Gateway)来控制实现.默认的分支类型是静态定义好的.本文扩展了并行网关的控制方式,实现了动态多实例的并行分支网关, ...
随机推荐
- thinkphp 3+ 观后详解 (3)
由于上一篇太长不好编辑,于是我重开了一篇. if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_E ...
- J2534 Pass-Thru Vehicle Programming ( SAE J1962 connector and Protocol )
SAE J1962—Diagnostic Connector SAE J1850—Class B Data Communications Network Interface SAE J1939—Tru ...
- GLSL实现Image Filter 【转】
http://blog.csdn.net/a3070173/archive/2008/11/27/3390477.aspx 图像过滤无论是在作图工具还是特效的实现上都时有运用,这里发一些通常会使用到的 ...
- Android 百度地图定位(手动+自动) 安卓开发教程
近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置. 经过2天研究 ...
- JavaScript OOP 思想
JS的核心是对象 {}, new function(){}这种形式也是对象. http://www.nowamagic.net/librarys/veda/detail/241 整理一些网上的资料,供 ...
- defer属性---->执行外部脚本
HTML4---->只有IE支持 不需要是外部脚本. HTML5---->主流都支持 defer 属性仅适用于外部脚本(只有在使用 src 属性时) 值 描述 defer 规定当页面已完成 ...
- 五 Django 1.5.4 User Authentication 用户认证
一.创建drinker app ./manage.py startapp drinker 在INSTALL_APPS添加drinker 用户的Profile模型,django里面是可以自定义的. 通过 ...
- 凸包---HDU 2202
题意:给N个点,求着N个点中选择三个联的最大的三角形面积! 注意精度:不然OJ上面会超时的 #include<iostream> #include<cmath> #includ ...
- [Javascript] Promise-based functions should not throw exceptions
Source You can also start a chain of then() method calls via Promise.resolve() and execute the synch ...
- 进程控制之fork函数
一个现有进程可以调用fork函数创建一个新进程. #include <unistd.h> pid_t fork( void ); 返回值:子进程中返回0,父进程中返回子进程ID,出错返回- ...