热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

.Net三款工作流引擎比较:WWF、netBPM和ccflow

原文:.Net三款工作流引擎比较:WWF、netBPM和ccflow下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三
原文:.Net 三款工作流引擎比较:WWF、netBPM 和 ccflow

下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Foundation,NetBPM, CCFlow.

NetBPM 与 CCFlow 是两款国内知名的开源软件,尤其是ccflow在国内的发展势头强劲。

这个典型的流程假设:公司有两级领导,一级为主管Chief,一级为老板Boss

场景描述:

  在某公司中,部门员工休假需要主管Chief的批准。 
  如果休假天数大于10天,则 在部门主管同意后,还必须老板Boss批准。 
  如果是部门主管请假则直接提交老板批准。 
  在休假被批准之前,申请人可以撤销休假申请。 
  申请批准后,对休假天数进行修改(也可以是其他业务数据处理)。 每次休假申请结束之 后,不管通过未通过或是否取消,都必须记录下来。 
  流程结束时,系统要把请假的结果信息Email给申请人。

  对于大于10天的申请,如果部门主管已批准同意而上级主管还未批准,这时申请人撤销申请后,系统应发Email通知部门主管申请已撤销。

我们这里只是一个模拟,当然现实生活中情况比这个更加复杂一些;

Windows Workflow Foundation

微软的工作流产品,提供一套工作流引擎和VS解决方案自带的流程设计器,但是该流程设计器面对的是程序员而非业务人员,所以界面比较专业,流程运行只能创建控制台应用程序,没有流程运行界面,没有表单库,如需要表单和界面需要二次开发。

使用WWF创建流程:

1. 启动VS2010,创建一个顺序工作流控制台的程序。
2. 输入项目名称,点击确定,将自动进入流程设计界面。
3. 自动生成的Workflow1.cs是一个工作流组件。
4. 工具箱中拖放一个IfElse活动组件到设计界面上。
5. 此时就需要较多的编码工作和表单界面设计工作,如在idelseBranchActivitiy1左侧分支,用以判断请假人是否新申请请假还是取消请假,激活Conditiong属性,并且添加内部事件EvaluateQingJiaNoValidCode,并激活,在内部输入逻辑代码根据数据库记录判断请假是否通过,未通过则取消请假。也可以走另一分支EvaluateQingJiaCode继续申请新的请假;
6. 拖放parallelActivity1组件在IfElse节点后,用以判断请假人是否为Chief,设置sequenceActivity1中的codeActivity3属性的ExecuteCode处理程序为EvaluateChiefNoValidCode,并激活,内部代码用以判断不是Chief的情况,另一分支sequenceActivity1中则判断是Chief的情况;
7.如果不是Chief请假,则需要在EvaluateChiefNoValidCode中进行逻辑判断和表单的设计,填写请假申请单, 并拖放IfElse组件,实现其中的codeActivity6代码用以判断大于10天的情况。
8.F5即可运行控制台程序,其中的通过未通过或是否取消的数据需要记录,需要通过代码和设计数据库来实现,发送Email也需要代码实现,WWF没有提供该功能。

WWF下设计的流程图如下:

技术分享

技术分享

NetBPM

从JBpm1移植到.NET平台下的开源工作流项目,二次开发有一定的难度,因为其使用的Castle框架有很多子项目,技术点较多,需要一一熟悉后才能进行流程的二次开发。

使用NetBPM创建工作流过程:
1.    使用NetBPM的难点之一是要理解生成配置文件,提交请假单配置如下:

xml version="1.0"?>

<process-definition>

  
  
    
  <name>请假DEMOname>
  <description>该流程模拟公司的请假流程,  description>
  <responsible>aeresponsible>

  
  
  
  <start-state name="start leave request">
    <description>提交请假单description>
    
    <role>requesterrole>
    
    <field attribute="start date" access="write-only-required" />
    <field attribute="end date"   access="write-only-required" />
    <field attribute="leave days"    access="write-only-required" />
    <field attribute="comment"    access="write-only" />
    <transition to="Is Cancel Fork" />
  start-state>
  
  
  <end-state name="end" />


  
  
  
  
  
      
  <action event="process-instance-end" 
        handler="NetBpm.Example.LeaveOfAbsence.EmailAction, NetBpm.Example.LeaveOfAbsence"   on-exception="log">
        
        <parameter name="to">previousActorparameter>
        <parameter name="subject">您提交了请假申请parameter>
        <parameter name="message">you requested a holiday from ${start date} to ${end date} with comment ${comment}parameter>
      action>
    
    <action event="process-instance-end" 
        handler="NetBpm.Example.LeaveOfAbsence.LogLeaveInfoAction, NetBpm.Example.LeaveOfAbsence"   on-exception="log">
    <parameter name="LogInfo">记录请假日志? :) parameter>
  action>

  
  
  
  
  
  <attribute name="requester" type="actor" />
  <attribute name="chief" type="actor" />
  <attribute name="boss" type="actor" />
  
  
  <attribute name="start date" type="date" />
  <attribute name="end date" type="date" />
  <attribute name="leave days" type="integer" />
  <attribute name="comment" type="text" initial-value="请假理由或者备注" />
  <attribute name="Chief evaluation result" type="evaluation" />
  <attribute name="Boss evaluation result" type="evaluation" />

  concurrent-block>
  
process-definition>

2. 其它配置文件代码太长就不一一贴出来;
3. 定义委托类:委托类包含在lib文件夹下的程序集中。

因为委托类数目众多,这里仅贴出几个典型的委托类:

1. NetBpm.Example.LeaveOfAbsence.AutoSetAttributionsAction:该委托类设计为一个通用委托类,这里用来设置表识属性,如流程经过用户取消请假路径,则把RunTrace属性设置为requestercancel,供WhichWayDicision作判断用。
2. NetBpm.Example.LeaveOfAbsence.AnyOneJoin: 该委托主要用来设置激活父flow机制,这里是只要任何一条路径到达了join,则激活父flow,流程往下流。
3. NetBpm.Example.LeaveOfAbsence.WhichWayDecision:该委托根据流程实际流过路径,根据标识属性RunTrace等进行走哪条边的抉择。
4. 本文仅仅是一个示例,给大家提供一个运用nPdl定义NetBPM流程的参考,如果要把该流程投入现实中使用显然还需要做很多优化。其中的代码量还是很大的。

NetBPM下设计的流程图如下:

技术分享

CC Flow

ccflow是一款国产开源工作流。支持SQLServer、Oracle、Access、MySQL数据库,支持群集计算、支持多国语言。流程设计、表单设计都是可视化的,所见即所得。 ccflow提供了强大的数据分析功能:流程运行的各种报表、图形、挖掘、赚取,可以对实(时)效性、成本分析(人力、时间、财物),进行全方位的分析、监控。 Ccflow更可与手机+手机短信+短信猫+电子邮件无缝连接,让您的工作第一时间沟通,第一时间处理。

使用CC Flow创建工作流过程:

1.    在web容器中安装好程序后,打开流程设计器,建立请假流程,即可生成填写请假单和结束节点;
2.    拖动Chief审批节点、 Boss审批节点,添加连线以及标签注明;
3.    设置表单:邮件选择傻瓜型表单或者自由类型表单,设置表单后,设置每个节点的工作岗位;
4.    设置流程跳转方向条件,如判断情人是谁,判断请假天数等,选择的数据来源自表单数据。
5.    点击运行即可运行流程;可打开windows service,即可使用自带的消息提醒以及邮件发送功能;

CC Flow设计的流程图如下:

技术分享

综上所述,三款的工作流区别如下表:

技术分享

.Net 三款工作流引擎比较:WWF、netBPM 和 ccflow


推荐阅读
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 在最近的项目中,我们广泛使用了Qt框架的网络库,过程中遇到了一些挑战和问题。本文旨在记录这些经验和解决方案,以便日后参考。鉴于我们的客户端GUI完全基于Qt开发,我们期望利用其强大的网络功能进行Fiddler网络数据包的捕获与分析,以提升开发效率和应用性能。 ... [详细]
  • 在Conda环境中高效配置并安装PyTorch和TensorFlow GPU版的方法如下:首先,创建一个新的Conda环境以避免与基础环境发生冲突,例如使用 `conda create -n pytorch_gpu python=3.7` 命令。接着,激活该环境,确保所有依赖项都正确安装。此外,建议在安装过程中指定CUDA版本,以确保与GPU兼容性。通过这些步骤,可以确保PyTorch和TensorFlow GPU版的顺利安装和运行。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • AngularJS 进阶指南:第三部分深入解析
    在本文中,我们将深入探讨 AngularJS 的指令模型,特别是 `ng-model` 指令。`ng-model` 指令用于将 HTML 元素与应用程序数据进行双向绑定,支持多种数据类型验证,如数字、电子邮件地址和必填项检查。此外,我们还将介绍如何利用该指令优化表单验证和数据处理流程,提升开发效率和用户体验。 ... [详细]
  • 深入解析Linux内核中的进程上下文切换机制
    在现代操作系统中,进程作为核心概念之一,负责管理和分配系统资源,如CPU和内存。深入了解Linux内核中的进程上下文切换机制,需要首先明确进程与程序的区别。进程是一个动态的执行流,而程序则是静态的数据和指令集合。进程上下文切换涉及保存当前进程的状态信息,并加载下一个进程的状态,以实现多任务处理。这一过程不仅影响系统的性能,还关系到资源的有效利用。通过分析Linux内核中的具体实现,可以更好地理解其背后的原理和技术细节。 ... [详细]
  • 在数字图像处理中,Photoshop 的直方图是一个重要的工具,它能够精确地反映图像中不同亮度级别的分布情况。通过分析直方图,用户可以深入了解图像的曝光、对比度和色调范围,从而进行更精细的调整。直方图不仅模拟了物体表面反射光线的原理,还能帮助摄影师和设计师更好地掌握图像的明暗细节,优化视觉效果。 ... [详细]
author-avatar
哲亚Zoe
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有