﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心情小站-随笔分类-Head First Process-深入浅出流程</title><link>http://www.blogjava.net/RongHao/category/42229.html</link><description>勤学、勤思</description><language>zh-cn</language><lastBuildDate>Thu, 01 Sep 2011 00:22:31 GMT</lastBuildDate><pubDate>Thu, 01 Sep 2011 00:22:31 GMT</pubDate><ttl>60</ttl><item><title>BPMN这点事-三种流程模型 </title><link>http://www.blogjava.net/RongHao/archive/2011/08/31/357683.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Wed, 31 Aug 2011 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2011/08/31/357683.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/357683.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2011/08/31/357683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/357683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/357683.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; "><h1><strong style="font-weight: bold; ">BPMN的流程模型</strong></h1><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们使用业务流程建模来交流信息，正如在上一节里所述，根据不同模型的用户（客户、业务人员、分析人员、开发人员），建模有着不同的风格。BPMN被设计用来涵盖各种风格的流程模型（以满足不同角色人员交流的需要）和创建端到端的业务流程，它支持三种基本类型的流程模型：</p><h3>&#216;&nbsp;流程编制（Process Orchestration），包含：</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">私有的不可执行的（内部的）业务流程；</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">私有的可执行（内部的）业务流程；</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">公开流程。</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><h3>&#216;&nbsp;编排（Choreography）<br />&#216;&nbsp;协作（Collaborations），包含流程与/或编排。</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">具有会话视图（Conversation）。</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><h2><strong style="font-weight: bold; ">私有的（内部的）业务流程</strong></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">私有的业务流程是指某一组织的内部工作流程，我们通常称之为称为工作流，在WEB服务领域，我们也称之为服务的编制（Orchestration）。存在两种类型的私有业务流程：可执行的和不可执行的。可执行的私有业务流程以被计算机执行为建模目的，由相应的BPMS系统来自动化流程的执行，它包含了足够的执行细节，这些细节包括执行规则、条件表达式等计算机解释执行所需要的技术信息，该模型最直接的用户是开发人员。不可执行的私有业务流程则以文档化为建模的目的，它缺少执行细节，但是包括足够的交流信息，该模型的用户包括了业务人员与分析人员。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">作为一个例子，我们一起来看看我在公安局户籍科为儿子办理户口的流程，如下图所示：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><img src="http://dl.iteye.com/upload/attachment/536001/c8029f21-edf3-33a2-a116-afd7bde273c6.png" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图1公安局户籍科上户口的流程</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">当我来到户籍科，递上足够的资料，然后就开始等待。我能看到共有四个工作人员，第一个工作人员负责接收资料，查看资料是否完备，接下来，她将所有的资料传递到下一个工作人员，第二个工作人员对资料进行审核，在计算机上查看我们的户口信息是否正确，接下来，如果资料无误，他将资料传递到第三个工作人员，第三个工作人员负责在计算机上为我的儿子录入新的户口，最后打印出一张户口页，第四个工作人员是职位最大的警员，她负责盖章，然后将儿子的户口页传递给在窗口外等待的我。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">根据上面对私有业务流程的定义，我们很容易的判断出这个流程是个不可执行的私有业务流程，因为该流程是户籍科的内部工作流程，作为该流程服务对象的我，我根本不用关心户籍科内部是如何对我的申请进行处理的，所以它是私有业务流程。该流程是由规章或制度所规定的，由工作人员来驱动，并非通过计算机协调，所以这是个不可执行的私有业务流程。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">因为私有业务流程是内部流程，所以它只能存在于一个池（pool，池代表一个参与者）里，如下图所示，我们可以将私有业务流程建模在一个池里，但通常这样做没有太大的意义，更经常的情况是，我们选择将池忽略。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><img src="http://dl.iteye.com/upload/attachment/536003/98b9fda1-4ace-3a81-9984-09d23da028c3.png" alt="" title="点击查看原始大小图片" width="700" height="322" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; cursor: url(http://www.iteye.com/images/magplus.gif), pointer; " /></p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图2公安局户籍科私有业务流程的另一种建模形式</p><h2><strong style="font-weight: bold; ">公开流程</strong></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">公开流程表现一个私有业务流程与其他流程或参与者之间的交互。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">还是以户口办理作为例子，作为户口申请人，我来到公安局户籍科，我心揣揣，我不知道我该做些什么，于是我看到大厅里如下图所示的流程，于是我立刻就明白了，我只需要将资料交给办事人员，然后等待取新的户口页即可。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">注意下图所示的公开流程与图1所示的私有流程有哪些不同。第一是图中出现了多个参与者，参与者间通过消息流连接（图中虚线箭头连线）；第二是户籍科的办理流程被缩减到只剩两个与外部参与者交互的活动，两个原有的内部活动被忽略了。这两点不同即是公开流程的特点：表现与外部参与者、流程间的交互，忽略内部活动。联想到我们实际的编程，总结成一句话，就是隐藏内部实现细节，仅仅展现对外接口，表现流程的外部行为。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /><img src="http://dl.iteye.com/upload/attachment/536005/7e975704-3385-37a2-b27c-fb137c745a9c.png" alt="" title="点击查看原始大小图片" width="700" height="390" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; cursor: url(http://www.iteye.com/images/magplus.gif), pointer; " /></p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图3公安局户籍科办理户口的公开流程</p><h2><strong style="font-weight: bold; ">协作</strong></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">协作描绘两个或多个业务实体间的交互。一个协作通常包含两个或多个池，每个池代表一个参与者（业务实体）。参与者之间的消息交换通过连接两个池（或池中的对象）的消息流表现。协作可以表现为两个或多个公开流程之间的交互，在上一节里，我们提到，与对应的私有流程相比，公开流程隐藏了内部细节活动。池也可以是黑盒，即里面什么对象都没有。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">那么，这里有一个问题，公开流程与协作有什么区别？区别在于表现的范围，公开流程只是表现一个私有流程与外部的交互，而协作则能表现多个流程/参与者之间的交互。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">还是看户口办理的例子，在前面的例子中，我们看到了公安局户籍科办理户口的私有流程和公开流程，似乎办理户口是一件很简单的事情，但这仅仅只是办理户口中的一步而已。在此之前，我先要去医院办理小孩出生证明，接下来，我要去居委会登记小孩信息，再接下来，我要去计生办办理符合计划生育政策的证明，最后，我才来到户籍科。下图是整个户口办理的协作图，作为简化，这里将除申请人和户籍科之外的池都黑盒了：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /><img src="http://dl.iteye.com/upload/attachment/536007/f853e488-e6fe-3f48-9a54-e3580a3507f2.png" alt="" title="点击查看原始大小图片" width="700" height="541" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; cursor: url(http://www.iteye.com/images/magplus.gif), pointer; " /></p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图4户口办理协作图</p><h2><strong style="font-weight: bold; ">编排</strong></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">同样是表现多个参与者之间的交互，编排做的更为纯粹，它取消掉了池的概念，改由编排活动直接表现多个参与者之间的消息交互，为协作模型提供了一种基于流程图的视图。户口办理的编排图如下图所示，其中每个活动都能看到上下的方形区域有参与者信息，这表明这个活动的参与者，浅色部分为活动的发起者，深色部分为活动的响应者，我们会在接下来的BPMN元素小节里详细描述这一活动类型：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /><img src="http://dl.iteye.com/upload/attachment/536009/d99b690e-9445-35a5-a56b-ed59b8cc2986.png" alt="" title="点击查看原始大小图片" width="700" height="374" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; cursor: url(http://www.iteye.com/images/magplus.gif), pointer; " /></p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图5户口办理编排图</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">与协作图相比，编排图省略掉了更多的细节，例如与各个参与者具体的交互过程，它关心谁和谁产生了交互，至于如何交互，分几步交互，它并不关心。例如办理户口这个活动，实际上我是分别和两个警官进行了交互，一个是负责接受资料的年轻女警官，一个是负责盖章复核的领导警官，在协作图中，我可以通过公开流程展现出这一点，但是在编排图中，这并不是要表现的重点。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">协作图表现出参与者之间的交互，并包含交互的细节信息（交互的接口、如何交互）；编排图则以流程图的形式表现出参与者之间的交互，它关心的是某个任务需要哪些参与者发生交互，交互的细节不是其表现的重点。</p><table border="0" cellspacing="0" cellpadding="0"><tbody><tr><td style="font-size: 1em; "><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编制与编排的区别</span></p></td></tr><tr><td valign="top" style="font-size: 1em; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">在上文中，我们提到了服务的编制（Orchestration），这里，我们又提到了编排（<strong style="font-weight: bold; ">Choreography</strong>），这两者是有很大区别的。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">WS-BPEL将SOA中的服务按照一定的顺序灵活组装在一起的流程就是编制（Orchestration）。编制后的WS-BPEL流，通常代表了某个特定的业务中的服务的执行流。而编排（<strong style="font-weight: bold; ">Choreography</strong>）则是描述参与者之间交互关系的流程。与编制不同的是，编排并不需要一个执行引擎，它只是描述关系。编制代表的是一个可执行流程，它必须通过执行引擎来执行。而编排实质上是代表一种描述，即参与者之间如何互相协调来完成一个目标。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; "><a href="http://weblogs.java.net/blog/johnreynolds/archive/2006/01/service_orchest.html" style="color: #336699; text-decoration: none; ">John Reynolds</a>在其博客中是这样描述编制和编排的区别<a name="_ftnref1" style="color: #336699; text-decoration: none; ">[1]</a>：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">编制 == 可执行过程</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">Web服务编制与执行特定的业务流程相关。WS-BPEL是一种用来定义可以在一个编制引擎中执行的流程语言。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">编排 == 多方合作</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="background-color: #c0c0c0; ">因此编制必须对应一个执行引擎，而编排由于涉及到多方合作，所以它是不能被直接部署的。</span></p></td></tr></tbody></table><div></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><h2><strong style="font-weight: bold; ">协作的会话视图</strong></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">会话视图为协作图提供了另外一种非正式的表现形式，与编排图一样，它的目标同样在于表现参与者之间的关系，它将一系列相关的信息交互定义为一次会话。户口办理的会话图如下图所示，图中只存在池与会话（Communication）元素，会话元素由图中的六边形代表，它代表两个或多个参与者之间一系列相关的信息交互，我们可以看到，办理户口需要申请人与四个组织发生四次会话：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /><img src="http://dl.iteye.com/upload/attachment/536011/153edd3e-a658-3011-b20f-02636fe1eaaf.png" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /></p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图6户口办理会话图</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">会话视图的作用之一是能够有效减少模型中消息流的数量，便于我们理解。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /><img src="http://dl.iteye.com/upload/attachment/536013/1c715ee9-6590-3c24-802e-1fb2ae4ad2d9.png" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /></p><p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">图7会话视图简化交互模型</p><div></div></span></div><img src ="http://www.blogjava.net/RongHao/aggbug/357683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2011-08-31 23:39 <a href="http://www.blogjava.net/RongHao/archive/2011/08/31/357683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BPMN这点事-那段悲催的历史</title><link>http://www.blogjava.net/RongHao/archive/2011/08/23/357150.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 23 Aug 2011 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2011/08/23/357150.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/357150.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2011/08/23/357150.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/357150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/357150.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; ">在上一章里我们了解了BPM的基本概念，什么是业务流程管理，业务流程管理是一种以规范化地构造端到端的业务流程为中心，以持续地提高组织业务绩效为目的的系统化管理方法。同时，我们也了解了BPM活动的五个阶段：设计、建模、执行、监控和优化。在本章中，我们将把关注点放到BPMN上，什么是BPMN，在BPMN1.X里，BPMN是Business Process Modeling Notation的缩写，即业务流程建模符号，而在BPMN2.0里，BPMN变成了Business Process Model And Notation的缩写，即业务流程模型和符号，一个单词的增加却标示着BPMN本身发生了巨大的变化。到底是怎样的变化呢，让我们一起进入BPMN那段悲催的历史。&nbsp;<br /><br />BPMN最早是由业务流程管理倡议组织（BPMI, Business Process Management Initiative）开发的，这个组织的领导者是Intalio公司。提到BPMI组织，不得不提 BPML(Business Process Modeling Language) 业务流程建模语言。在敏锐的认识到Web将成为未来分布式系统架构的平台后，BPMI组织创建了BPML，一种全新的流程执行语言，该语言不与任何供应商绑定，而BPMN则作为BPML的可视化表现符号被创建。BPMI组织的会员在高峰期达到了200多家公司，除了IBM和微软，几乎所有的主要软件供应商都加入了该组织。&nbsp;<br /><br />BPMN则反映出BPMI组织的另一个具有前瞻性的观点，即业务人员（多是非技术人员）对IT执行流程的可视化和管理将成为未来BPM系统的关键。通过授权，业务人员能够管理自己的流程。在BPMN出现之前，市面上已经存在流程建模图的标准例如UML的活动图（UML由对象管理组织OMG维护管理，很快，我们将再次看到这一组织），但这些标准被认为过于技术化，而BPMN在被设计之初就强调要对业务人员友好。BPMN1.0在2004年5月由BPMI组织正式发布，其全称是Business Process Modeling Notation，即仅仅作为业务流程建模的一系列符号标准。&nbsp;<br /><br />对BPMN和BPML来说，两者的遭遇截然不同，在BPMI组织的会员中，BPMN受到了大多数流程建模工具厂商的欢迎，他们认为统一的建模标准能够使他们围绕核心建模工具提供其他更多的价值，而BPML则遭到了很多工作流厂商的痛恨，因为一个统一的流程执行语言标准将使得他们重新竞争，而私有的流程执行语言已经将市场分割，他们想维持现状。因此，矛盾从一开始就存在了，BPMI组织原计划是建立一套业务人员能够自管理的流程系统标准，BPMN关注业务流程的描述和分析，它建立的模型是面向业务人员的，是不可以直接执行的，而BPML则由BPMN自动生成可执行的流程语言，交由IT系统执行，但是现在，BPML被工作流厂商们认为是对自己的一种威胁。&nbsp;<br /><br />事实上，厂商们对BPML是多虑了。IBM和微软很快开始了反击，他们在2002年8月推出了BPEL-WS规范，一个与BPML有稍许不同的语言，基于新的WSDL标准。BPML与BPEL-WS之争也被看作是Betamax与VHS格式之争，Betamax品质优秀，但VHS得到数量众多的制造商支持，Betamax战败，于是BPML被消灭。&nbsp;<br /><br />2005年，BPMI组织被OMG组织合并，BPML停止维护，2006年OMG组织正式通过BPMN1.0规范，2008年2月发布BPMN1.1。&nbsp;<br /><br />记忆里，有那么多的规范、标准，从开始炒作的沸沸扬扬，到最后的逐渐淡出，不过几年光景。但BPMN却在2008年大爆发，得到了极大的普及。具有讽刺意味的是，BPMN的流行完全归功于那些当初反对BPML的工作流厂商们，恩恩，现在他们都改名叫BPMS厂商了。原因很简单，业务人员对IT执行流程的可视化和管理已经成为BPMS系统的关键，BPMI组织猜到了结局，却忘了猜猜自己。&nbsp;<br /><br /><div>BPMN被BPMS厂商们大量采用，他们使用它来进行流程的建模，至于模型的执行和存储，则由他们各自不同的流程执行语言实现。时至今日，BPMN1.x被大多数的建模工具和BPMS厂商所支持，他们关心的是建模，没有人关心BPMN的直接执行，也是，BPMN的主要用户是业务人员和流程分析人员。&nbsp;<br /><br />那么，BPMN的故事结束了吗？显然没有，BPMN1.x只是一些建模符号，不支持元模型，不支持存储和交换，也不支持执行。那么围绕着BPMN1.x的存储、交换和执行，必然会产生新的竞争，这次的主角换成了XPDL、BPEL和BPDM。&nbsp;<br /><br />XPDL作为WfMC提出的流程定义语言规范，本身就是一个元模型，可以存储，并且具备执行语义，因此理论上来讲，将BPMN转换为XPDL就可以解决存储、交换和执行的问题。XPDL2.0于2005年10月发布，在规范里，WfMC直接将XPDL的目标定义为BPMN的XML序列化格式。2008年4月23日发布的XPDL2.1规范，直接支持BPMN1.1到XPDL2.1的转换。XPDL是面向图的，BPMN也是面向图的，因此BPMN到XPDL的转换有着天然的优势。如今有超过80个的不同公司的产品使用XPDL来交换流程定义，同时也有一些厂商在自己提供的BPMN工具中使用了XPDL作为交换和存储格式。&nbsp;<br /><br />但XPDL的流行是大厂商们所不愿看到的，他们的规范自然还是BPEL，我辛辛苦苦PK掉BPML，您XPDL抢位来了，我情何以堪，情何以堪啊。BPEL-WS规范在2003年4月提交给了OASIS（Organization for the Advancement of Structured Information Standards，结构化信息标准促进组织）并更名为WSBPEL（Web Services Business Process Execution Language）规范， 2007年4月发布WSBPEL2.0版本，除了Microsoft、 BEA、 IBM、 SAP 和Siebel，Sun Microsystems和甲骨文公司也相继加入了OASIS组织。除去政治因素，BPEL的流行还在于Web正成为分布式系统架构的平台以及SOA的雄起，SOA强调服务的分解和解耦，而BPEL则对这些WEB服务进行编制，两者密不可分。但BPMN到BPEL的转换存在着先天上的缺陷，原因是BPMN是基于图的，而BPEL是基于块的，BPEL是一个结构化（块[Block]）和非结构化（控制链和事件）的混合体。这个缺陷导致有些BPMN建模的流程无法映射到BPEL，两者的双向工程更是存在问题。这个缺陷成为人们反复诟病的对象。许多支持BPEL的产品为了解决这一问题，不得不在用户建模时做出种种限制，让用户绘制不出无法转换的模型。&nbsp;<br /><br />而BPDM（业务流程定义元模型，Business Process Definition Metamodel）则是OMG组织自己提出来解决BPMN存储和交换问题的规范。于2007年7月形成初稿，2008年7月被OMG最终采用。BPDM是一个标准的概念定义，用来表达业务流程模型。元模型定义了用来交换的概念，关系和场景，可以使得不同的建模工具所建模出来的流程模型进行交换。BPDM超越了BPMN和BPEL所定义的业务流程建模的要素，它定义了编排和编制。&nbsp;<br /><br />三者的竞争关系似乎还将继续，但，BPMN2.0出现了，BPMN2.0 beta1版本于2009年8月发布，BPMN2.0 beta2版本于2010年5月发布，BPMN2.0正式版本于2011年1月3日发布。BPMN2.0正式将自己更名为Business Process Model And Notation（业务流程模型和符号），相比BPMN1.x，最重要的变化在于其定义了流程的元模型和执行语义，即它自己解决了存储、交换和执行的问题，BPMN由单纯的业务建模重新回归了它的本源，即作为一个对业务人员友好的标准流程执行语言的图形化前端。BPMN2.0一出手，竞争就结束了，XPDL、BPEL和BPDM各自准备回家钓鱼。看起来胜利者似乎是BPMN，但看看BPMN2.0的领导者，就会发现最后的胜利者还是IBM， Oracle和SAP这些大厂商们，他们提交的草案明确要赋予BPMN2.0以执行语义，这迫使BPDM团队撤回了其提交，并将他们的提议与BPDM团队想法合并，这就是BPMN2.0最后内容的由来。&nbsp;<br /><br />BPMN的目标是期望通过一套统一的建模、执行模型填起业务人员与开发人员之间的那道鸿沟。但问题是它真的能够如它期望般的做到这一点吗，对业务人员友好的模型对开发人员同样友好吗，反过来，对开发人员友好的模型对业务人员同样友好吗，尽管他们使用的都是同一套符号？我们在后续的建模实例里将看到这样的问题，这涉及到建模的风格。同一个流程模型能够使用多种建模方式，哪种方式才是最有效的？这就需要考虑模型的用户是谁（业务人员、分析人员、开发人员），才能界定是否有效了。此外，工具毕竟只是工具，促进业务人员与开发人员之间的沟通，除了工具，还有公司文化、组织结构等等其他人的因素，这也才是最重要的因素。&nbsp;<br /><br />不管怎样，BPMN2.0是BPMN历史上最重要的一个版本，BPMN继续向正确的方向迈进了一大步。在下一节里，我们将一起看看BPMN所支持的三种基本类型的流程模型。&nbsp;</div></span></div><img src ="http://www.blogjava.net/RongHao/aggbug/357150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2011-08-23 23:24 <a href="http://www.blogjava.net/RongHao/archive/2011/08/23/357150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈工作流数据</title><link>http://www.blogjava.net/RongHao/archive/2010/05/23/321685.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 23 May 2010 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2010/05/23/321685.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/321685.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2010/05/23/321685.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/321685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/321685.html</trackback:ping><description><![CDATA[<font  face="宋体"><span  style="font-family: Simsun; ">
<div style="margin-top: 6px; margin-right: 6px; margin-bottom: 6px; margin-left: 6px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Times New Roman'; font-size: 12pt; background-color: #ffffff; color: #000000; min-height: 1100px; counter-reset: __goog_page__ 0; line-height: normal; ">
<p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体"><br />
</font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">正如语言是人之间的沟通方式一样，数据是</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统之间的沟通方式，语言之间的沟通总是最有效的，数据交互却未必，因为</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统里的数据除了让计算机理解外重要的是还需要人理解。在这篇文章里，我们将讨论工作流系统里的数据，从数据角度分析工作流数据的分类以及不同的应用场景。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><font  face="宋体"><font  size="3">一、工作流系统的应用场景</font></font></strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在正式开始对工作流数据的讨论之前，首先对工作流系统的应用场景进行讨论是必要的，因为工作流数据脱离不开工作流系统这个大的上下文。目前，工作流系统的应用主要有两种方式：</font></font></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 42pt; "><span class="a Apple-style-span">1、&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="a Apple-style-span"><strong><font  face="宋体">将工作流系统嵌入到业务系统中使用</font></strong></span><span class="a Apple-style-span"><font  face="宋体">。此时工作流系统作为内部组件对业务系统进行流程逻辑的横切。试想一个需要多人处理的电力缴费流程，在引入工作流系统之前，我们需要为每个业务表单设置一个状态位，以此来进行业务处理状态的跟踪。如果流程固定，那么这样做并没有什么不好，例如财务软件、海关报关软件等，它们的流程虽然复杂但是不常改变，此时就没有必要引入工作流系统。但是对于另外一些情况，例如制造业的订单处理、库存管理、政府的协同办公等，流程经常需要定制修改，此时如果继续由业务系统自己处理流程逻辑那么成本将会很高。</font></span></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 42pt; "><span class="a Apple-style-span">2、&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="a Apple-style-span"><strong><font  face="宋体">使用工作流系统进行业务系统的集成</font></strong></span><span class="a Apple-style-span"><font  face="宋体">。在上规模的企业里，很多流程会涉及到不同的业务功能，例如报价、订单审核、资产核准、绩效评估等，这些流程经常会跨越不同的部门和业务系统。因为不同企业都有自己所采用的业务系统、组织机构以及最佳的业务协作方法，所以这些流程基本上也随企业而异。工作流系统此时扮演的就是集成角色，由其通过定制流程将这些业务系统撮合起来，实现企业内各部门、客户间的信息流动和协作。</font></span></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在第一种应用场景下，工作流系统作为业务系统的内部横切组件出现，作为横切组件，工作流数据仅仅包括与流程逻辑相关的数据以及其他必需数据，这些数据包括工作流控制数据、工作流相关数据以及需要通过流程传递的业务数据。</font></font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在第二种应用场景下，由于不同业务系统之间的数据传递很大程度上依靠工作流系统，所以这些数据被封装为</font></font><font  size="3">SDO</font><font  face="宋体"><font  size="3">在不同</font></font><font  size="3">WEB</font><font  face="宋体"><font  size="3">服务间传递，需要注意的是，这些数据并不在工作流系统中存储。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font  face="宋体"><font  size="3">在下面的工作流数据分类中，我们将详细分类这些工作流数据。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><font  face="宋体"><font  size="3">二、工作流数据的分类</font></font></strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">提到工作流数据，就不得不提业务数据。作为最直接的区分，我们将存储于业务系统中的数据称为业务数据，将存储于工作流系统中的数据称为工作流数据。根据</font></font><span class="a Apple-style-span">WFMC</span><font  face="宋体"><font  size="3">定义，我们将工作流数据分为工作流控制数据和工作流相关数据。</font></font></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 39pt; "><span class="a Apple-style-span">1、&nbsp;&nbsp;</span><span class="a Apple-style-span"><strong><font  face="宋体">工作流控制数据</font></strong></span><span class="a Apple-style-span"><font  face="宋体">。指被工作流系统管理的系统数据，这些数据包括了与流程实例和任务实例相关的执行数据，例如流程实例的状态、执行时间等信息、任务实例的执行者、执行时间、状态、紧急程度等。</font></span></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 39pt; "><span class="a Apple-style-span">2、&nbsp;&nbsp;</span><span class="a Apple-style-span"><strong><font  face="宋体">工作流相关数据</font></strong></span><span class="a Apple-style-span"><font  face="宋体">。指与业务流程相关的数据。工作流相关数据又具体分为</font>3</span><span class="a Apple-style-span"><font  face="宋体">种：</font></span></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 75pt; "><span class="a Apple-style-span"><font  face="symbol">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span class="a Apple-style-span"><font  face="宋体">影响流程实例执行的业务数据。在</font>WFMC</span><span class="a Apple-style-span"><font  face="宋体">中，这个数据被描述为：工作流系统通过该数据来确定流程实例的流转条件，并选择下一个将执行的任务，这些数据可以被业务系统访问并修改。例如报销流程中的&#8220;报销金额&#8221;，这个数据会决定该流程的审批路径；再例如为任务设置的超时时间，这个数据会触发任务的取消。实质上这些数据就是工作流系统需要依赖于进行流程流转的业务数据。</font></span></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 75pt; "><span class="a Apple-style-span"><font  face="symbol">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span class="a Apple-style-span"><font  face="宋体">契合业务的关联数据。指工作流系统与业务系统进行关联的数据，例如特定于</font>WEB</span><span class="a Apple-style-span"><font  face="宋体">系统，工作流系统会在每个流程实例里保持有导航至对应业务表单的</font>URL</span><span class="a Apple-style-span"><font  face="宋体">。</font></span></p>
<p class="MsoBodyTextFirstIndent2" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 75pt; "><span class="a Apple-style-span"><font  face="symbol">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span class="a Apple-style-span"><font  face="宋体">传递作用的业务数据。当流程跨越多个业务模块时，需要在模块间传递数据，此时会利用工作流系统进行传递，会在工作流系统里暂时存储这些业务数据。</font></span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">那么，工作流数据有哪些应用场景呢？</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong>&nbsp;</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><font  face="宋体"><font  size="3">三、工作流数据与业务上下文</font></font></strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">工作流数据最重要的职责之一就是为业务系统的不同应用场景建立起与之对应的业务上下文。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">什么是业务上下文？</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">我们知道，</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统是对企业现实业务的映射。在一个翻译公司的典型业务场景中，校对人员对翻译人员提交的翻译文档进行审校，此时，校对人员持有翻译人员翻译后的文档，他需要对该文档进行检查，产生新的审校文档并反馈翻译人员的翻译质量。那么，映射到</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统里，校对人员的任务通常对应于一张需要处理的业务表单，业务表单里会展现他进行当前工作所需要的数据：翻译文档、翻译人员信息、该校对工作的紧急程度等，另外，在这张表单里，他所能进行的操作也根据他此时的职责作出了行为限定：例如他可以上传新的校对后的文档，但是不能删除已有的翻译文档等。如下图</font></font><font  size="3">1</font><font  face="宋体"><font  size="3">所示，业务表单实质上反映的是此刻我们能获取哪些数据以及能够如何处理这些数据，我们把它称之为业务上下文，可以看到，在</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统里，业务上下文实质上等于数据加上行为。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">企业业务由一系列相互关联的业务场景组成，这些业务场景对应于</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统里的业务上下文，而业务上下文的本质则是数据加上行为。数据和行为的不同决定了业务上下文的差别。这与现实中的工作相符，人们根据获取</font></font><font  size="3">/</font><font  face="宋体"><font  size="3">处理信息的不同，担负不同的职责。</font></font>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="u7y-" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_158ngdxg8d3_b" style="height: 455.766017px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;1<font  face="宋体">与应用场景对应的业务上下文</font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体">工作流数据如何建立业务上下文呢？看一个简单的例子。</font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在实际应用工作流系统进行开发时，我们经常会碰到这样的问题：同一流程中的不同任务对业务数据拥有不同的权限，如下图</font></font><font  size="3">6-9</font><font  face="宋体"><font  size="3">所示。</font></font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="w0ry" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_160hd22qjf6_b" style="height: 417.298429px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;6‑9<font  face="宋体">与流程相关的业务数据权限</font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">上图中，在执行请假申请任务时，申请者可以编辑请假人、天数和原因</font></font><font  size="3">3</font><font  face="宋体"><font  size="3">个字段；而到审批任务时，审批者增加了一个可编辑的审批意见字段，但其余</font></font><font  size="3">3</font><font  face="宋体"><font  size="3">个字段变化为只读字段。我们将这类问题统称为与流程相关的业务数据权限控制。</font></font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">产生这类问题的原因是什么呢？原因就在于在一个业务流程里，不同的任务具有不同的业务上下文。如下图</font></font><font  size="3">6-10</font><font  face="宋体"><font  size="3">所示，不同的任务展现不同的数据，并具有不同的行为。</font></font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="vjni" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_161g3bzzzcc_b" style="height: 433.283804px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;6‑10<font  face="宋体">任务与业务上下文</font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在</font></font><font  size="3">IT</font><font  face="宋体"><font  size="3">系统的设计实现中，数据的建模是通过领域模型实现的。在工作流系统的嵌入式应用中，流程实例即是通过与领域模型相关联实现与业务契合的。那么，图</font></font><font  size="3">6-10</font><font  face="宋体"><font  size="3">可以进一步泛化为图</font></font><font  size="3">6-11</font><font  face="宋体"><font  size="3">，流程中任务通过获取领域模型不同的部分实现业务上下文的界定。</font></font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="m3:x" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_162r7ggn8f3_b" style="height: 452.414634px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;6‑11<font  face="宋体">领域模型与业务上下文</font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在大部分的业务流程建模中，一个流程模型只与一个领域模型关联</font></font><font  face="宋体">。</font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">那么，回到最初的问题上，如何处理此类权限问题呢？答案非常明了：由领域模型实现对业务上下文的切分，工作流系统通过契合业务的关联数据与业务上下文挂接，保持工作流系统的单一职责。</font></font></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="vtyc" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_163hpm494gv_b" style="height: 516.509284px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p class="MsoBodyTextFirstIndent" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;6‑12<font  face="宋体">流程相关的业务数据权限控制</font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">如上图</font></font><font  size="3">6-12</font><font  face="宋体"><font  size="3">所示，我们在业务系统里引入业务权限角色的概念，通过该角色隔离开工作流系统与业务数据权限，即我们认为业务数据权限的管理属于业务系统范围（由业务系统具体实现），更进一步，我们认为其属于领域模型的职责范围。在定义好业务系统的权限角色后，我们通过任务级别的工作流变量将流程中的具体任务与业务权限角色绑定，这样就实现了流程任务与业务数据权限的挂接。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">在上面的例子中，我们看到的是利用<strong>关联业务的工作流数据</strong>界定任务级别的业务上下文，这是一种最简单的工作流数据应用场景。在不同应用中，我们可以看到，工作流数据一个重要的职责就是为业务流程里的任务</font></font><font  size="3">/</font><font  face="宋体"><font  size="3">流程建立业务上下文，实现数据的聚合。在简单的应用场景里，对一个流程实例而言，这些数据可能只对应于一个领域模型；对流程实例里的一个任务实例而言，这些数据对应于领域模型的一个切面。复杂一些的情况，业务上下文需要跨越多个领域模型甚至多个业务系统，这时我们可以看到，通过工作流系统能够显著降低业务系统建模的复杂性，因为这些数据聚合工作可以有效分派给工作流系统承担。同时，我们需要保持工作流系统的单一职责，工作流系统只保存与业务数据进行关联的关联数据、必需的业务传递数据以及自身的执行数据。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="ks3l" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_164hgwdsgf4_b" style="height: 477.779104px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;6‑29<font  face="宋体">跨系统的业务上下文</font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong>&nbsp;</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><font  face="宋体"><font  size="3">四、工作流数据与数据分析</font></font></strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">工作流数据的第</font></font><font  size="3">2</font><font  face="宋体"><font  size="3">个应用场景是对业务流程执行进行数据分析，这部分的数据主要是<strong>工作流控制数据</strong>。这一部分正受到越来越多的重视，是未来工作流系统的发展方向。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="lna-" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_165fjbngqg4_b" style="height: 394.824121px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p align="center" class="MsoCaption" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: center; "><font  face="宋体">图</font>&nbsp;6‑48<font  face="宋体">外部环境从流程实例拉数据进行分析</font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">这里有两个典型的应用例子：</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">例子</font></font><font  size="3">1</font><font  face="宋体"><font  size="3">在对报销流程进行分析时，我们发现大部分的报销金额都低于</font></font><font  size="3">500</font><font  face="宋体"><font  size="3">元，然而这些报销流程却都要经过很多环节，在与客户确认后，我们将低于</font></font><font  size="3">500</font><font  face="宋体"><font  size="3">元的报销限定于部门内部审批即可，这样对个人来说大大加快了报销过程，对公司来说则省下了很多的办公成本。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">例子</font></font><font  size="3">2</font><font  face="宋体"><font  size="3">，在制造流程里，很重要的一点是需要控制流程的节拍时间，即流程里各个任务的完成时间要一致，如果有一项任务的时间多于其他任务，那么很快就会形成瓶颈，造成在制品的大量积压，前续的任务完成很快，中间忙死，后续任务执行者却无事可做，更重要的是，不能对客户进行快速交付。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong>&nbsp;</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><font  face="宋体"><font  size="3">五、工作流数据与流程路由</font></font></strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">最后一种应用场景非常常见，这部分数据即<strong>影响流程实例执行的业务数据</strong>，直接上图：</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<div id="z57l" style="margin-top: 0px; margin-bottom: 0px; text-align: left; "><img src="https://docs.google.com/File?id=dcszdbfc_166dftcgzdd_b" style="height: 459px; width: 648px; "  alt="" /></div>
<font  size="3"><br />
</font>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">这部分影响路由的一定是业务数据，它们保存到工作流系统里对流程路由产生影响。这种影响不限于任务的选择，还包括的任务的执行条件、任务的完成条件、基于数据的任务触发等。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><strong><font  face="宋体"><font  size="3">六、工作流数据小结</font></font></strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">总结一下，作为区分，</font></font><font  face="宋体"><font  size="3">我们将存储于业务系统中的数据称为业务数据，将存储于工作流系统中的数据称为工作流数据。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">工作流数据分为两种：工作流控制数据和工作流相关数据。其中工作流相关数据又分为</font></font><font  size="3">3</font><font  face="宋体"><font  size="3">种：影响流程实例执行的业务数据、契合业务的关联数据和传递作用的业务数据。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">工作流数据的应用场景：为流程</font></font><font  size="3">/</font><font  face="宋体"><font  size="3">任务建立业务上下文，这部分数据主要是契合业务的关联数据和传递作用的业务数据，这是工作流数据最重要的职责之一；数据分析，这部分数据主要是工作流控制数据，这是未来工作流的发展方向；影响流程路由，这部分数据人如其名，是影响流程实例执行的业务数据。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font  face="宋体"><font  size="3">实际应用中，我们一定要保持工作流系统的单一职责，例如划分任务权限这个需求，一定需要业务系统自行实现权限的界定，工作流数据仅仅进行挂接。</font></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;</p>
<div><br />
</div>
</div>
</span></font>
<img src ="http://www.blogjava.net/RongHao/aggbug/321685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2010-05-23 22:17 <a href="http://www.blogjava.net/RongHao/archive/2010/05/23/321685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PDF噩梦与工作流任务范围数据模式</title><link>http://www.blogjava.net/RongHao/archive/2010/03/22/316217.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 22 Mar 2010 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2010/03/22/316217.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/316217.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2010/03/22/316217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/316217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/316217.html</trackback:ping><description><![CDATA[<p><strong>PDF<font face="宋体">噩梦</font></strong></p>
<p><font face="宋体">在之前的一段时间里，只要一提起</font>PDF<font face="宋体">，我就会头晕，然后是头疼，最后是头大，总之是和头相关。需求很简单：为所有报表提供在线生成</font>PDF<font face="宋体">版本的功能，这样网站用户在浏览报表时就可以下载离线浏览。对不住了，开源软件，我不得不说，慎用开源软件，慎用！痛苦的查找论坛、痛苦的翻看源码，最后，在支付了</font>200<font face="宋体">欧后，痛苦消失了，我们购买了商业软件，</font>200<font face="宋体">欧兼容了更多的网页结构，</font>200<font face="宋体">欧具有更快的速度，</font>200<font face="宋体">欧带有一年的技术支持，最最重要的是，</font>200<font face="宋体">欧，客户出的。</font></p>
<p><font face="宋体">这不是这里的关键，问题是，</font>200<font face="宋体">欧后，我遇上了新麻烦：报表的</font>PDF<font face="宋体">版本样式不正确，不正确的原因是图片下方的文字将图片的排列样式弄乱了（图片大小不规则，字数不规则）。在网页中，</font>DOM<font face="宋体">渲染完毕后，我们使用</font>JavaScript<font face="宋体">来进行图片与文字高度的重计算，但在</font>PDF<font face="宋体">中，我们束手无策。</font></p>
<p><font face="宋体">我问</font>BA<font face="宋体">，可以容忍部分图片排列不整齐否？不出所料。</font></p>
<p><font face="宋体">怀有侥幸，我继续问</font>BA<font face="宋体">，可以容忍部分文字丢失否？</font>BA<font face="宋体">说，不可以。意料之中。于是找到徐昊。</font></p>
<p><font face="宋体">徐昊问</font>BA<font face="宋体">，这些说明文字对客户如此重要吗？</font></p>
<p>BA<font face="宋体">说，是的。</font></p>
<p><font face="宋体">徐昊说，为什么？它主要有哪些内容？</font></p>
<p>BA<font face="宋体">说，有标题，简单说明以及图片的版权信息，最重要的就是版权信息，一定不能丢失。</font></p>
<p><font face="宋体">徐昊说，能不能这么说，其实对客户最关心的是版权信息。</font></p>
<p>BA<font face="宋体">说，是的。</font></p>
<p><font face="宋体">于是问题解决。解决方案是：我们给文字定高，同时将文字缩小以容纳最可能多的字数，这样网站用户在</font>PDF<font face="宋体">里看到的图片重新恢复了整齐，尽管看不太清图片说明文字，但是用户真正关心的是图片，谁关心哪些无处不在的版权信息呢？你可能会说了，看不清版权信息怎么行？幸好，你问的不是，版权信息有那么重要吗。回答是，这里是</font>PDF<font face="宋体">，移动你的鼠标到</font>Zoom<font face="宋体">，点击下拉框，点击</font>150%<font face="宋体">以上的选项，然后，你会惊讶的发现，那些该死的版权信息到处都是。</font></p>
<p>BA<font face="宋体">的职责是帮客户发现的问题，开发人员的职责是解决问题，</font>QA<font face="宋体">的职责是校验最终的实现是否能够解决客户的问题。具体到一个用户故事上，就是</font>BA<font face="宋体">编写用户故事，</font>DEV<font face="宋体">编码开发，</font>QA<font face="宋体">验收用户故事，这是三个任务，很明显，这三个任务有一个非常重要的共享信息，这个信息就是用户故事所要实现的客户价值（即帮客户解决的问题）。围绕着客户价值，每次迭代开始前，团队都会进行迭代计划会议，所有成员会跟随</font>BA<font face="宋体">逐一审核各个用户故事；围绕着客户价值，开发人员开发中随时可以和</font>BA<font face="宋体">进行沟通，就设计问题进行讨论；围绕着客户价值，开发人员每开发完成一个故事，</font>BA<font face="宋体">、开发人员和</font>QA<font face="宋体">就会在一起进行一个微型</font> ShowCase<font face="宋体">，在期间讨论用户故事的实现是否实现了客户价值，大家对用户故事的理解是否一致。</font></p>
<p><font face="宋体">那么，在相关的任务之间需要能够定义变量，这些变量数据能够在这些任务间共享。</font></p>
<p><strong>&nbsp;</strong></p>
<p><strong><font face="宋体">描述</font></strong></p>
<p><font face="宋体">一定的任务范围能够定义变量，在一个流程实例里，该范围所包含的任务实例能够使用该变量。</font></p>
<div id="f365" style="text-align: left;"><img src="https://docs.google.com/File?id=dcszdbfc_132fb8qx5gh_b" style="height: 477.337px; width: 648px;"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><font face="宋体">图</font> 6-4<font face="宋体">任务范围级别的数据可见性</font></p>
<p><font face="宋体">如图</font>6-4<font face="宋体">所示，我们划定了一个任务范围，该范围包含了任务</font>A<font face="宋体">、任务</font>B<font face="宋体">和任务</font>C<font face="宋体">，同时，我们在该任务范围内定义了一个变量</font>M<font face="宋体">，那么，在一个流程实例里，只有任务</font>A<font face="宋体">、</font>B<font face="宋体">和</font>C<font face="宋体">的实例在运行期能够使用该变量，任务</font>D<font face="宋体">和</font>E<font face="宋体">的实例都不能访问，不可见。</font></p>
<p><strong>&nbsp;</strong></p>
<p><font face="宋体">可以看到任务范围和块任务在概念上比较相似，都是包含一系列的子任务，它们之间的差别在于：块任务一般具有比较独立的执行上下文和业务语义，而任务范围则是对具有相同执行上下文的任务的一种分组。</font></p>
<p><font face="宋体">在工作流系统里，对流程任务进行分组的好处在于：可以为特定的一组任务绑定数变量、异常处理器和补偿动作。例如在图</font>6-4<font face="宋体">中，如果任务</font>A<font face="宋体">、</font>B<font face="宋体">和</font>C<font face="宋体">中的任一实例执行失败，那么我们就认为整个任务区域执行失败，将统一执行一个业务补偿行为，同时，这些任务共享一个异常处理器。</font></p>
<p><strong><font face="宋体">实现</font></strong></p>
<p><font face="宋体">在</font>jBPM4<font face="宋体">里，流程定义模型相比</font>jBPM3<font face="宋体">最大的变化即是引入了任务嵌套的概念，一个任务能够包含多个其他任务，这里的父任务即可充当任务范围的定义。</font>jBPM4<font face="宋体">针对这种嵌套的任务建立了一套处理机制，总的来说就是建立任务运行期的嵌套关系，查找变量时首先会在任务级别进行查找，如果找不到，则会依次向上查找父任务实例，直至流程实例级别变量，同时，父任务可以统一绑定异常处理器和事件动作。在后续</font>jBPM4<font face="宋体">的章节，我们将会详细分析该机制的实现细节。</font></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/316217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2010-03-22 22:26 <a href="http://www.blogjava.net/RongHao/archive/2010/03/22/316217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>唐僧、QA MM与工作流任务数据模式</title><link>http://www.blogjava.net/RongHao/archive/2010/03/16/315641.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 16 Mar 2010 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2010/03/16/315641.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/315641.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2010/03/16/315641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/315641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/315641.html</trackback:ping><description><![CDATA[<p><strong>唐僧与
QA MM</strong>
</p>
<p>在一个典型的项目团队里，包括了以下几种角色（帽子）：
PM（项目经理）、
BA（业务分析师）、
DEV（程序开发者）和
QA（质量保证人员），整个团队的目标是向客户交付价值。
</p>
<p><br />
</p>
<p>那么，有一天，
QA MM来找我，我是开发人员。
MM说，一张图片没有正常显示，我想知道原因，同时想知道你能否修复。我的第一想法是，这不可能，一定是环境的原因。我说，好的，稍等。接下来，我张大嘴巴看到了
MM给我重现的
BUG：本该显示图片的位置一片空白，就像此时我合不上的嘴。这怎么可能呢？我想，这个功能完成的如此之得意，以至于测试用例里的数据都是以我的名字命名的。
</p>
<p><br />
</p>
<p>几分钟后，或者更长，我叫来
MM，说，找到原因了。
</p>
<p><br />
</p>
<p>我打开编辑器，光标在源程序的某一行闪烁，我说，最根本的原因在这里。我看到
MM的眼中闪过一丝迷茫。接下来，我却换到另外一个源文件，光标继续闪烁，我说，这里的程序因此受到影响。看得出，
MM有点发晕。终于，当我打开第
N个源文件并试图继续讲解时，
MM昏过去了。
</p>
<p><br />
</p>
<p>当
MM苏醒过来时，我在她清澈的双眼中看到了一只清晰的唐僧。
</p>
<p><br />
</p>
<p>MM肯定感到了不好意思，因为我的讲解中包含了比喻、类推、排比等我力所能及的各种语文知识，看得出，我很努力，我的语文老师也很努力，所以她委婉地说，能不能简单一点？
</p>
<p><br />
</p>
<p>我想了想，说，测试驱动时测试数据不全导致程序少考虑一种情况。
</p>
<p><br />
</p>
<p>MM说，能修复吗？
</p>
<p><br />
</p>
<p>我说，可以。于是故事结束。
</p>
<p><br />
</p>
<p><span>就
是这样，当我们执行一项任务时，围绕这项任务必然会产生许许多多的信息，这些信息对于该任务的执行者是必须的，但是对于其他人则不是，有效的沟通往往来自
于简练的表达即只表达对方需要和可以理解的内容，浩瀚的细节只会将真正想表达的内容淹没。其实这里还有这样一层意思：我之所以用这么多的细节信息来淹没</span>
QA，实际上是不太情愿承认程序里有
BUG。
QA想要的结果很简单，是否是程序
BUG，能否修复。而开发人员则往往把自己的程序与自己关联在了一起，认为程序是自己的扩展，程序有
BUG则意味着自己有缺陷。这一关系明显是矛盾的，可是一些团队里开发人员和
QA能够和平相处，而有些团队却势如水火。
</p>
<p><br />
</p>
<p>那么，对于单个任务而言，需要定义自己的变量，这些变量数据只与该任务相关，只在该任务里可见。典型的工作流应用于任务执行期间的中间数据存储。在文档处理中，一个重要的功能就是需要提供版本管理，在单个任务实例里，办理者能够管理自己处理过的文档版本。
</p>
<p><strong>&nbsp;</strong>
</p>
<p><strong>描述
</strong>
</p>
<p>任务能够定义变量，在一个流程实例里，该变量只能被其任务实例所使用。
</p>
<div id="xjbn" style="text-align: left;" mce_style="text-align: left;"><img style="height: 468.913px; width: 648px;" mce_style="height: 468.913px; width: 648px;" src="https://docs.google.com/File?id=dcszdbfc_130hpjrbrsb_b" mce_src="https://docs.google.com/File?id=dcszdbfc_130hpjrbrsb_b" alt="" /></div>
<p><br />
</p>
<p style="text-align: center;" mce_style="text-align: center;" align="center">图
6-2任务级别的数据可见性
</p>
<p>如图
6-2所示，我们在任务
B上定义了一个变量
M，此时，在一个流程实例里，只有任务
B的实例才能使用该变量。
</p>
<p><strong>&nbsp;</strong>
</p>
<p><strong>实现
</strong>
</p>
<p>存在两种实现方式，一种是如图
6-1<span>所示的，在任务节点定义中声明变量，运行期初始化任务实例的同时初始化该变量并使用；
另一种是在流程定义级别统一声明变量，但是各个任务实例都独立初始化并存储该变量。第二种实现方式在各个任务都需要使用同一语义的变量时很常见，例如各个任务实例都会有参与者，我们在流程定义时声明一个名为</span>
userid的变量，在流程实际执行时，各个任务实例都会独自保存有自己的
userid数据。
</p>
<img src ="http://www.blogjava.net/RongHao/aggbug/315641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2010-03-16 22:05 <a href="http://www.blogjava.net/RongHao/archive/2010/03/16/315641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>晚饭与工作流数据模式</title><link>http://www.blogjava.net/RongHao/archive/2010/03/14/315405.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 14 Mar 2010 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2010/03/14/315405.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/315405.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2010/03/14/315405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/315405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/315405.html</trackback:ping><description><![CDATA[<p><font face="宋体">和前面的章节一样，我们先从一个故事开始，这个故事和晚饭有关。在我家，周一至周五，老婆做饭，我洗碗。每天做完
饭，老婆会叫我到厨房，说，看，这个盘要洗一下，另外，灶台脏了，也要擦。如果放在以前，我会说，好，明白了。但是现在，程序员的生活让我意识到，沟通永
远不是一件简单的事情，我说，好，知道了。</font></p>
<p><font face="宋体">等等，这个故事和本章的主题</font>-<font face="宋体">数
据模式有一毛钱的关系？这只是一个关于沟通的故事。是的，让我们稍微映射一下：这里，晚饭这个流程包含了两个基本的任务，分别是做饭和洗碗，在做饭这个任
务完成时，任务的执行者（老婆）向下一个任务的执行者（我）传递了数据（要洗哪些东西），正如语言是人之间的沟通方式一样，数据是</font>IT<font face="宋体">系统之间的沟通方式，语言之间的沟通总是最有效的，数据交互却未必，因为</font>IT<font face="宋体">系统里的数据交互除了让计算机理解外重要的是还需要人理解，</font>IT<font face="宋体">系统是对现实生活的映射，也正因为如此，现在数据之间的沟通也在向语言靠拢即语义化（</font>REST/<font face="宋体">语义网）。</font></p>
<p><font face="宋体">好，言归正传。</font></p>
<p><font face="宋体">在
前两章里，我们分别讨论了工作流的控制模式和资源模式，控制模式关注于如何合理调配业务流程里的任务，从而获得理想的执行效率和收益；资源模式则关注于如
何合理调配可用的资源来执行业务流程。本章将介绍工作流系统里的数据模式，从数据的角度分析工作流系统对数据的处理。数据模式共计</font>39<font face="宋体">种，在下面的介绍中，我们将这些模式分为了四部分，分别是数据可见性、数据交互、数据传输和基于数据的路由。</font></p>
<p><font face="宋体">本章先会概要重复一下与数据模式相关的一些基本概念，例如流程定义、流程实例、原子任务、块任务等。接下来会对具体的</font>39<font face="宋体">种数据模式进行讨论，讨论的模式按照应用、描述和实现展开，分别对应着实际场景对模式的映射、模式的介绍和工作流系统对该模式的实现支持。最后是小结。</font></p>
<p><strong><font face="宋体">一、基本概念</font></strong></p>
<p><strong>1<font face="宋体">、工作流系统里的流程结构</font></strong></p>
<p><font face="宋体">在正式介绍数据模式之前，让我们先简单回顾一下工作流系统里流程的基本结构。</font></p>
<div id="ar4-" style="text-align: left;"><img src="https://docs.google.com/File?id=dcszdbfc_129g35q5wfz_b" style="height: 475.834px; width: 648px;"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><font face="宋体">图</font> 6-1 <font face="宋体">工作流系统里的流程结构</font></p>
<p><strong><font face="宋体">流程定义</font></strong><font face="宋体">：对业务流程的建模和描述，其具有足够的细节信息，能够直接被工作流系统所执行。典型的，流程定义由一系列的任务组成，这些任务以图形的形式展现并被连接起来。</font></p>
<p><strong><font face="宋体">流程实例</font></strong><font face="宋体">：流程定义的一个执行实例被称为流程实例。一个流程定义可以存在多个同时执行的流程实例。这些流程实例互相独立执行。</font></p>
<p><strong><font face="宋体">任务</font></strong><font face="宋体">：一个任务对应着流程定义里的一个单一工作单元。存在四种不同类型的任务：原子任务、块任务、多实例任务和多实例块任务。</font></p>
<p><font face="宋体">原子任务包含简单且独立的任务定义，当其初始化时只会产生一个可执行的任务实例。</font></p>
<p><font face="宋体">块任务是一系列任务的组合，典型的，工作流系统里存在的子流程任务（节点）即是块任务，当一个块任务开始执行时，其将流程控制权传递给与之对应子流程的第一个任务，当子流程完成执行后则将控制权返回给块任务。如图</font>6-1<font face="宋体">所示，块任务</font>C<font face="宋体">对应着一个由任务</font>X<font face="宋体">、任务</font>Y<font face="宋体">和任务</font>Z<font face="宋体">组成的子流程，实际执行时，任务</font>C<font face="宋体">会触发任务</font>X<font face="宋体">的执行，任务</font>Z<font face="宋体">执行完毕即子流程执行完成后则会触发任务</font>C<font face="宋体">执行完成。</font></p>
<p><font face="宋体">多实例任务在实际执行时会产生多个并行执行的任务实例，这些任务实例一般互相独立执行。当一定数量的实例执行完毕后即会触发后续任务的执行。</font></p>
<p><font face="宋体">多实例块任务结合了块任务和多实例任务的定义，其在实际执行时产生多个任务实例，每个任务实例对应着一个子流程实例。</font></p>
<p><strong><font face="宋体">任务实例</font></strong><font face="宋体">：任务的一个执行实例。</font></p>
<p><strong>2<font face="宋体">、数据相关约定</font></strong></p>
<p><font face="宋体">我们使用</font>def var ${<font face="宋体">变量名</font>}<font face="宋体">定义数据元素，同时</font>def var ${<font face="宋体">变量名</font>}<font face="宋体">的声明位置决定了变量的作用范围。如图</font>6-1<font face="宋体">所示，我们在任务</font>C<font face="宋体">上定义了一个名为</font>M<font face="宋体">的数据变量，其的作用范围为任务</font>C<font face="宋体">，任务级别。</font></p>
<p><font face="宋体">我们使用</font>use(${<font face="宋体">变量名</font>})<font face="宋体">表明对变量的使用；使用</font>pass(${<font face="宋体">变量名</font>})<font face="宋体">表明数据变量的传递。在图</font>6-1<font face="宋体">里，变量</font>M<font face="宋体">从任务</font>C<font face="宋体">传递至任务</font>E<font face="宋体">。</font></p>
<p><font face="宋体">对于变量的数据类型，典型的有</font>String<font face="宋体">、</font>integer<font face="宋体">、</font>float<font face="宋体">、</font>boolean<font face="宋体">、</font>date<font face="宋体">、</font>time<font face="宋体">等，很多工作流系统使用序列化和反序列化支持存储任意类型的数据类型，如数组、集合、对象。</font></p>
<p><strong>3<font face="宋体">、类比的约定</font></strong></p>
<p><font face="宋体">在后续对各个模式的介绍里，我会围绕一个项目团队的故事进行映射，我们如此约定：</font></p>
<p><strong><font face="宋体">流程定义：</font></strong><font face="宋体">我们认为所有成熟的软件公司都会建立起其完整并适用的一套软件开发流程，我们将这套流程看作是这里的流程定义。</font></p>
<p><strong><font face="宋体">流程实例：</font></strong><font face="宋体">围绕着软件开发流程，我们会使用这套流程来开始我们实际的软件开发项目，我们将所有的软件开发项目都看作是开发流程的执行实例，即流程实例。</font></p>
<p><strong><font face="宋体">任务：</font></strong><font face="宋体">项目开发过程中的各项任务。</font></p>
<p><strong><font face="宋体">数据：</font></strong><font face="宋体">我们将团队成员之间的信息交流看作是数据交互。</font></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/315405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2010-03-14 21:14 <a href="http://www.blogjava.net/RongHao/archive/2010/03/14/315405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流？BPM？云中的流程？这是个问题(前言)</title><link>http://www.blogjava.net/RongHao/archive/2009/11/29/304127.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 29 Nov 2009 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/11/29/304127.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/304127.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/11/29/304127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/304127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/304127.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">本书关注于</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">里的流程产品。面对市场上品种繁多的流程产品，很多人的困惑是：这些流程产品究竟能够帮助企业做出哪方面的改进，这些产品背后的理论基础又是什么？同时，很多人对</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">产品的宣传也存在着困惑，最多的就是：工作流技术和</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">（业务流程管理）技术究竟存在着什么区别？为什么很多原先的工作流产品现在都改称为</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">产品？本书将对这些问题都进行一定的讨论，一个事实是</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">流程系统将在企业的改进方面发挥越来越重要的作用，但是不可否认的是，就目前而言，这些系统还存在着很多的局限，如果一个流程产品的思想是流程自动化，那么很大程度上这个产品是不符合企业发展需要的。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">提到流程，第一个问题就是流程的历史。</font></span><font size="4">18</font><span style="font-family: 宋体;"><font size="4">世纪英国经济家学亚当</font></span><font size="4">&#183;</font><span style="font-family: 宋体;"><font size="4">斯密在《国民财富的性质和原因的研究》中提出</font></span><font size="4">&#8220;</font><span style="font-family: 宋体;"><font size="4">劳动分工原理</font></span><font size="4">&#8221;</font><span style="font-family: 宋体;"><font size="4">，提出分工有利于提高效率、增加产量，其理由有三：第一，劳动者的技巧因业专而日进；第二，分工可以免除由一种工作转到另一种工作的时间损失；第三，简化劳动和机械的发明使一个人能做许多人的工作。亚当</font></span><font size="4">&#183;</font><span style="font-family: 宋体;"><font size="4">斯密的分工论蕴涵了最朴素的流程理念。流程产生于一系列的分工。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">维基百科里
对业务流程进行了如下定义：业务流程是为特定的对象（客户）创造价值的过程，这一过程由一系列相关联、有组织的活动或任务组成。企业和组织中，业务流程一
般被划分为三种基本类型：管理流程，对企业运行进行管理、协调的流程；运行流程，构成核心业务和创造基本价值的流程，如采购、制造、市场销售等；支持流
程，支撑管理流程和运行流程的流程，如会计、招聘、技术支持等。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">接下来我们关注工作流技术的历史。工作流技术发端于</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/1970%E5%B9%B4%E4%BB%A3" title="1970年代"><span style="color: windowtext; text-decoration: none;">1970</span><span style="font-family: 宋体; color: windowtext; text-decoration: none;">年代</span></a></font><span style="font-family: 宋体;"><font size="4">中期</font></span><font size="4"><a href="http://zh.wikipedia.org/w/index.php?title=%E5%8A%9E%E5%85%AC%E8%87%AA%E5%8A%A8%E5%8C%96&amp;action=edit&amp;redlink=1" title="办公自动化（尚未撰写）"><span style="font-family: 宋体; color: windowtext; text-decoration: none;">办公自动化</span></a></font><span style="font-family: 宋体;"><font size="4">领域的研究工作，但工作流思想的出现还应该更早，</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/1968%E5%B9%B4" title="1968年"><span style="color: windowtext; text-decoration: none;">1968</span><span style="font-family: 宋体; color: windowtext; text-decoration: none;">年</span></a>Fritz Nordsieck</font><span style="font-family: 宋体;"><font size="4">就已经清楚地表达了利用信息技术实现工作流程自动化的想法。</font></span><font size="4">1970</font><span style="font-family: 宋体;"><font size="4">年代与工作流有关的研究工作包括：</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/%E5%AE%BE%E5%A4%95%E6%B3%95%E5%B0%BC%E4%BA%9A%E5%A4%A7%E5%AD%A6" title="宾夕法尼亚大学"><span style="font-family: 宋体; color: windowtext; text-decoration: none;">宾夕法尼亚大学</span></a></font><span style="font-family: 宋体;"><font size="4">沃顿学院的</font></span><font size="4">Michael D. Zisman</font><span style="font-family: 宋体;"><font size="4">开发的原型系统</font></span><font size="4">SCOOP</font><span style="font-family: 宋体;"><font size="4">，</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/%E6%96%BD%E4%B9%90%E5%B8%95%E6%B4%9B%E9%98%BF%E5%B0%94%E6%89%98%E7%A0%94%E7%A9%B6%E4%B8%AD%E5%BF%83" title="施乐帕洛阿尔托研究中心"><span style="font-family: 宋体; color: windowtext; text-decoration: none;">施乐帕洛阿尔托研究中心</span></a></font><span style="font-family: 宋体;"><font size="4">的</font></span><font size="4">Clarence
A. Ellis</font><span style="font-family: 宋体;"><font size="4">和</font></span><font size="4">Gary J. Nutt</font><span style="font-family: 宋体;"><font size="4">等人开发的</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/OfficeTalk" title="OfficeTalk"><span style="color: windowtext; text-decoration: none;">OfficeTalk</span></a></font><span style="font-family: 宋体;"><font size="4">系列试验系统，还有</font></span><font size="4">Anatol Holt</font><span style="font-family: 宋体;"><font size="4">和</font></span><font size="4">Paul Cashman</font><span style="font-family: 宋体;"><font size="4">开发的</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/ARPANET" title="ARPANET"><span style="color: windowtext; text-decoration: none;">ARPANET</span></a></font><span style="font-family: 宋体;"><font size="4">上的</font></span><font size="4">&#8220;</font><span style="font-family: 宋体;"><font size="4">监控软件故障报告</font></span><font size="4">&#8221;</font><span style="font-family: 宋体;"><font size="4">程序。</font></span><font size="4">SCOOP, Officetalk</font><span style="font-family: 宋体;"><font size="4">和</font></span><font size="4">Anatol
Holt</font><span style="font-family: 宋体;"><font size="4">开发的系统都采用</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/Petri%E7%BD%91" title="Petri网"><span style="color: windowtext; text-decoration: none;">Petri</span><span style="font-family: 宋体; color: windowtext; text-decoration: none;">网</span></a></font><span style="font-family: 宋体;"><font size="4">的某种变体进行流程建模。其中</font></span><font size="4">SCOOP</font><span style="font-family: 宋体;"><font size="4">和</font></span><font size="4">Officetalk</font><span style="font-family: 宋体;"><font size="4">系统，不但标志着工作流技术的开始，而且也是最早的办公自动化系统。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
&nbsp;<font face="Courier New"><font size="4"></font><span style="font-family: 宋体;"><font size="4">可以看到，工作流最初出现的思想和要解决的问题即是实现工作流程的自动化。但是这带来了工作流技术应用的局限：第一是在企业里存在着很多关键的业务流程，这
些流程自动化的成本太高，无法自动化；第二是很多流程并不需要自动化，自动化反而会降低这些流程的执行效率，典型的在一个企业里，请假往往需要一定的审
批，在这种情况下，直接面对面的交流往往比通过工作流提交表单更有效率；第三是自动化流程往往意味着流程的柔性降低，</font></span><span style="font-family: 宋体;"><font size="4">比如制造企业都有设备维修业务过程，基本步骤如下：故障维修申请</font></span> <span style="font-family: 宋体;"><font size="4">－</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">&gt; </font></span><span style="font-family: 宋体;"><font size="4">审批</font></span> <span style="font-family: 宋体;"><font size="4">－</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">&gt; </font></span><span style="font-family: 宋体;"><font size="4">派工</font></span> <span style="font-family: 宋体;"><font size="4">－</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">&gt; </font></span><span style="font-family: 宋体;"><font size="4">领料</font></span> <span style="font-family: 宋体;"><font size="4">－</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">&gt; </font></span><span style="font-family: 宋体;"><font size="4">维修</font></span> <span style="font-family: 宋体;"><font size="4">－</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">&gt; </font></span><span style="font-family: 宋体;"><font size="4">验收</font></span> <span style="font-family: 宋体;"><font size="4">－</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">&gt; </font></span><span style="font-family: 宋体;"><font size="4">维修数据记录。这样的一个维修过程如果用工作流实现，工作流引擎会严格按照这样一个顺序执行，但是车间随手换了一个备件，可能只需要</font></span><span style="font-family: &quot;Times New Roman&quot;;"><font size="4">5</font></span><span style="font-family: 宋体;"><font size="4">分钟，而从提交申请到维修结束，走这样一个繁琐的过程，恐怕不是信息系统服务于人了，而是人服从信息系统了，再比如，紧急情况下进行的维修，可能直接进行维修、验收、记录维修数据三个步骤，可能连派工都来不及了。此时，自动化流程就会严重影响执行效率。</font></span></font>
<p class="MsoNormal"><font size="4">1970</font><span style="font-family: 宋体;"><font size="4">年
代人们对工作流技术充满着强烈乐观情绪，研究者普遍相信新技术可以带来办公效率的巨大改善，这种期望不可避免的落空了。人们观察到这样一种现象，一个成功
的组织往往会在适当的时候创造性的打破标准的办公流程；而工作流技术的引入使得人们只能死板的遵守固定的流程，最终导致办公效率低和人们对技术的反感。</font></span><font size="4">1970</font><span style="font-family: 宋体;"><font size="4">年代工作流技术失败的技术原因则包括：在办公室使用</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/%E4%B8%AA%E4%BA%BA%E8%AE%A1%E7%AE%97%E6%9C%BA" title="个人计算机"><span style="font-family: 宋体; color: windowtext; text-decoration: none;">个人计算机</span></a></font><span style="font-family: 宋体;"><font size="4">尚未被社会接受，</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/%E7%BD%91%E7%BB%9C" title="网络"><span style="font-family: 宋体; color: windowtext; text-decoration: none;">网络</span></a></font><span style="font-family: 宋体;"><font size="4">技术还不普遍，开发者还不了解</font></span><font size="4"><a href="http://zh.wikipedia.org/zh-cn/%E7%BE%A4%E4%BB%B6" title="群件"><span style="font-family: 宋体; color: windowtext; text-decoration: none;">群件</span></a></font><span style="font-family: 宋体;"><font size="4">技术的需求与缺陷。总结一下，工作流应用失败的原因有两点：第一点是自动化流程的柔性低；第二点则是限于当时的技术原因。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">进入</font></span><font size="4">1990</font><span style="font-family: 宋体;"><font size="4">年代后，随着</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">技术的发展、个人计算机的普及，工作流技术开始重新进入一个新的热潮，这个热潮完全是技术驱动的，这时候出现了大量的工作流技术应用。需要注意的是，工作流技术不仅仅是指专门的工作流管理系统，同时也指拥有工作流特征的各种应用系统，例如各类企业管理软件（</font></span><font size="4">ERP</font><span style="font-family: 宋体;"><font size="4">）和协作软件里有具有的相应流程组件。工作流技术的应用使得很多应用软件的开发得到一定程度的简化（同时，可以观察到工作流产品的采购客户往往会是系统集成商）。需要注意的是，此时工作流要解决的问题域依旧是实现工作流程的自动化，由此带来的应用局限并没有发生变化。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">与此同时，新的管理革命正在发生。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><font size="4">1990</font><span style="font-family: 宋体;"><font size="4">年迈克尔</font></span><font size="4">&#183;</font><span style="font-family: 宋体;"><font size="4">哈默在《哈佛商业评论》上发表了题为《再造：不是自动化改造而是推倒重来》</font></span><font size="4">(Renglneenllg work</font><span style="font-family: 宋体;"><font size="4">：</font></span><font size="4">don"t
automate</font><span style="font-family: 宋体;"><font size="4">，</font></span><font size="4">obliterate)</font><span style="font-family: 宋体;"><font size="4">的文章，文中提出的再造思想开创了一场新的管理革命。</font></span><font size="4">1993</font><span style="font-family: 宋体;"><font size="4">年迈克尔</font></span><font size="4">&#183;</font><span style="font-family: 宋体;"><font size="4">哈默和詹姆斯</font></span><font size="4">&#183;</font><span style="font-family: 宋体;"><font size="4">钱皮在其著作《企业再</font></span> <span style="font-family: 宋体;"><font size="4">造：企业革命的宣言</font></span><font size="4">)(Reengineering the Corporation</font><span style="font-family: 宋体;"><font size="4">；</font></span><font size="4">a
Manifesto for Business Revoiution) </font><span style="font-family: 宋体;"><font size="4">一书中，首次提出了业务流程再造</font></span><font size="4">(BPR</font><span style="font-family: 宋体;"><font size="4">：</font></span><font size="4">Business
Process Reengineering)</font><span style="font-family: 宋体;"><font size="4">概念，并将其定义为：对企业业务流程进行根本性的再思考和彻底性的再设计，以取得企业在成本、质量、服务和速度等衡量企业绩</font></span> <span style="font-family: 宋体;"><font size="4">效的关键指标上取得显著性的进展。该定义包含了四个关键词，即：</font></span><font size="4">&#8220;</font><span style="font-family: 宋体;"><font size="4">流程</font></span><font size="4">&#8221;</font><span style="font-family: 宋体;"><font size="4">、</font></span><font size="4">&#8220;</font><span style="font-family: 宋体;"><font size="4">根本性</font></span><font size="4">&#8221;</font><span style="font-family: 宋体;"><font size="4">、</font></span><font size="4">&#8220;</font><span style="font-family: 宋体;"><font size="4">彻底性</font></span><font size="4">&#8221;</font><span style="font-family: 宋体;"><font size="4">和</font></span><font size="4">&#8220;</font><span style="font-family: 宋体;"><font size="4">显著性</font></span><font size="4">&#8221;</font><span style="font-family: 宋体;"><font size="4">。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">以此为标
志，形成了新的业务流程理念，并伴随着对传统企业金字塔式组织理念和管理模式的反思，新的理念强调企业以业务流程为中心进行运作、打破传统的部门隔阂、增
加客户价值和企业效益（降低成本）。以业务流程为中心取代职能分工，成为管理的首要原则，围绕流程建立起来的组织具有更高的敏捷性、效率和效益，呈现出扁
平化、网络化的特征。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">新的管理理念催生新的</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">产品，</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">产品孕育而生。可以说一个好的</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">产
品总是对应有相应的理论基础，那种简单的对现有工作方式的复制化是没有生命力的（一个小的而典型例子是电子印章软件，从布局到排版都很逼真。可是现实中印
章的设计是为进行文件的状态确认，非常直接，但是在电脑上摹仿这种印章，不但用着别扭，看着也十分难过，更重要的是，明明通过工作流的控制已经能够确认文
件的状态，却一定要通过电子印章来生硬模拟。）。很多技术人员以</font></span><font size="4">XPDL</font><span style="font-family: 宋体;"><font size="4">和</font></span><font size="4">BPEL</font><span style="font-family: 宋体;"><font size="4">来区分流程产品是工作流还是</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">，认为</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">更为强调软件的系统集成能力。<strong>实际上，工作流软件与</strong></font></span><strong><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件最大的区别不在于技术实现，而是它们解决的问题域发生了变化。</font></span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;"><font size="4"><br />
</font></span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;"><font size="4">工作流软件解决的问题域是流程的自动化，而</font></span><font size="4">BPM</font></strong><span style="font-family: 宋体;"><font size="4"><strong>软件解决的问题则是业务流程的优化</strong>。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">因为解决的问题域发生变化，那么</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件相比工作流软件在技术上的变化就很清晰了：强调对流程运行的监控、强调对流程运行数据的分析、强调对各种企业应用软件的集成能力、强调快速的开发能力。实际上很多</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件的前身即是工作流产品，从技术角度上理解，工作流软件和</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件是没有区别的，</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件是工作流软件发展的结果，只是开发商出于市场的考虑换上一个不同的标签而已（非常类似于当前的药品市场，同一种成分换个名称就变成新药）。然而从处理问题的角度考虑，区别两者则又是必要的。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">但是</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件面临的问题依旧存在，因为很多</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件解决问题的思路并不正确，很多</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件依旧是通过自动化流程来实现业务流程的优化，这再次回到工作流软件所面临的问题：企业很多业务流程很难自动化、自动化流程的柔性很低。对于这些问题，</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件试图通过简化编程（快速开发、</font></span><font size="4">SOA</font><span style="font-family: 宋体;"><font size="4">思想）和系统集成来尽可能自动化多的流程，通过增强流程定量分析能力来尽可能的增加流程柔性。这实际上是在用正确的方式做错误的事，因为解决问题的思路从一开始就决定了这并不是一条正确的路。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4">相比而言，</font></span><font size="4">Nimbus</font><span style="font-family: 宋体;"><font size="4">的</font></span><font size="4">Control-ES</font><span style="font-family: 宋体;"><font size="4">软件则选择了另外一条道路，它并不强调流程的自动化，它是从咨询软件发展而来的，这决定了其解决问题的另外一种方式：强调对现有流程的评估和重构而非自动化。在</font></span><font size="4">Control-ES</font><span style="font-family: 宋体;"><font size="4">里，流程是作为企业财产保存的，仅仅文档化。这几乎立刻扩大了其对业务流程的描述能力，但是其的咨询背景也决定了它的局限性：无法实时获取业务流程执行的数据（完全依靠咨询人员的工作），于是</font></span><font size="4">Control-ES</font><span style="font-family: 宋体;"><font size="4">更多是作为咨询人员的工具而存在的。从某种意义上说，流程改进本来就是一项咨询工作，很多</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">厂商甚至没有任何业务领域经验，拿出其</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件就宣传能够实现客户流程的优化是一件很搞的事情，很多所谓的流程梳理实际仅仅是对现有流程的复制再现，没有任何改进可言。</font></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体;"><font size="4">一种更好的方式是文档化所有业务流程，然后通过系统集成能力实时获得关键的数据信息，实现以流程为中心的数据撮合，关键的流程执行和改进则交由人去灵活执行。对这种实现思路我们将在本书的最后部分进行讨论。可以看见的是，<strong>流程优化从来也不应该是</strong></font></span><strong><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">系统能够完成的事情，</font></span><font size="4">IT</font><span style="font-family: 宋体;"><font size="4">系统所要做的是为流程优化撮合必需的数据，做为支撑系统而存在。</font></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><font size="4"><br />
</font></span></p>
<p class="MsoNormal"><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-family: 宋体;"><font size="4">说完</font></span><font size="4">BPM</font><span style="font-family: 宋体;"><font size="4">软件，最后我们需要关注的一个方向是云计算。越来越多的企业将其工作放置到了网上，典型的如</font></span><font size="4">Google</font><span style="font-family: 宋体;"><font size="4">提供的各种在线服务，文档、邮件、</font></span><font size="4">Excel</font><span style="font-family: 宋体;"><font size="4">等，这种趋势触发了新的业务模式，云中的工作流即是其中一种，通过提供在线的工作流程自动化，将各种在线服务通过流程粘合起来。在这方面，</font></span><font size="4">Cordys</font><span style="font-family: 宋体;"><font size="4">走在了最前面。</font></span></p>
<br />
<img src ="http://www.blogjava.net/RongHao/aggbug/304127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-11-29 20:39 <a href="http://www.blogjava.net/RongHao/archive/2009/11/29/304127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>资源模式唱罢、控制模式登场</title><link>http://www.blogjava.net/RongHao/archive/2009/11/22/303263.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 22 Nov 2009 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/11/22/303263.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/303263.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/11/22/303263.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/303263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/303263.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family: 宋体;">我们知道，一个商业目标的实现必定由一系列
的活动组成，这些活动的编排即构成了以目标为导向的业务流程。管理的目标即通过合理有效的编排这些活动以期以最少的成本达到最大的收益。这个编排的过程亦
即进行业务流程建模的过程。在进行业务流程建模时反复出现的活动结构构造即产生了模式。在本章中，我们将讨论工作流的控制模式。控制模式关注业务流程中活
动的编排，一方面强调与实际业务的契合，另一更为重要的方面则是如何合理调配这些活动。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">本章讨论的控制模式共计</span>43<span style="font-family: 宋体;">种。需要注意的是，这些模式的出发点是基于对实际业务进行描述的，与具体的工作流系统没有太大的关联。而一个工作流系统对工作流模式的支持程度则直接决定了该系统对业务的建模能力。所以在某种程度上，衡量一个合适的工作流系统时，往往会考虑其对工作流模式的支持程度。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">本章讨论的控制模式按照描述、应用和实现展开，分别对应着模式的介绍、模式对实际业务的映射和工作流产品对该模式的实现支持。最后是小结。作为约定，我们将业务流程里的活动映射为任务，将对活动的建模描述映射为任务节点。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 0.25in;"><strong>一、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-weight: normal;"><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></strong><strong><span style="font-family: 宋体;">基本控制模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">基本控制模式包括</span>5<span style="font-family: 宋体;">个模式，是其他控制模式的基础。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 9pt;">1、<strong><span style="font-family: 宋体;">顺序（</span>WCP_01:
Sequence</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在同一个流程实例里，任务会在前续任务完成后顺序触发。</span></p>
<p class="MsoNormal" style="text-align: center;" align="center"><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK6"></a><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK5"></a><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK4"></a><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK3"></a><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK2"></a><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK1"></a></p>
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">
<div id="sje1" style="text-align: left;"><img style="width: 648px; height: 225.249px;" src="http://docs.google.com/File?id=dcszdbfc_54hcfgnvhn_b"  alt="" /></div>
图</span> 4-1</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>4-1<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">执行完毕后会顺序触发任务</span>B<span style="font-family: 宋体;">的执行，任务</span>B<span style="font-family: 宋体;">执行完毕后会顺序触发任务</span>C<span style="font-family: 宋体;">的执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">同义词</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">顺序执行、串行路由。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">顺序模式是工作流建模的基础，是流程定义里最基本的构建块，用以描述连续串行的一系列任务，这些任务之间的触发是无条件的。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">顺序模式也是实际的业务中应用最多的模式，
当实现一个业务价值需要执行多个任务时，最自然的方式就是排序并顺序完成这些任务，典型的如流水线作业。当企业人数不多，业务模式简单（不需要过多的任务
或任务之间存在很强的线性依赖关系），管理成本很低时，顺序模式是最自然的选择。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 0in;">2、<strong><span style="font-family: 宋体;">并发分裂（</span>WCP_02:
Parallel Split</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">分支分裂为两个或多个后续分支，当分支执行完毕后触发后续并发分支的同时执行。并发的分支有可能在后续合并为一个分支，也可能不合并。</span></p>
<div id="tv4v" style="text-align: left;"><img style="width: 634px; height: 331px;" src="http://docs.google.com/File?id=dcszdbfc_55fqbzh7fc_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-2</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>4-2<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">完成后将同时触发任务</span>B<span style="font-family: 宋体;">和任务</span>C<span style="font-family: 宋体;">的执行，任务</span>B<span style="font-family: 宋体;">和任务</span>C<span style="font-family: 宋体;">的执行不存在前后关系。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">同义词</span></strong></p>
<p class="MsoNormal">AND-split<span style="font-family: 宋体;">、</span>Fork<span style="font-family: 宋体;">、并行路由、并行分裂。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在传统的软件开发里，开发过程被典型的分为了</span>5<span style="font-family: 宋体;">个阶段，如下图所示：</span></p>
<div id="kjlp" style="text-align: left;"><img style="width: 648px; height: 326.169px;" src="http://docs.google.com/File?id=dcszdbfc_56dmd3wghh_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-3</p>
<p class="MsoNormal"><span style="font-family: 宋体;">这</span>5<span style="font-family: 宋体;">个
阶段是顺序执行关系，典型的当需求分析完毕后会有一个需求冻结状态，在这种状态下才开始正式的软件设计和实现。该模式最大的弊端在于在需求分析阶段不可能
捕获用户所有可能的需求，而且客户的需求是变化的，开发阶段由于需求冻结对于客户完全黑盒，导致最后的交付无法实现客户期望的业务价值。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在敏捷开发里，开发过程由多个迭代组成，在每个迭代里，需求分析、架构设计、编码开发、测试和交付都是同时进行的，客户参与到这个过程中，客户能够从不断的交付中提出新的需求，这样软件才能够更好的响应变化，不至于在最终交付时出现业务价值的偏差。</span></p>
<div id="s719" style="text-align: left;"><img style="width: 648px; height: 366.588px;" src="http://docs.google.com/File?id=dcszdbfc_57cpfpmfgm_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-4</p>
<p class="MsoNormal"><span style="font-family: 宋体;">其实从某种角度上看，不同企业的组织管理结构也决定了它所采用的业务流程模式。在图</span>4-3<span style="font-family: 宋体;">所
示的开发流程里，每个阶段都对应于不同的部门，需求分析有专门的业务部门，开发部门内部分为了架构部门、开发部门和测试部门，交付则又有专门的实施团队，
在这种情况下，从管理的成本考虑，顺序执行无疑是最自然和最便宜的选择（这也是为什么在传统企业里实施敏捷困难的原因之一）。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">而在敏捷开发团队里，整个团队则是围绕开发流程建立，减少了内部不必要的协调沟通成本，能够达到相对较高的执行效率。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">由于后续分支的触发是无条件的，所以在很多工作流产品的实现里省去了</span>AND-split<span style="font-family: 宋体;">节点，直接由任务节点进行分支分裂，如下图</span>4-5<span style="font-family: 宋体;">所示：</span></p>
<div id="mzea" style="text-align: left;"><img style="width: 642px; height: 366px;" src="http://docs.google.com/File?id=dcszdbfc_58gsszhpfw_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-5</p>
<p class="MsoNormal">jBPM<span style="font-family: 宋体;">使用</span>token<span style="font-family: 宋体;">记录当前流程实例执行的位置并触发流转，建立起</span>token<span style="font-family: 宋体;">的父子关系。如下图所示，在</span>AND-split<span style="font-family: 宋体;">节点每个并发的分支都会产生一个新的子</span>token<span style="font-family: 宋体;">，当子</span>token<span style="font-family: 宋体;">到达</span>AND-join<span style="font-family: 宋体;">节点后即可通过其访问到它的父</span>token<span style="font-family: 宋体;">，再通过父</span>token<span style="font-family: 宋体;">遍历其子</span>token<span style="font-family: 宋体;">即可获得当前并发分支的执行情况并实现合并。</span></p>
<div id="crcv" style="text-align: left;"><img style="width: 648px; height: 387.382px;" src="http://docs.google.com/File?id=dcszdbfc_59gpzgb9f6_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-6</p>
<p class="MsoNormal"><span style="font-family: 宋体;">作为约定，我们在后续的说明中，将会采用</span>token<span style="font-family: 宋体;">来指代当前流程实例所执行的位置。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal" style="margin-left: 0in;">3、<strong><span style="font-family: 宋体;">同步（</span>WCP_03:
Synchronization</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">两个或多个分支合并为一个后续分支，当被合并的分支都执行完毕后，后续分支才被触发。</span></p>
<div id="zkdk" style="text-align: left;"><img style="width: 648px; height: 341.001px;" src="http://docs.google.com/File?id=dcszdbfc_60dfkzf686_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span>4-7</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如上图所示，当任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">都完成后，才会触发任务</span>C<span style="font-family: 宋体;">的执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">同义词</span></strong></p>
<p class="MsoNormal">AND-join<span style="font-family: 宋体;">、汇聚、同步。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在实际的应用中，</span>AND-split<span style="font-family: 宋体;">节点与</span>AND-join<span style="font-family: 宋体;">节点一般成对出现。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在任何时候，总结总是有必要的，每次迭代开发结束后，我们都会进行迭代小结，写出应该改进的部分、应该保持的部分，以保持整个团队的迭代前进。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际上，很多情况下</span>AND-split<span style="font-family: 宋体;">节点和</span>AND-join<span style="font-family: 宋体;">节点往往隐含着管理意义，上一级的管理者在</span>AND-split<span style="font-family: 宋体;">节点进行任务的管理和下发，在</span>AND-join<span style="font-family: 宋体;">节点对任务执行结果进行负责。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">和</span>AND-split<span style="font-family: 宋体;">节点一样，在部分工作流产品里，直接采用任务节点进行分支合并，如下图所示：</span></p>
<div id="qkya" style="text-align: left;"><img style="width: 590px; height: 383px;" src="http://docs.google.com/File?id=dcszdbfc_61gmc5t9g2_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-7</p>
<p class="MsoNormal">jBPM<span style="font-family: 宋体;">里，分支的合并实际是</span>token<span style="font-family: 宋体;">的合并，子</span>token<span style="font-family: 宋体;">生命周期终止，父</span>token<span style="font-family: 宋体;">重新激活。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal" style="margin-left: 0in;">4、<strong><span style="font-family: 宋体;">排他选择（</span>WCP_04:
Exclusive Choice</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">分支分裂为两个或多个后续分支，当分支执行完毕后只能选择触发一个后续分支执行，即多选一。</span></p>
<div id="aybr" style="text-align: left;"><img style="width: 648px; height: 381.468px;" src="http://docs.google.com/File?id=dcszdbfc_62ckchz7cn_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-9</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如上图所示，任务</span>A<span style="font-family: 宋体;">完成后将会选择触发任务</span>B<span style="font-family: 宋体;">或任务</span>C<span style="font-family: 宋体;">的执行，任务</span>B<span style="font-family: 宋体;">和任务</span>C<span style="font-family: 宋体;">之间只能选择一个执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">同义词</span></strong></p>
<p class="MsoNormal">XOR-split<span style="font-family: 宋体;">、排他</span>OR-split<span style="font-family: 宋体;">、条件路由。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">流程里的决策任务。会存在两种决策方式：人为决策和系统决策。由人或一组系统设定条件根据流程执行情况作出后续执行路径的选择。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">两种实现方式，一种是在</span>XOR-split<span style="font-family: 宋体;">节点定义路由选择条件（图</span>4-10<span style="font-family: 宋体;">）、一种是在后续转移线上定义触发条件（图</span>4-11<span style="font-family: 宋体;">）。</span></p>
<div id="p11l" style="text-align: left;"><img style="width: 648px; height: 360.874px;" src="http://docs.google.com/File?id=dcszdbfc_63fhb8rrk9_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-10</p>
<div id="sqvk" style="text-align: left;"><img style="width: 640px; height: 375px;" src="http://docs.google.com/File?id=dcszdbfc_64rwt4zpcj_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-11</p>
<p class="MsoNormal"><span style="font-family: 宋体;">条件的计算有多种方式：工作流变量与相应条件定义值简单匹配、提供接口由具体实现类返回计算结果、规则引擎进行规则匹配计算。同时，当存在多个后续分支和条件判断时，一般会定义一个默认执行分支。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal" style="margin-left: 0.5in;">5、<strong><span style="font-family: 宋体;">简单合并（</span>WCP_05:
Simple Merge</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">两个或多个分支合并为一个后续分支，任何一个分支执行完毕后就会触发后续分支的执行，不需要同步，遵循先进先出的原则。需要注意的是：该模式有个前提条件，即前续分支有且只有一个会执行。</span></p>
<div id="nq4v" style="text-align: left;"><img style="width: 648px; height: 367.385px;" src="http://docs.google.com/File?id=dcszdbfc_65gppqk833_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-12</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如上图所示，任务</span>A<span style="font-family: 宋体;">或任务</span>B<span style="font-family: 宋体;">只要有一个完成都会触发任务</span>C<span style="font-family: 宋体;">的执行，但是任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">有且只有一个可以执行。如果任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">都有可能执行，则变为另外一个模式：多合并模式（</span>WCP_08<span style="font-family: 宋体;">）。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">同义词</span></strong></p>
<p class="MsoNormal">XOR-join<span style="font-family: 宋体;">、排他</span>OR-join<span style="font-family: 宋体;">、</span>merge<span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在实际的应用中，为保证该模式的前提条件，一般</span>XOR-join<span style="font-family: 宋体;">节点与</span>XOR-split<span style="font-family: 宋体;">节点成对使用。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">和</span>AND-join<span style="font-family: 宋体;">节点一样，因为不需要任何条件判断，所以在部分工作流产品里，直接采用任务节点进行分支简单合并，但是需要和</span>AND-join<span style="font-family: 宋体;">做出区别，如下图所示：</span></p>
<div id="n6a7" style="text-align: left;"><img style="width: 564px; height: 387px;" src="http://docs.google.com/File?id=dcszdbfc_66hj93dhfb_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 4-13</p>
<p class="MsoNormal" style="margin-left: 0.5in;">6、<strong><span style="font-family: 宋体;">基本控制模式小结</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">基本控制模式非常简单，实现起来也没有太大的难度。需要注意的是，对于一种模式往往会存在多种实现方式，笔者的建议是：将条件判断的节点独立出来，由其负责条件计算和路径选择，而任务节点则只关注于实际业务的执行，做到职责分离。例如，</span>AND-split<span style="font-family: 宋体;">、</span>AND-join<span style="font-family: 宋体;">、</span>XOR-split<span style="font-family: 宋体;">和</span>XOR-join<span style="font-family: 宋体;">节点都会单独存在。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可以看到：除去</span>AND-split<span style="font-family: 宋体;">和</span>AND-join<span style="font-family: 宋体;">节
点，顺序、排他选择、简单合并模式组合的流程和我们编写程序的逻辑流程图非常的相似，也就是这三种模式能够对程序的逻辑流程图进行建模。于是一件有意思的
事情出现了：有快速开发平台产品使用流程引擎来编排程序逻辑。他们的做法是将细粒度的代码逻辑封装为运算构件，然后再通过流程的可视化编辑器将这些运算构
件粘合起来。这样，传统方式下采用代码实现业务逻辑的过程变成了画流程图的过程。笔者认为这样的实现存在相当大的弊端，相当不合理。首先，编写代码变得复
杂了，明明几十行代码能够实现的逻辑却需要经过编写构件、绘制程序流程图、部署、运行好多步才能实现，编程效率可以想象；其次是代码的执行效率低，程序的
运行需要经过一次流程定义的解释才能执行；然后是这种实现完全牺牲了语言自身的特性，面向过程，很难提供代码级别的单元测试环境，只能提供有限的调试。该
实现实际上是定义了一种简单的流程语言，通过该流程语言来进行功能函数（运算构件）调用的编排。任务编排没有问题，服务编排也没有问题，但是如果编排细粒
度到功能函数，那么就超出了流程引擎的作用域。提升编程效率的最好途径总是语言而不是工具。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/303263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-11-22 22:39 <a href="http://www.blogjava.net/RongHao/archive/2009/11/22/303263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第5章-工作流资源模式之自动开始、可见性、多实例模式</title><link>http://www.blogjava.net/RongHao/archive/2009/11/16/302462.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 16 Nov 2009 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/11/16/302462.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/302462.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/11/16/302462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/302462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/302462.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><strong><span style="font-family: 宋体;">六、自动开始模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在前面的资源模式里，我们讨论了创建模式、推模式和拉模式，它们实际对应着工作项的一个正常生命周期：创建、提供</span>/<span style="font-family: 宋体;">指派、资源选取开始执行。在前面的讨论里，工作项的执行都是由资源驱动的（从工作项待办列表里选取执行），而自动开始模式则提供了一种系统驱动工作项执行的方式，系统直接驱动工作项执行往往表明了该工作项的最高优先级，需要马上开始执行。</span></p>
<div id="fdgw" style="text-align: left;"><img style="width: 648px; height: 400.552px;" src="http://docs.google.com/File?id=dcszdbfc_45gjr2fkfh_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-42</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-42<span style="font-family: 宋体;">所示，自动开始模式对应着红线标识着的工作项的状态变迁，共有</span>4<span style="font-family: 宋体;">种模式：创建即执行、指派即执行、成堆执行和链式执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>1</strong><strong><span style="font-family: 宋体;">、创建即开始执行（</span>WRP_36:
Commencement on Creation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够在工作项一创建完毕就开始执行。</span></p>
<div id="xwkd" style="text-align: left;"><img style="width: 622px; height: 438px;" src="http://docs.google.com/File?id=dcszdbfc_46fggptzd5_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-43</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-43<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">工作项一创建就插入员工甲的办理列表，需要员工甲马上开始执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式应用在关键的优先级高的任务里，通过系统推送，强制资源优先执行该任务，省去任务的等待时间。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式的实现实际是系统同时完成了工作项的创建和推送，系统需要确定具体的执行人，工作项不会分配给角色、岗位等资源组以提供给相应资源进行选择。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>2</strong><strong><span style="font-family: 宋体;">、指派即开始执行（</span>WRP_37:
Commencement on Allocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够在工作项一指派完毕就开始执行。</span></p>
<div id="rjls" style="text-align: left;"><img style="width: 627px; height: 390px;" src="http://docs.google.com/File?id=dcszdbfc_47c26t78f9_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-44</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-44<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">工作项一旦被员工甲从可拾取列表拾取就马上插入员工甲的办理列表，需要员工甲马上开始执行。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式跳过了工作项的指派状态，实际是对创
建即开始执行模式的扩展，在创建即开始执行模式里，工作项必须预先确定明确的执行人，不能分配给角色、岗位等资源组，而在该模式里除了支持创建即开始执行
模式里的情况，同时也提供了对这种情况的支持，工作项可以提供给多个资源拾取，一旦一个资源拾取则必须马上开始执行（从这个角度看，该模式与资源驱动执行</span>-<span style="font-family: 宋体;">提供工作项模式是相同的）。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>3</strong><strong><span style="font-family: 宋体;">、成堆执行（</span>WRP_38:
Piled Execution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够成堆执行相同任务的不同工作项。</span></p>
<div id="t7:d" style="text-align: left;"><img style="width: 648px; height: 392px;" src="http://docs.google.com/File?id=dcszdbfc_48vd9kvngr_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-45</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-45<span style="font-family: 宋体;">所示，员工甲有多个任务</span>A<span style="font-family: 宋体;">的工作项需要执行，这些注意的是，这些工作项并不是由一个任务实例所产生的，它们属于不同的流程实例，是由多个流程实例里的任务</span>A<span style="font-family: 宋体;">生成的。一旦员工甲开始任务</span>A<span style="font-family: 宋体;">工作项的执行，那么他将执行所有任务</span>A<span style="font-family: 宋体;">的工作项，即将任务</span>A<span style="font-family: 宋体;">相关的工作项全部打包执行。这一功能由系统驱动，系统将与任务</span>A<span style="font-family: 宋体;">相关的工作项依次推送至资源的办理列表。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">开发人员甲熟悉持续集成工具，此时同时有多个软件开发项目需要搭建持续集成环境。一旦他为某个项目组搭建了持续集成环境，那么处于执行效率的考虑，最好的方式无疑是他一鼓作气将所有的持续集成环境都搭建完毕。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">相同</span>/<span style="font-family: 宋体;">相似的工作交由同一资源一并执行，这些工作具有完全或大部分相似的执行上下文（相同的知识、能力要求），从这个角度能够达到最高的工作效率。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">系统需要在进行工作项状态变迁操作时提供相应的钩子，以进行相应的回调操作。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>4</strong><strong><span style="font-family: 宋体;">、链式执行（</span>WRP_39:
Chained Execution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在一个流程实例里，当前一个任务的工作项执行完毕后，能够自动开始执行下一个任务的工作项。</span></p>
<div id="h.7u" style="text-align: left;"><img style="width: 648px; height: 391.153px;" src="http://docs.google.com/File?id=dcszdbfc_49ck6gwmfw_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-46</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-46<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">是两个连贯的任务，它们都分配给员工甲执行，当员工甲执行完毕任务</span>A<span style="font-family: 宋体;">的工作项后，任务</span>B<span style="font-family: 宋体;">生成的工作项将马上被系统发送至员工甲的办理列表，员工甲需要马上办理。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式实际是将资源胶黏在一个流程实例上，同样是出于执行效率的考虑（两个任务位于同一流程实例里，具有相同的执行上下文）。该模式的应用具有前提条件：流程定义时，连续的任务由相同的资源进行处理。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">七、可见性模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可见性模式讨论各种不同资源对工作项的可见
性，不同的资源由于角色、权限的不同，对工作项拥有不同的可见范围。由于涉及到权限，那么根据不同的组织机构设置，必然会出现不同的工作项权限分配，这里
不讨论具体的工作项权限分配，仅从工作项的状态来讨论这些工作项区分可见性的必要性。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可见性模式包括</span>2<span style="font-family: 宋体;">种：未指派状态工作项的可见性和指派状态工作项的可见性。实际上，工作项处于执行状态或完成状态也存在不同的可见性。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>1</strong><strong><span style="font-family: 宋体;">、可配置的未指派工作项的可见性（</span>WRP_40:
Configurable Unallocated Work Item Visibility</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">能够配置未指派工作项的可见性。</span></p>
<div id="ukxc" style="text-align: left;"><img style="width: 648px; height: 378.774px;" src="http://docs.google.com/File?id=dcszdbfc_50fxrzvfcq_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-47</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-47<span style="font-family: 宋体;">所示，可拾取列表里存在</span>3<span style="font-family: 宋体;">个工作项：任务</span>A<span style="font-family: 宋体;">工作项、任务</span>B<span style="font-family: 宋体;">工作项和任务</span>C<span style="font-family: 宋体;">工作项。员工甲可拾取的工作项包括：任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">工作项；员工乙可拾取的工作项包括：任务</span>B<span style="font-family: 宋体;">和任务</span>C<span style="font-family: 宋体;">工作项，那么由此产生的可见性是：员工甲只能看到任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">工作项，而员工乙则只能看到任务</span>B<span style="font-family: 宋体;">和任务</span>C<span style="font-family: 宋体;">工作项。而作为员工甲和员工乙的部门经理，他需要了解每个属下的工作情况，所以他可以看见所有甲乙可见的工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">随着企业规模的发展，几乎所有企业的组织模
型都会形成金字塔型的结构，一方面是出于分工的需要，另一方面则是出于管理的需要，每一层级的人员都需要对上一级负责，同时管理下一层级的人员。处于管理
的需要，管理者必然需要了解下属的工作情况，这样权限就自然产生了，具体到工作流的任务里，管理者需要对其所管理下属的工作具有可见性。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">其实不仅仅是对于工作项，对于流程实例本身
也具有可见性的分配。对流程负责的人必然具备最大的可见性和权限，流程根据任务分解，如果仅仅只对某一任务负责，那么则只对该任务具有可见性，而如果需要
对多个任务负责，那么就需要对多个任务具有可见性，最直接的负责人就是具体执行该任务的人员，但是引入管理的层级后，职责的承担也会形成层级的关系，从上
至下层层承担，此时担负最大职责的人员往往不再是具体的工作执行人员，而是相应的管理人员。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在前面所描述的情况里，支持员工甲乙的可见性是比较简单的，因为每条工作项记录都携带有参与者信息，但是部门经理显然不在这些参与者信息里，所以需要引入与组织权限模型相匹配的工作项查询机制，即不同于工作项列表的查询列表。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>2</strong><strong><span style="font-family: 宋体;">、可配置的指派工作项的可见性（</span>WRP_41:
Configurable Allocated Work Item Visibility</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">能够配置已指派工作项的可见性。</span></p>
<div id="cf8o" style="text-align: left;"><img style="width: 648px; height: 369.053px;" src="http://docs.google.com/File?id=dcszdbfc_517khz8pch_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-48</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-48<span style="font-family: 宋体;">所示，待办列表里存在</span>3<span style="font-family: 宋体;">个工作项：任务</span>A<span style="font-family: 宋体;">工作项、任务</span>B<span style="font-family: 宋体;">工作项和任务</span>C<span style="font-family: 宋体;">工作项。指派给员工甲的工作项包括：任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">工作项；指派给员工乙的工作项包括：任务</span>C<span style="font-family: 宋体;">工作项，那么由此产生的可见性是：员工甲只能看到任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">工作项，而员工乙则只能看到任务</span>C<span style="font-family: 宋体;">工作项。而作为员工甲和员工乙的部门经理，他需要了解每个属下的工作情况，所以他可以看见所有甲乙可见的工作项。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">八、多资源模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">到目前为止，我们讨论的工作项都是与某一特定资源一一对应的，即一个工作项只能由一个单一资源执行，或者严格来说，一个工作项在任何时间段都只能由一个单一资源执行（考虑到工作移交的情况）；同时，一个资源在任何一个时间段都只能处理一个工作项。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">多资源模式将会讨论两种不同的情况：一个资源同时执行多个工作项、多个资源执行同一个工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>1</strong><strong><span style="font-family: 宋体;">、同时执行（</span>WRP_42:
Simultaneous Execution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够同时执行多个工作项。</span></p>
<div id="dl2z" style="text-align: left;"><img style="width: 579px; height: 382px;" src="http://docs.google.com/File?id=dcszdbfc_52hrtpvgcz_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-49</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-49<span style="font-family: 宋体;">所示，员工甲的办理列表里有三个工作项，他能够同时执行这三个工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">和计算机一样，虽然在任何时刻都只能处理一项工作，但是通过将多项工作切分成多个线程交替执行，从某个时间段看，人能够同时处理多项工作。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">人能够选取相关联的多个工作，同时开始执行，在执行的过程中，合理安排这些工作的执行时机和顺序。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">几乎所有的工作流系统都不会约束人员往自己的办理列表里增加多个工作项。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>2</strong><strong><span style="font-family: 宋体;">、增加资源执行（</span>WRP_43:
Additional Resources</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够要求增加资源来处理他正在执行的工作项。</span></p>
<div id="tlxa" style="text-align: left;"><img style="width: 540px; height: 344px;" src="http://docs.google.com/File?id=dcszdbfc_53fzf46xc7_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-50</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-50<span style="font-family: 宋体;">所示，员工甲和员工乙同时处理一个工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在一些复杂的场景里，一项工作往往需要多个资源共同协作完成。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">典型的在一个会签任务里，一个发文需要多人签字通过，同时在会签过程中，经常出现动态加签的情况：需要新的人员加入进行签字。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在敏捷开发里，所有的开发工作都是由两个开发人员共同结对完成。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">工作项作为工作流系统里最小的工作单元，如果将其分配给多个资源，无疑会增加编程模型的复杂度。最常见的实现方式是增加工作项，一个任务节点对应多个工作项，对于需要增加资源的情况，增加工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">九、小结</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在本章里，我们讨论了工作流的</span>43<span style="font-family: 宋体;">种资源模式，这些模式分为</span>7<span style="font-family: 宋体;">类，分别是创建模式、推模式、拉模式、折回模式、自动开始模式、可见性模式和多资源模式。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">创建模式在系统创建工作项时生效，其位于工作项生命周期的创建阶段，创建模式作为流程模型的构成部分在流程设计期指定，通常在任务节点的定义里进行定义，与一个任务关联，其用来限定可执行该任务的资源范围。系统根据创建模式限定的资源范围生成工作项。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">接下来，系统需要将工作项推送给相关的资源进行执行，这个推送的过程即是推模式所包含的内容。工作流系统通过工作项管理器即不同类型的工作项列表与用户进行交互，这里的推送可以理解为系统将生成的工作项推送至相应资源的工作项列表里。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">推模式的主语是系统，由系统将工作项推送至资源的工作项列表，那么，接下来的主动权交由单个资源本身，由其拉动工作项的执行，这是拉模式所包含的内容。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际工作中，工作的执行状态不可能总是与预想相符的，总会出现各种各样的情况，例如重新分配、重做、挂起等等。折回模式对应着这些情况，折回代表着工作项状态的反复、回退。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">自动开始模式提供了一种系统驱动工作项执行的方式，系统直接驱动工作项执行往往表明了该工作项的高优先级，需要马上开始执行。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可见性模式讨论各种不同资源对工作项的可见性，工作项自身作为资源与权限相关。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">多资源模式讨论一个资源执行多个工作项和多个资源执行同一个工作项的情况。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">从这些模式的讨论可以看出，这些模式更多关
注的是对实际业务执行的场景描述，关注通过合理分配任务和调配工作的执行为组织带来最大的执行效率。从另一个角度看，由于这些模式都以业务作为出发点，这
给工作流系统的实现带来了复杂性，很多模式当前的工作流系统都无法完全支持或直接支持。在很多情况下，模式的支持需要很多的约束，而这种约束往往需要在工
作流实施阶段结合客户具体情况进行限定，这实际强调了工作流实施的重要性，工作流系统的应用是由工作流产品加实施两部分组成，很多时候，实施占据了更大的
比重，这就对工作流产品的可扩展性提出了要求。应用工作流不仅仅是选择工作流产品，更重要的还包括选择合适的实施团队。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在下一章里，我们将讨论另外一种工作流模式</span>-<span style="font-family: 宋体;">数据模式。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/302462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-11-16 09:26 <a href="http://www.blogjava.net/RongHao/archive/2009/11/16/302462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五章-工作流之资源模式（折回模式）</title><link>http://www.blogjava.net/RongHao/archive/2009/11/08/301635.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 08 Nov 2009 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/11/08/301635.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/301635.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/11/08/301635.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/301635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/301635.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><strong><span style="font-family: 宋体;">五、折回模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际工作中，工作的执行状态不可能总是与预想相符的，总会出现各种各样的情况，例如原本分配给员工甲的任务由于甲要请假不得不重新分配，由于新的紧急任务员工乙当前的工作需要挂起一段时间等等。折回模式则刚好对应着这些情况，折回代表着工作项状态的反复、回退。</span></p>
<div id="q:7p" style="text-align: left;"><img style="width: 648px; height: 416.75px;" src="http://docs.google.com/File?id=dcszdbfc_36cj8dk8r8_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-33</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-33<span style="font-family: 宋体;">所示，折回模式对应着红线标识着的工作项的状态变迁。这些状态变迁对应着以下情况：</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">委派</span></strong><span style="font-family: 宋体;">：资源将先前指派给他的工作项委派给他人执行。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">系统重新分配</span></strong><span style="font-family: 宋体;">：系统将没有完成的工作项重新提供或指派给其他资源执行。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">退回指派</span></strong><span style="font-family: 宋体;">：资源撤销指派给他的工作项，工作项可以重新指派给其他资源。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">工作移交</span></strong><span style="font-family: 宋体;">：资源将其已经开始执行的工作项移交给他人执行。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">挂起</span>/</strong><strong><span style="font-family: 宋体;">恢复执行</span></strong><span style="font-family: 宋体;">：资源临时挂起当前执行的工作项，并在某一个时候重新恢复执行该工作项。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">跳过</span></strong><span style="font-family: 宋体;">：资源选择跳过指派给他的工作项的执行，不执行该工作项。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">重做</span></strong><span style="font-family: 宋体;">：资源重新执行先前已经完成的工作项。</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">提前执行</span></strong><span style="font-family: 宋体;">：资源在流程实际触发该工作前已经开始执行该工作。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">折回模式共有</span>9<span style="font-family: 宋体;">种。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>1</strong><strong><span style="font-family: 宋体;">、委派（</span>WRP_27:
Delegation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够将先前指派给他的工作项指派给另外的资源执行。</span></p>
<div id="kbs_" style="text-align: left;"><img style="width: 648px; height: 387.455px;" src="http://docs.google.com/File?id=dcszdbfc_37c9v4gdd5_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-34</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-34<span style="font-family: 宋体;">所示，委派对应于红线标识着的工作项状态变迁。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">委派在平常工作中非常常见，例如员工甲将要请假，他将他要完成的工作委派给同事乙执行；在协同办公里，领导将相关工作委派给下属执行等等。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际应用中，委派按照粒度分为了两种：一种
是工作项的委派，这是一种细粒度的委派，指单一任务实例的委派，与某一特定的任务实例关联；另一种是业务的委派，这是一种粗粒度的委派，例如，员工甲将其
负责的某类业务的工作全部委派给员工乙，这意味着属于这类业务的所有工作都将由员工乙执行。业务的委派通常与权限紧密关联，实际实现时为避免用户权限的混
淆，一般采取分开登录系统的方式进行实现，即员工乙如果想处理员工甲委派给其的工作，则需要用员工甲的账号和其给定的密码重新登录系统，并注销掉自己账号
的使用。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">需要注意的一点是：委派意味着原先指派的资源还必须对该工作负责，例如员工甲将某项工作委派给员工乙执行，尽管员工乙实际执行了该工作，但该工作仍然必须由员工甲负责。所以在实现中，员工甲必须能够保持对委派工作项的追踪和控制。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>2</strong><strong><span style="font-family: 宋体;">、系统重新分配（</span>WRP_28:
Escalation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">系统能够重新分配已经分配的工作项，以加快工作项的执行。</span></p>
<div id="qfl4" style="text-align: left;"><img style="width: 648px; height: 415.556px;" src="http://docs.google.com/File?id=dcszdbfc_38fz6k3sfn_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-35</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-35<span style="font-family: 宋体;">所示，工作项原先提供或指派给了一个或多个资源执行，现在由于各种原因，需要优化该工作项的执行，所以将该工作项收回重新分配，提供或指派给其他的资源。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">工作分配的优化。很多时候，计划跟不上变
化，工作也是这样，分配工作前有许多的考虑因素，例如个人能力、工作经验、技能要求等等，但在实际工作中往往会发现原先的人力分配并不合理，或者有些人承
担了太多的职责，或者有人能力超出其目前担承的职责等等（在敏捷软件开发里，我们通过频繁的交换结对编程以达到部分的平衡），在这种时候就需要对工作进行
灵活的重新分配以到达最高的执行效率。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际实现中非常受限，对流程的优化始终是一
个对人的命题，而不是对机器对工具的命题，工具所能做到的只是尽可能多的提供可供参考的数据模型，例如各种报表、数据分析等等，最后做出决策的还是人。所
以该模式的实现也以提供给流程管理员重新分配工作项的能力为主，同时提供工作项超时的提示为辅。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>3</strong><strong><span style="font-family: 宋体;">、退回指派（</span>WRP_29:
Deallocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源撤销指派给他的工作项，工作项可以重新分配给其他资源。</span></p>
<div id="o18v" style="text-align: left;"><img style="width: 648px; height: 379.862px;" src="http://docs.google.com/File?id=dcszdbfc_39dzcfzdfk_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-36</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-36<span style="font-family: 宋体;">所示，资源能够退回原先指派给他的工作项，该工作项可以交由系统重新分配给其他资源。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">同样是工作分配的优化，只不过该模式由资源驱动。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际工作中，由于各种原因，例如经验不足、当前承担职责过多等等，发现自己并不能很好完成当前的任务时，可以提出不执行该任务。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实现的难点在于资源退回工作项后的重新分配，即如何重新分配该工作项。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">与提供给多个资源模式对应，该模式的最简单支持是退回重新提供给多个资源。例如工作项分配给开发人员这一角色执行，开发人员甲拾取了该工作项（故事卡），经过一番痛苦和彷徨，最终将该工作项退回，这样所有开发人员又都能拾取该工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>4</strong><strong><span style="font-family: 宋体;">、有状态工作移交（</span>WRP_30:
Stateful Reallocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源将正在执行的工作项移交给其他资源执行，该工作的状态将得到保存。</span></p>
<div id="teiv" style="text-align: left;"><img style="width: 648px; height: 376.608px;" src="http://docs.google.com/File?id=dcszdbfc_4078qpt9ht_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-37</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-37<span style="font-family: 宋体;">所示，资源将已开始执行的工作移交给其他资源执行。该模式与委派模式很相似，差别就在于委派模式是将未开始执行的工作进行重新指派执行，而该模式则是将已开始执行的工作进行重新指派执行。委派模式中的委派者仍需要为委派出去的工作负责，而移交则同时意味着责任的移交。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">工作移交非常常见，最常见的原因包括位置调动、离职、休假等等。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在大多数的工作流系统实现里，业务数据与流程数据是相互隔离的，仅仅通过某一字段进行关联（例如业务主键），流程的目标是携带业务数据进行流转。在这种情况下，该模式的实现变成了默认实现，系统不需要做任何回退或清理操作，直接做工作项的转发即可。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>5</strong><strong><span style="font-family: 宋体;">、无状态工作移交（</span>WRP_31:
Stateless Reallocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源将正在执行的工作项移交给其他资源执行，该工作的状态不会得到保存。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">与有状态工作移交对应。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">工作的无状态移交通常意味着工作的重新执行，并且原有的工作对重启的工作而言没有太大的价值。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">与有状态工作移交相比，该模式需要处理相应业务数据的回退或清理。直接支持该模式比较困难，需要在实施时根据情况对该任务节点操作业务数据的权限进行限定，并在限定的基础上进行记录和回退。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>6</strong><strong><span style="font-family: 宋体;">、挂起</span>/</strong><strong><span style="font-family: 宋体;">恢复执行（</span>WRP_32:
Suspension/Resumption</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够挂起当前执行的工作项，并在某一个时候重新恢复执行该工作项。</span></p>
<div id="w2d1" style="text-align: left;"><img style="width: 648px; height: 367.397px;" src="http://docs.google.com/File?id=dcszdbfc_416szkp3fr_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-38</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源对分配给其的工作进行优化执行，能够根据自己和当前的实际情况合理的安排工作执行，挂起正在执行的工作，执行当前最重要或效率最高的工作，然后再返回执行该工作。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">基本的状态变迁。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>7</strong><strong><span style="font-family: 宋体;">、跳过（</span>WRP_33:
Skip</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够选择跳过指派给他的工作项的执行，不执行该工作项，并将该工作项标识为完成。</span></p>
<div id="f88l" style="text-align: left;"><img style="width: 648px; height: 381.525px;" src="http://docs.google.com/File?id=dcszdbfc_42fdg8nwcv_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-39</p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际工作中，对于非关键工作，可以选择跳过，以便进行后续更为紧急或重要的工作。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">对于实现工作项本身的状态变迁来说，支持该模式非常简单，问题在于业务数据的依赖关系，如果后续工作的处理依赖于该节点处理后的业务数据，那么简单的选择跳过该工作项的执行就会产生问题。所以一个好的做法是给一些关键任务节点加上约束，不允许执行跳过操作。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>8</strong><strong><span style="font-family: 宋体;">、重做（</span>WRP_34:
Redo</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够对先前完成的工作项重新处理，同时，该工作的后续工作项（后续任务所对应的工作项）也将被重新处理。</span></p>
<div id="g7:r" style="text-align: left;"><img style="width: 648px; height: 390.632px;" src="http://docs.google.com/File?id=dcszdbfc_43qjt9gtg5_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-40</p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">对已完成的工作进行重新处理并不少见，但该
模式最为重要的部分还是在于要求所有后续工作的重新处理。所以该模式一般应用在极其重要的关键任务节点，例如非常重要的决策节点，因为后续的任务严重依赖
于该节点所作出的决策（所产生的数据），一旦决策发生变化，那么相应的后续工作必须都要做出变化。这也是业务敏捷性的一种反映。同时需要注意，该模式也是
一种代价高昂的应用，因为这往往意味着该业务流程实例中的很多工作都需要重新处理，所以如何在业务处理中尽早发现可能的环境变化并及时作出决策的调整并避
免成本高昂的返工才是最为重要的一点。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">现在的软件开发越来越强调于拥抱变化，强调
代码的重构和演进，尽管如此，如果软件的基础架构需要根据当前业务变化发生重大变更，那么这依旧是一件成本高昂的事情，因为一旦基础架构发生变化，那么很
多模块实现将不得不重新编写代码。所以尽管越来越多的开发团队开始引入敏捷的开发方法，但是经验丰富的开发人员才是整个敏捷团队的基石（敏捷开发非常重视
人）。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">从该模式里能够看到资源模式与控制模式的结合，工作项的重做需要后续任务的重新执行，这需要取消当前的执行任务，并将流程实例的控制点重新返回至该工作项所对应的任务。这涉及到两种控制模式，分别是：取消任务模式和任意循环模式（具体可以参考第四章的说明）。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>9</strong><strong><span style="font-family: 宋体;">、提前执行（</span>WRP_35:
Pre-Do</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在工作项实际提供或指派给资源执行之前，资源已经可以执行该工作项。</span></p>
<div id="tjp6" style="text-align: left;"><img style="width: 648px; height: 404.189px;" src="http://docs.google.com/File?id=dcszdbfc_44dqkdvqfm_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-41</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-41<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">还在执行，任务</span>B<span style="font-family: 宋体;">还未激活，但此时员工甲已经可以开始执行任务</span>B<span style="font-family: 宋体;">的工作项。该模式的实现需要一个前提条件：任务</span>B<span style="font-family: 宋体;">不能依赖于任务</span>A<span style="font-family: 宋体;">的执行结果，即不能依赖于前续任务的处理输出。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可以看出，该模式与前面推模式里的提前分配模式非常相似，所不同的是：提前分配强调一种通知机制，强调预先准备；而提前执行则已经可以开始实际的执行工作。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">和提前分配模式不同，该模式实际提供了一种
流程任务执行的灵活机制，在预先定义的业务流程里，任务的执行是具有一定顺序的，可能在大多数情况下，这种顺序是合理的，但是在某些具体的流程实例里，某
些串行执行的任务节点可以并行的执行以达到最好的执行效率和负载均衡，在这种情况下，就可以应用该模式并行执行部分任务。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">需要注意的是，该模式仅仅引入了一种实际执行任务的灵活性，是对业务流程定义固化的补偿，如果在一个业务流程中频繁应用到该模式，则往往意味着流程定义本身需要作出调整。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/301635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-11-08 21:08 <a href="http://www.blogjava.net/RongHao/archive/2009/11/08/301635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 第五章-工作流之资源模式（拉模式）</title><link>http://www.blogjava.net/RongHao/archive/2009/11/01/300599.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 01 Nov 2009 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/11/01/300599.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/300599.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/11/01/300599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/300599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/300599.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><a href="http://www.opug.org.cn/blog">本书全文连载地址</a><br />
<strong><span style="font-family: 宋体;">四、拉模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">与推模式相比，拉模式的区别在于动作的主语发生了变化：推模式的主语是系统，由系统将工作项推送至资源的工作项列表，那么，接下来的主动权交由单个资源本身，由其拉动工作项的执行。</span></p>
<div id="ovpi" style="text-align: left;"><img style="width: 648px; height: 365.833px;" src="http://docs.google.com/File?id=dcszdbfc_30f749rrhg_b" alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-28</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-17<span style="font-family: 宋体;">所示，拉模式对应着工作项的五种状态变迁：</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">由提供给一个资源拾取到指派给一个资源负责执行</span></strong><span style="font-family: 宋体;">，这意味着该资源拾取了该工作项，其将负责该工作项的执行，并将在未来的某个时候执行该工作项；</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">由提供给多个资源拾取到指派给一个资源负责执行</span></strong><span style="font-family: 宋体;">，这意味着多个资源中的一个资源拾取了该工作项，其将负责该工作项的执行，并将在未来的某个时候执行该工作项，余下的资源将不再有机会执行该工作项；</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">由提供给一个资源拾取到开始执行</span></strong><span style="font-family: 宋体;">，这意味着该资源拾取了该工作项，其将负责该工作项的执行，并立即开始执行该工作项；</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">由指派给一个资源负责执行到开始执行</span></strong><span style="font-family: 宋体;">，这意味着该资源开始执行该工作项；</span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">由提供给多个资源拾取到开始执行</span></strong><span style="font-family: 宋体;">，这意味着多个资源中的一个资源拾取了该工作项，其将负责该工作项的执行，并立即开始执行该工作项，余下的资源将不再有机会执行该工作项；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">拉模式共有</span>6<span style="font-family: 宋体;">种，分为两组：前三种模式关注工作项的状态变迁；后三种模式关注工作项显示在资源工作项列表里的顺序以及选择执行的方式。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>1</strong><span style="font-family: 宋体;">、<strong>资源驱动指派（</strong></span><strong>WRP_21: Resource-Initiated Allocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够将工作项指派给自己，负责该工作项的执行，但是不必马上开始执行该工作项。</span></p>
<div id="was4" style="text-align: left;"><img style="width: 648px; height: 355.727px;" src="http://docs.google.com/File?id=dcszdbfc_31g6k8bzds_b" alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-29</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-29<span style="font-family: 宋体;">所示，员工甲拾取了可拾取列表里的任务</span>A<span style="font-family: 宋体;">工作项，该工作项由可拾取列表移至待办列表。可拾取列表通常是一个共享的列表，而待办列表则是某一资源的专属列表。资源拾取工作项，意味着工作项从共享状态进入到专属状态。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式实际对应着工作项的两种状态变迁：由提供给一个资源拾取到指派给一个资源负责执行；由提供给多个资源拾取到指派给一个资源负责执行。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式符合大多数的工作场景，我选择负责执行该工作，但我并不马上开始，我可能还有其他的工作需要处理，等到处理完毕后才处理该工作。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">分配给角色、部门等资源组的工作项通常都以共享的形式分配给所有的组内成员，一旦有人拾取即进入他的专属待办列表，其他人不再可见。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>2</strong><span style="font-family: 宋体;">、<strong>资源驱动执行</strong></span><strong>-</strong><strong><span style="font-family: 宋体;">指派工作项（</span>WRP_22: Resource-Initiated
Execution &#8211; Allocated Work Item</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够开始执行指派给其的工作项。</span></p>
<div id="skso" style="text-align: left;"><img style="width: 648px; height: 355.451px;" src="http://docs.google.com/File?id=dcszdbfc_32g9fjrrfq_b" alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-30</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-30<span style="font-family: 宋体;">所示，员工甲开始执行任务</span>A<span style="font-family: 宋体;">工作项，该工作项由待办列表移至办理列表。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式对应着工作项的一种状态变迁：由指派给一个资源负责执行到开始执行。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">最基本的工作项状态变迁，所有的工作流系统都提供支持。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>3</strong><strong><span style="font-family: 宋体;">、资源驱动执行</span>-</strong><strong><span style="font-family: 宋体;">提供工作项（</span>WRP_23:
Resource-Initiated Execution &#8211; Offered Work Item</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够选取提供给其的一个工作项，并马上开始执行该工作项。</span></p>
<div id="zoik" style="text-align: left;"><img style="width: 631px; height: 378px;" src="http://docs.google.com/File?id=dcszdbfc_33dpf4k6ff_b" alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-31</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-29<span style="font-family: 宋体;">所示，员工甲拾取了可拾取列表里的任务</span>A<span style="font-family: 宋体;">工作项并立刻开始执行，该工作项由可拾取列表移至办理列表。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式对应着工作项的两种状态变迁：由提供给一个资源拾取到开始执行；由提供给多个资源拾取到开始执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">与描述略有不同，实际应用该模式是强制要求资源一旦拾取了共享的工作项就必须马上开始执行，基于两点的考虑：一是工作项能够尽快执行；二是工作项能够指派给当前最为空闲的资源，不会出现该工作项被一繁忙资源卡住，造成等待和阻塞。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在敏捷开发里，我们使用故事卡管理项目的开
发，故事卡足够小（如果大的故事卡则分解为多个任务），每天早上由开发人员挑选移动该卡，一旦该卡由可开发状态移动至开发状态，则必须进行该卡的开发工
作，这样项目的真实进展随时得到显示，同时不允许一个开发人员同时进行多张卡的开发。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">通过这三个模式我们可以发现，工作流系统实现这些模式只是在不同的工作项列表里移动这些工作项，以反映工作项不同的状态和变迁策略，这对于</span>IT<span style="font-family: 宋体;">系
统而言这不是很困难，困难在于如何能保证人确实是这么做的，例如说一旦拾取就必须开始执行，工作项的跳转很简单，但无法保证的是拾取该工作项的人一定会按
照要求马上开始执行该工作项，也就是说业务流程项目的实施不仅仅包含技术实施，也包含了一套与之相应的管理实施。那种期望上一套流程系统就能马上提高生产
效率和管理水平显然是不现实的，其中一定包含管理方式的变化和组织机构的变化。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">敏捷开发中，早上的站立会议是重要的部分，每个团队成员都会汇报昨天的进展和今天将要进行的工作，这样就保证了工作执行的有效性。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>4</strong><strong><span style="font-family: 宋体;">、系统决定工作队列内容（</span>WRP_24:
System-Determined Work Queue Content</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">工作流系统能够排定资源工作项列表里的工作项顺序和内容。</span></p>
<div id="orr8" style="text-align: left;"><img style="width: 636px; height: 363px;" src="http://docs.google.com/File?id=dcszdbfc_34dnj6tsgn_b" alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-32</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-32<span style="font-family: 宋体;">所示，员工甲共享的可拾取列表默认按时间排序工作项。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际应用中工作项的排序条件非常多，其目的就是将最重要或优先级最高的工作项排在最前面，引起资源的注意或优先执行。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际实现时有多种排序策略，通常会有时间排序，例如先进先出、先进后出等，同时也有很多其他的排序元素，例如工作项的预定完成时间、执行该工作项的成本预算、工作项的优先级或重要程度等，系统查询工作项时根据这些影响因素进行默认排序。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>5</strong><strong><span style="font-family: 宋体;">、资源决定工作队列内容（</span>WRP_24:
Resource-Determined Work Queue Content</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够排定其工作项列表里的工作项顺序和内容。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">为资源提供一定程度上排定工作项的灵活性。每个人关注的视角和侧重点不同，就会产生不同的排序和内容过滤。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">例如，作为老板，我可能更为关注各个工作的成本预算，我需要按成本排定各项工作；而作为秘书，我更为关注老板下发各项工作的重要程度，我需要按老板指定的重要程度排定工作。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">提供工作项列表的客户端排序，一般情况下列表显示系统给定的顺序，用户可以在客户端进行二次排序，典型的</span>Web<span style="font-family: 宋体;">系统中，工作流系统提供</span>JavaScript<span style="font-family: 宋体;">的表格控件，利用</span>Ajax<span style="font-family: 宋体;">异步请求重新排序或进行工作项的过滤。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong>6</strong><strong><span style="font-family: 宋体;">、自主选择（</span>WRP_26:
Selection Autonomy</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">资源能够根据自己个人的情况选择执行工作项。</span></p>
<div id="z9n1" style="text-align: left;"><img style="width: 596px; height: 327px;" src="http://docs.google.com/File?id=dcszdbfc_35c5xpdfcs_b" alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-32</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-32<span style="font-family: 宋体;">所示，员工甲能够根据自己的情况选择执行任务</span>A<span style="font-family: 宋体;">、</span>B<span style="font-family: 宋体;">、</span>C<span style="font-family: 宋体;">中任意一个工作项。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">尽管老板要求先实现功能最后再重构，但是我认为当前代码如果不进行一定重构会严重影响后续的开发效率，所以我决定先进行部分重构。</span></p>
<p class="MsoNormal"><strong>&nbsp;</strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">几乎所有工作流系统都不会对用户实际选择执行工作项的方式进行限制，也没有办法限制。但是系统一般会把重要的工作项加以高亮显示，让用户优先选择。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/300599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-11-01 20:48 <a href="http://www.blogjava.net/RongHao/archive/2009/11/01/300599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五章-工作流资源模式（推模式）</title><link>http://www.blogjava.net/RongHao/archive/2009/10/25/299691.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 25 Oct 2009 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/10/25/299691.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/299691.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/10/25/299691.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/299691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/299691.html</trackback:ping><description><![CDATA[<p><strong><span style="font-family: 宋体;">三、推模式</span></strong></p>
<p><span style="font-family: 宋体;">在创建阶段，系统根据不同的创建模式为任务
节点产生了一个或多个工作项，每个工作项或分配给单个资源或分配给角色、部门等。那么接下来，系统就需要将这些工作项推送给相关的资源进行执行，这个推送
的过程即是推模式所包含的内容。需要注意的是，推模式讨论的是对单个工作项的推送。</span></p>
<p><span style="font-family: 宋体;">在前面我们已经了解到，工作流系统通过工作项管理器即不同类型的工作项列表与用户进行交互，这里的推送也可以理解为系统将生成的工作项推送至相应资源的工作项列表里。</span></p>
<div id="glrp" style="text-align: left;"><img style="width: 648px; height: 377.588px;" src="http://docs.google.com/File?id=dcszdbfc_19hgrjngdz_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-17</p>
<p><span style="font-family: 宋体;">如图</span>5-17<span style="font-family: 宋体;">所示，推模式对应着工作项到三种状态的变迁：提供给一个资源拾取执行；提供给多个资源拾取执行（这些资源中只会有一个会实际执行，属于竞争关系）；指派给一个资源负责执行。</span></p>
<p><span style="font-family: 宋体;">推模式共有</span>9<span style="font-family: 宋体;">种，分为</span>3<span style="font-family: 宋体;">组，
第一组包括提供给单个资源、提供给多个资源和指派给单个资源，讨论工作项推送的最终分配状态；第二组包括随机指派、循环指派和最短队列指派，关注当工作项
分配给角色、部门等包含多个资源的资源组时，如何从中确定最终的一个资源并进行指派；第三组包括提前分配、即时分配和推后分配，关注将工作项推送给用户的
时间。</span></p>
<p><strong>1</strong><strong><span style="font-family: 宋体;">、提供给单个资源（</span>WRP_12:
Distribution by Offer - Single Resource</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">能够在非绑定的基础上将工作项推送给单个资源。</span></p>
<div id="ha:2" style="text-align: left;"><img style="width: 648px; height: 392.083px;" src="http://docs.google.com/File?id=dcszdbfc_20jq38zggs_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-18</p>
<p><span style="font-family: 宋体;">如图</span>5-18<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">工
作项被系统推送至员工甲的可拾取列表。这意味着员工甲不必为该工作负责，他可以选择执行该工作也可选择忽略或拒绝。如果他选择拒绝或忽略且工作项超时，那
么会导致系统对该工作项的重新分配。如果他选择执行该工作，那么他首先需要拾取该工作项，这会使该工作项进入他的代办列表，意味着其必须对该工作负责。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">该模式类似于现实工作中的征求意见，先将工作分配给你，然后找你谈话，征求你对该工作的看法，如果合适那么就由你执行，否则再找他人执行。</span></p>
<p><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p><span style="font-family: 宋体;">参与者对工作项的拒绝会导致系统对工作项的
重新分配，这是实现该模式的难点。如何重新分配该工作项，采取何种重新分配策略，这些都具有很大的复杂性。实际上这些工作流模式单个看起来可能比较清晰明
了，但一旦组合起来，例如该模式与创建模式结合起来，那么就有了多种情况变得复杂起来。对于复杂的问题，最好的解决办法就是留给实施阶段，由用户情况作出
使用限定。这也再次强调了工作流实施在工作流应用中的重要性。</span></p>
<p><strong>2</strong><strong><span style="font-family: 宋体;">、提供给多个资源（</span>WRP_13:
Distribution by Offer &#8211; Multiple Resource</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">能够在非绑定的基础上将工作项推送给多个资源。</span></p>
<div id="fxho" style="text-align: left;"><img style="width: 648px; height: 378.568px;" src="http://docs.google.com/File?id=dcszdbfc_21hj2cjqdc_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-19</p>
<p><span style="font-family: 宋体;">如图</span>5-19<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">所
生成的工作项被推送给多个员工的可拾取列表。这些员工不必为该工作负责，他们可以选择执行该工作也可选择忽略或拒绝。如果他们都选择拒绝或忽略且工作项超
时，那么会导致系统对该工作项的重新分配。如果有一名员工选择执行该工作，那么该工作项进入他的代办列表，其他员工将不再具有拾取该工作项的机会。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">该模式是典型的竞争参与，即多人可以完成该工作，先执行者先得。类似于寻找志愿者。</span></p>
<p><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p><span style="font-family: 宋体;">该模式的实现一般是创建阶段将工作项分配给角色、部门等包含多个资源的分组，在推送阶段，将该工作项送至这些组下所有资源共享的可拾取列表里，工作项的实例只有一个，但是多资源可见。</span></p>
<p><strong>3</strong><strong><span style="font-family: 宋体;">、指派给单个资源（</span>WRP_14:
Distribution by Allocation &#8211; Single Resource</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">能够在绑定的基础上将工作项推送给单个资源。</span></p>
<div id="r-3n" style="text-align: left;"><img style="width: 644px; height: 417px;" src="http://docs.google.com/File?id=dcszdbfc_22jwkrrzgs_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-20</p>
<p><span style="font-family: 宋体;">如图</span>5-20<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">工作项被系统推送至员工甲的待办列表。这意味着员工甲必须为该工作负责。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">该模式是应用最多的模式，直接指定任务的负责人。</span></p>
<p><span style="font-family: 宋体;">在采用军事化管理的企业里，上级的命令一定要执行，下属没有商量和拒绝的权利。</span></p>
<p><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p><span style="font-family: 宋体;">相比提供，指派实现非常容易，直接将工作项推送至选定资源的待办列表。</span></p>
<p><strong>4</strong><strong><span style="font-family: 宋体;">、随机指派（</span>WRP_15:
Random Allocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">当存在多个资源可供选择时，从中随机选择一个资源进行工作项的指派。</span></p>
<div id="mwaw" style="text-align: left;"><img style="width: 648px; height: 394.545px;" src="http://docs.google.com/File?id=dcszdbfc_23hd829vgt_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-21</p>
<p><span style="font-family: 宋体;">如图</span>5-21<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">所生成的工作项在创建阶段分配给了开发人员这一角色，在推送阶段，系统会随机选取一名开发人员负责该工作项的执行。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">该模式提供了一种指派资源的非确定性机制。</span></p>
<p><strong>5</strong><strong><span style="font-family: 宋体;">、循环指派（</span>WRP_16:
Round Robin Allocation</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">当存在多个资源可供选择时，循环选择其中一个资源进行工作项的指派。</span></p>
<div id="o3oi" style="text-align: left;"><img style="width: 648px; height: 413.617px;" src="http://docs.google.com/File?id=dcszdbfc_24dcr7gjdb_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-22</p>
<p><span style="font-family: 宋体;">如图</span>5-22<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">所生成的工作项在创建阶段分配给了开发人员这一角色，在推送阶段，系统会循环轮流选取一名开发人员负责该工作项的执行。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">不患贫而患不均，平等的分配工作。</span></p>
<p><strong>6</strong><strong><span style="font-family: 宋体;">、最短队列指派（</span>WRP_17:
Shortest Queue</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">当存在多个资源可供选择时，选择其中一个具有最少待办工作即最短工作队列的资源进行工作项的指派。</span></p>
<div id="j55." style="text-align: left;"><img style="width: 648px; height: 372.145px;" src="http://docs.google.com/File?id=dcszdbfc_25cbhdnwgp_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-23</p>
<p><span style="font-family: 宋体;">如图</span>5-23<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">所生成的工作项在创建阶段分配给了开发人员这一角色，在推送阶段，系统发现员工甲的待办列表里有两条待办工作（任务</span>B<span style="font-family: 宋体;">和任务</span>C<span style="font-family: 宋体;">），员工乙的待办列表里没有待办工作，所以系统将任务</span>A<span style="font-family: 宋体;">工作项指派给员工乙负责该工作项的执行。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">该模式的目的在于能够最快开始工作的执行，找出相比而言最为空闲的资源迅速开始工作。但是实际应用中，仅仅依靠工作的数量来判断资源是否空闲是不可靠的，因为工作和工作之间还存在着难易之分。</span></p>
<p><strong>7</strong><strong><span style="font-family: 宋体;">、提前分配（</span>WRP_18:
Early Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">在工作项实际可以执行之前即将该工作项通知或潜在的分配给资源。</span></p>
<div id="nmbg" style="text-align: left;"><img style="width: 648px; height: 400.775px;" src="http://docs.google.com/File?id=dcszdbfc_26gcx9rrht_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-24</p>
<p><span style="font-family: 宋体;">如图</span>5-24<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">还在执行，任务</span>B<span style="font-family: 宋体;">还未激活，但此时任务</span>B<span style="font-family: 宋体;">的工作项已经提前分配给员工甲，该工作项的主要职责是通知员工甲将由其来完成任务</span>B<span style="font-family: 宋体;">并能开始一部分准备工作，而实际的工作则要等到任务</span>B<span style="font-family: 宋体;">被激活后才能进行。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">该模式强调的是预先计划，即管理的计划性。</span></p>
<p><span style="font-family: 宋体;">在我们实际的项目开始之前，项目经理已经通知我们将要进行的开发工作，让我们提前熟悉相关的技术。这样当项目开始时就能提高最初迭代的开发效率。</span></p>
<p><span style="font-family: 宋体;">从某种意义上说，稍微复杂一点的工作都应该做到提前通知、提前准备，即计划的必要性。</span></p>
<p><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p><span style="font-family: 宋体;">让工作流系统直接支持该模式比较困难，因为该模式嵌套在控制模式和不同的工作项创建模式里，找不出一种通用的模式，无法预判工作项的生成和实际的参与者。在一定范围内，可以采用下面的方式变通：</span></p>
<div id="r9.v" style="text-align: left;"><img style="width: 648px; height: 357.081px;" src="http://docs.google.com/File?id=dcszdbfc_27cnfgsjc4_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-25</p>
<p><span style="font-family: 宋体;">如图</span>5-25<span style="font-family: 宋体;">所示，在自动节点执行时能确定任务</span>B<span style="font-family: 宋体;">的参与者的情况下，可以通过自动节点给员工甲发送邮件或消息进行通知，工作流系统并不生成工作项。</span></p>
<p><strong>8</strong><strong><span style="font-family: 宋体;">、即时分配（</span>WRP_19:
Distribution on Enablement</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">在工作项实际可以执行时将该工作项分配给资源。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">机器执行的工作，重复单一的审批工作，无计划性的工作，如各种突发情况的处理。</span></p>
<p><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p><span style="font-family: 宋体;">大多数工作流系统的标准实现，满足任务执行条件时先激活任务节点，然后创建工作项、分配工作项。</span></p>
<p><strong>9</strong><strong><span style="font-family: 宋体;">、推后分配（</span>WRP_20:
Late Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p><span style="font-family: 宋体;">在工作项实际可以执行后的某个时间才将该工作项分配给资源。</span></p>
<div id="oq9:" style="text-align: left;"><img style="width: 648px; height: 380.834px;" src="http://docs.google.com/File?id=dcszdbfc_28rqkm23fc_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-26</p>
<p><span style="font-family: 宋体;">如图</span>5-26<span style="font-family: 宋体;">所示，任务</span>B<span style="font-family: 宋体;">已经激活且已生成可以执行工作项，但是系统并没有将其分配至员工甲的工作项列表里。这是因为员工甲正在执行任务</span>A<span style="font-family: 宋体;">的工作项，直到其执行任务</span>A<span style="font-family: 宋体;">完毕，系统才会把任务</span>B<span style="font-family: 宋体;">工作项推送至工作项列表。</span></p>
<p><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p><span style="font-family: 宋体;">保证流程和资源对工作的负载处于一种良好的状态，避免出现下图的情况：</span></p>
<div id="o3am" style="text-align: left;"><img style="width: 524px; height: 331px;" src="http://docs.google.com/File?id=dcszdbfc_29dmpfwkfq_b"  alt="" /></div>
<br />
<p style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-27</p>
<p><span style="font-family: 宋体;">在敏捷开发里，我们强调客户合作，整个的开发过程对用户透明，用户知道当前正在进行的开发工作，也清楚开发团队的开发速度，在这种情况下，一旦有新的需求加入，用户会推迟该需求的实现，或者推迟当前其他需求的实现，从而保证整个团队的开发效率。</span></p>
<p><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p><span style="font-family: 宋体;">该模式的实现依赖于推后的策略，即在什么情况下推后分配，满足什么条件下进行分配。具体实现同样采取推后模式，推后到实施阶段实现。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/299691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-10-25 21:46 <a href="http://www.blogjava.net/RongHao/archive/2009/10/25/299691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五章-工作流资源模式（创建模式）</title><link>http://www.blogjava.net/RongHao/archive/2009/10/20/299012.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 20 Oct 2009 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/10/20/299012.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/299012.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/10/20/299012.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/299012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/299012.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><strong><span style="font-family: 宋体;">二、创建模式</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">创建模式在系统创建工作项时生效，如下图所示，其位于工作项生命周期的创建阶段。</span></p>
<div id="u0ht" style="text-align: left;"><img style="width: 648px; height: 386.468px;" src="http://docs.google.com/File?id=dcszdbfc_4gs72bqhr_b"  alt="" /></div>
<br />
<p class="MsoNormal"><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK2"></a><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="OLE_LINK1"></a></p>
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-2</p>
<p class="MsoNormal"><span style="font-family: 宋体;">正如上面提到的，工作流系统在执行任务节点时会为其创建相应的工作项，根据情况工作项可以是一个也可以是多个。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">创建模式作为流程模型的构成部分在流程设计期指定，通常在任务节点的定义里进行定义，与一个任务关联，其用来限定可执行该任务的资源范围。系统根据创建模式限定的资源范围生成工作项，工作项可以直接分配给人，也可以分配给角色、部门、岗位等。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>1</strong><strong><span style="font-family: 宋体;">、直接分配（</span>WRP_01:
Direct Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在设计期直接为任务指定特定的资源，该任务的工作项能够在运行期分配给它。注意，指定的资源可以为多个，如果是多个的话就会生成多个工作项，为每个资源生成一个单独的工作项。该模式实际限制执行该任务的资源范围。</span></p>
<div id="rw1u" style="text-align: left;"><img style="width: 597px; height: 359px;" src="http://docs.google.com/File?id=dcszdbfc_5gbhzr6cz_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-3</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-3<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">在定义时直接指定给员工甲，任务</span>B<span style="font-family: 宋体;">在定义时直接指定给员工乙，当实际执行任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">时，将由员工甲和员工乙分别执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式一般应用于流程里的关键路径。同时，
在中小企业里，该模式是应用最多的分配模式，因为人员少，管理扁平，所以每个人的职责都非常清晰。该模式也是执行效率较高的资源模式，因为人和任务直接绑
定，所以不会产生推诿等情况，便于管理也便于追究责任，因为运行情况完全在设计期确定。而随着企业规模的扩大，管理层次的复杂，一个任务往往需要交由特定
的部门、岗位或角色来执行，这样无形中会影响任务执行的效率。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式的缺点在于一旦关键人物因为各种原因不能及时处理任务，那么将造成整个流程的挂起等待。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">最简单的资源模式，设计期确定资源，运行期工作流引擎不需要做额外的工作。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>2</strong><strong><span style="font-family: 宋体;">、基于角色的分配（</span>WRP_02:
Role-Based Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在设计期为任务指定一个或多个角色，该任务的工作项能够在运行期分配给这些角色。实际执行该任务时，资源将从属于这些角色的资源中产生。该模式实际限制执行该任务的资源范围。</span></p>
<div id="njta" style="text-align: left;"><img style="width: 648px; height: 378.408px;" src="http://docs.google.com/File?id=dcszdbfc_6gqgb4jc7_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-4</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-4<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">在定义时指定给&#8220;开发人员&#8221;这一角色，该角色包括了两名员工甲和乙。实际执行任务</span>A<span style="font-family: 宋体;">时，将由员工甲或乙来执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">企业达到一定规模，就会产生人员的分组，角色是典型的分组方式，将具有相似属性的人员定义为一个特定的角色，这些属性通常与工作的内容相关，例如开发人员、项目经理、总经理等，而角色通常又会与权限产生关联。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">将任务分配给角色意味着将会有多个员工可以执行该任务，执行效率相比直接分配会有下降，这也是企业扩大后管理成本增大的一种表现形式。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">工作流系统内置的组织机构模型需要对角色进行支持。引擎运行期通过角色访问属于该角色的人员。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>3</strong><strong><span style="font-family: 宋体;">、延迟分配（</span>WRP_03:
Deferred Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在设计期为任务指定资源的标识，典型的，在工作流系统里，该标识对应于一个数据字段变量，例如</span>userid<span style="font-family: 宋体;">。即在设计期并不确定资源，资源的确定被延迟至运行期，系统运行期从该数据字段里获取该任务分配的资源。</span></p>
<div id="ros2" style="text-align: left;"><img style="width: 587px; height: 369px;" src="http://docs.google.com/File?id=dcszdbfc_7f2crgrcx_b"  alt="" /></div>
<p><br />
</p>
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-5</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-5<span style="font-family: 宋体;">所示，任务</span>B<span style="font-family: 宋体;">在定义时资源的标识指定为</span>userid<span style="font-family: 宋体;">，实际执行时，任务</span>A<span style="font-family: 宋体;">由员工甲执行，其指定了下一任务的执行者为员工乙即设置了</span>userid<span style="font-family: 宋体;">这一变量为员工乙的</span>id<span style="font-family: 宋体;">，在任务</span>B<span style="font-family: 宋体;">实例创建时，它访问</span>userid<span style="font-family: 宋体;">，发现该变量里是员工乙的</span>id<span style="font-family: 宋体;">，于是将该任务分配给员工乙。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">需要注意的是，根据具体的分配策略，运行期该数据字段不仅可以指定人员，也可以指定角色、部门等。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式给资源的分配引入了灵活性。资源的确定延迟至运行期，即任务可以根据具体的实际情况再确定执行人。具体实施时，这个指定的数据字段可以通过一系列的规则运算得出。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在国内应用中，该模式被大量应用在人工干预流程中，例如下一任务的执行由上一任务的办理者指定。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">一般通过工作流变量来包含资源的</span>id<span style="font-family: 宋体;">。为了区别该</span>id<span style="font-family: 宋体;">是人员</span>id<span style="font-family: 宋体;">还是角色</span>id<span style="font-family: 宋体;">，一般内置特殊变量，例如</span>userid<span style="font-family: 宋体;">、</span>roleid<span style="font-family: 宋体;">、</span>groupid<span style="font-family: 宋体;">等。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>4</strong><strong><span style="font-family: 宋体;">、按权限分配（</span>WRP_04:
Authorization</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">能够指定资源的范围，只有该范围内的资源才具有执行该任务的权限。</span></p>
<div id="n18l" style="text-align: left;">
<div id="g:xf" style="text-align: left;"><img style="width: 597px; height: 399px;" src="http://docs.google.com/File?id=dcszdbfc_8hb2qckhn_b"  alt="" /></div>
<br />
</div>
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-6</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-6<span style="font-family: 宋体;">所示，只有项目经理才有权限对开发人员申请软件的要求进行批准。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">随着分工的细化，每个人工作内容的不同，必然会产生权限的概念。权限实际代表着对同一件事情，每个人执行工作内容的差别。权限越大能执行的操作越多意味着需要负责的方面越多。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式强调通过权限对执行任务的资源加以限定。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在大多数的软件系统中，角色不仅仅代表具有相似属性的一组人员，同时其也是最重要的权限概念，人员往往不与权限直接关联，角色将人员与权限两者进行关联。所以，对任务设定权限可以通过指定角色来完成。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>5</strong><strong><span style="font-family: 宋体;">、职责分离（</span>WRP_05:
Separation of Duties</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在一个流程实例里，能够指定两个任务必须由不同的资源执行。</span></p>
<div id="mph." style="text-align: left;"><img style="width: 617px; height: 437px;" src="http://docs.google.com/File?id=dcszdbfc_9gkhw38fw_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-7</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-7<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">在设计期被指定不能由相同的资源执行，同时它们都指定分配给经理这个角色。那么在运行期，在一个流程实例里，任务</span>A<span style="font-family: 宋体;">被分配给了员工甲执行，那么在进行任务</span>B<span style="font-family: 宋体;">的分配时，尽管员工甲也属于经理，但是将不能由其执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">职责分离，不能既当运动员又当裁判员，不能又当跳水队领队又当全运会裁判长。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">典型的报销流程里，一般员工的差旅报销由财务人员核实，但如果某名财务人员需要报销差旅费显然不能由自己审批，需要另外一名具有同样权限的财务人员审核。此时就可以对申请任务和审核任务两个任务节点应用该模式。如下图所示：</span></p>
<div id="ih-j" style="text-align: left;"><img style="width: 569px; height: 329px;" src="http://docs.google.com/File?id=dcszdbfc_10chqm27fr_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-8</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">后续节点进行任务分配时，需要获取与之关联前续节点的分配执行信息。流程定义期，在定义任务节点属性时建立两者的关系。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>6</strong><strong><span style="font-family: 宋体;">、流程实例整个处理（</span>WRP_06:
Case Handing</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在一个流程实例里，所有的任务都能够分配给同一个资源执行。</span></p>
<div id="cwp5" style="text-align: left;"><img style="width: 648px; height: 328.297px;" src="http://docs.google.com/File?id=dcszdbfc_11cfw8grfs_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-9</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-9<span style="font-family: 宋体;">所示，流程实例中的所有任务都由同一个人执行：任务</span>A<span style="font-family: 宋体;">、</span>B<span style="font-family: 宋体;">、</span>C<span style="font-family: 宋体;">都由员工甲执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在应用该模式的流程里，通常流程里的任务都
是紧密关联的。流程里的任务往往执行在一个紧密相关的上下文里，如果所有的工作都由一个人执行，那么在其了解该上下文的情况下连贯执行这些任务会具有更高
的效率；而如果执行任务的过程中换人，那么新换的人无疑还需要时间对该流程实例相关的上下文进行熟悉，这样无疑会多付出执行成本。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">同一个软件的开发最好由同一拨开发人员完成，如果中途更换开发人员，那么新来的开发人员需要一段时间熟悉该软件，会对开发进度产生影响。同样的道理，在软件上线前增加开发人员不一定会提高开发效率，很多时候甚至作用相反。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可以在实现延迟分配模式的情况下实现该模式，即在第一个任务节点初始化设置参与者变量，后续任务全部使用该变量。如下图所示：</span></p>
<div id="qkcs" style="text-align: left;"><img style="width: 648px; height: 332.175px;" src="http://docs.google.com/File?id=dcszdbfc_12gjbzdjfg_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-10</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>7</strong><strong><span style="font-family: 宋体;">、经验获取（</span>WRP_07:
Retain Familiar</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在同一个流程实例里，当存在多个资源都能执行某一工作项时，能够将该工作项分配给执行了前某一工作项的同一资源。</span></p>
<div id="illk" style="text-align: left;"><img style="width: 638px; height: 451px;" src="http://docs.google.com/File?id=dcszdbfc_1366mwrjgh_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-11</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-11<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">和任务</span>B<span style="font-family: 宋体;">在设计期被指定由相同的资源执行，同时它们都指定分配给经理这个角色。那么在运行期，在一个流程实例里，任务</span>A<span style="font-family: 宋体;">被分配给了员工甲执行，那么在进行任务</span>B<span style="font-family: 宋体;">的分配时，任务</span>B<span style="font-family: 宋体;">依旧由员工甲执行。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">该模式刚好与职责分离模式相反，正如它的名字所暗示的，这些任务之间存在着紧密关联，如果执行了其中一个，那么就会熟悉这些相关联任务的背景上下文，积累一定经验，那么后续任务的执行相对其他人来说会变得容易。提高任务执行的效率。</span></p>
<div id="e7iw" style="text-align: left;"><img style="width: 582px; height: 312px;" src="http://docs.google.com/File?id=dcszdbfc_14cw49gpdq_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-12</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-12<span style="font-family: 宋体;">所示，在软件销售的过程中，售前和编写标书是重要的两步，这两个任务最好由同一个人进行处理，因为参与软件售前的人更熟悉客户的实际情况和需求，如果分开由不同的人员执行，那么必然会存在前者与后者的交流成本。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">后续节点进行任务分配时，需要获取与之关联前续节点的分配执行信息。流程定义期，在定义任务节点属性时建立两者的关系。运行期可以通过参与者变量（工作流变量）建立起运行期关系。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>8</strong><strong><span style="font-family: 宋体;">、基于能力的分配（</span>WRP_08:
Capability-Based Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">能够基于资源的能力进行工作项的分配，能力作为组织模型的一部分建模为资源的属性。</span></p>
<div id="t9nc" style="text-align: left;"><img style="width: 648px; height: 419.639px;" src="http://docs.google.com/File?id=dcszdbfc_15cq975kfw_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-13</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-13<span style="font-family: 宋体;">所示，任务</span>A<span style="font-family: 宋体;">需要交与开发人员执行，同时其对办理该任务的人员能力提出了要求，要求只有熟悉</span>JAVA<span style="font-family: 宋体;">且工作经验大于</span>2<span style="font-family: 宋体;">年的开发人员才能执行该任务。这样就缩小了选取资源的范围。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">人力资源管理中很重要的一点就是要做到人尽
其用，每个人的能力都能得到最大的发挥，其实也就是根据能力将人放置到最合适的工作中去。从这一点看，该模式是对人尽其能的实现。但是如何定义各个人员的
能力，这本身就比较的主观，执行各项工作需要具备的能力也具有主观因素，更何况很多时候能力并不能与表现划上等号，模型是固定的但人是变化的受环境影响
的，所以工具本身就是工具，工具的应用最后还是依赖于人。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实现需要两部分：一部分是组织机构对人进行建模时需要包括能力模型；另一部分是流程建模时需要给任务定义执行该任务所需的能力约束，这些约束是一系列的领域特定条件，需要有特定的解析器进行条件的解析。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">很多工作流引擎提供有参与者接口，接口返回人员</span>ID<span style="font-family: 宋体;">列表供给任务分配，从而将这部分工作委派到工作流实施时实现。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>9</strong><strong><span style="font-family: 宋体;">、基于历史的分配（</span>WRP_09:
History-Based Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">能够基于先前的工作历史决定当前任务的分配。</span></p>
<div id="nhvx" style="text-align: left;"><img style="width: 614px; height: 412px;" src="http://docs.google.com/File?id=dcszdbfc_16fmg39f5q_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-14</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-14<span style="font-family: 宋体;">所示，当需要在员工甲和员工乙之间做出选择时，会选择此前执行类似任务时完成最好的员工。需要注意的是，这里的历史不再是限定在同一流程实例的任务执行里，可能是同一流程模型的执行历史，也可能是不同流程模型的执行历史。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">考虑历史时，有很多的考虑因素，例如完成类似任务最好的员工、完成类似任务最快的员工、完成类似任务出差错最少的员工等等。这些考虑因素依赖于具体的任务内容和背景。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">国家篮球队比赛前，主教练会考察各个位置里各个球员的联赛比赛历史情况，其中不仅会考虑出场时间也会考虑各项数据，从而做出选择。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">同基于能力的分配模式一样，该模式的实现依赖于工作流具体应用的场景，也就是需要到实施阶段结合实际实现。从某一种角度也说明，应用工作流产品时，产品实施阶段也是最重要的步骤，选择工作流产品不仅仅是选择产品也需要考察其背后的实施团队。同时也可见，这些模式在诸如政府</span>OA<span style="font-family: 宋体;">这些应用中是根本应用不上的。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实现需要两部分：一部分是对用户任务执行历史进行统计分析找出关键的评定因素；另一部分是流程建模时需要给任务定义执行该任务所需的历史因素约束，这些约束同样是一系列的领域特定条件，需要特定的解析器进行解析。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>10</strong><strong><span style="font-family: 宋体;">、按组织分配（</span>WRP_10:
Organizational Distribution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">能够基于人员在组织机构中的位置以及与其他人员的关系分配工作项。</span></p>
<div id="zdq2" style="text-align: left;"><img style="width: 568px; height: 361px;" src="http://docs.google.com/File?id=dcszdbfc_17ff2vvw3k_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-15</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-15<span style="font-family: 宋体;">所示，审批任务需要由申请人的部门经理执行，即需要员工甲的部门经理执行。这种情况即基于人员之间的关系分配工作。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">基于人员在组织机构中的位置分配即需要在工作流模型里建立起与用户相匹配的组织机构模型，可以将任务分配给部门、角色、临时组、岗位等。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">应用最为广泛的模式，实际工作中几乎所有的工作都必然和组织机构具有联系。其他模式，如基于历史的分配、基于能力的分配等都是基于该模式之上的扩展，直接分配、基于角色的分配则直接是该模式的简单情况。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">对该模式的支持实际上是对用户组织机构模型的支持。正如前面所提到的，很难存在一种工作流产品能够支持所有的组织机构模型，但是大部分的产品都会提供一套元模型或扩展机制，需要在实施过程中最大限度的契合客户业务。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>11</strong><strong><span style="font-family: 宋体;">、自动执行（</span>WRP_11:
Automatic Execution</strong><strong><span style="font-family: 宋体;">）</span></strong></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">描述</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">任务的执行能够自动完成，不需要人员参与。</span></p>
<div id="y-ma" style="text-align: left;"><img style="width: 648px; height: 357.081px;" src="http://docs.google.com/File?id=dcszdbfc_18cbc9j4gk_b"  alt="" /></div>
<br />
<p class="MsoCaption" style="text-align: center;" align="center"><span style="font-family: 宋体;">图</span> 5-16</p>
<p class="MsoNormal"><span style="font-family: 宋体;">如图</span>5-16<span style="font-family: 宋体;">所示，请假审批后需要将情况通知给申请人，该任务由计算机完成，不需要人的参与，也不会产生工作项。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">应用</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">随着自动化水平的提高，越来越多的工作可以交由计算机或相应的机器设备完成。流程中的自动执行节点也会逐渐增加。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">实现</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">实际上工作流产品对该模式的支持即是支持各种的企业集成方式，不管是通过</span>Web<span style="font-family: 宋体;">服务还是消息，工作流需要驱动相应的设备机器或应用系统进行工作并传递给必须的数据。所以也可以看出，随着信息化程度的提高，目前工作流应用越来越趋向于企业集成领域。这也是为什么基于</span>Web<span style="font-family: 宋体;">服务编排的</span>BPEL<span style="font-family: 宋体;">会逐渐取代</span>XPDL<span style="font-family: 宋体;">成为工作流流行标准的原因之一。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/299012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-10-20 13:18 <a href="http://www.blogjava.net/RongHao/archive/2009/10/20/299012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五章-工作流之资源模式（前言与基本概念）</title><link>http://www.blogjava.net/RongHao/archive/2009/10/18/298728.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 18 Oct 2009 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/10/18/298728.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/298728.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/10/18/298728.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/298728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/298728.html</trackback:ping><description><![CDATA[在上一章里，我们谈到了工作流的控制模式，控制模式强调的是对业务流程进行建模，业务流程的目标是实现一个商业目标或者管理目标，业务流程的执行往往由一系列的任务所构成，控制模式建模的实质在于合理调配这些任务，以期以最少的成本达到最大的收益。<br />
<br />
本章将介绍工作流的资源模式，如果说控制模式更为宏观，强调的是业务流程里各个任务的合理调配的话，那么资源模式则深入细节，将要讨论单个具体任务的执行情况。提到任务的执行，那么谁能执行这些任务呢。答案很直接，是人。不管是在公司企业还是政府里，人都是最重要的资源，除去人之外，还有其他的非人力资源，例如机器、设备、计算机等。探讨这些资源如何执行业务流程中的具体任务，如何调配这些资源即构成了本章的内容，即资源模式。<br />
<br />
本章介绍工作流的资源模式，共计43种。提到模式，很多人会想到四人帮，想到他们的设计模式，但是需要与编程里的设计模式区别的是：程序里的设计模式关注的是代码，通过应用设计模式做到代码的职责清晰、不重复、开发人员友好等等；而工作流里的模式关注的是业务价值，通过合理调配任务和资源为组织带来最大的业务价值，工作流模式是对实际业务的直接描述，与具体的工作流产品实现没有直接的关系（后面我们可以看到，很多模式当前的工作流产品很难实现），两者的出发点完全不同。<br />
<br />
本章先会讨论与资源模式相关的一些基本概念，例如资源、工作项、组织机构建模等。接下来会对具体的43种资源模式进行讨论，讨论的模式按照描述、应用和实现展开，分别对应着模式的介绍、模式对实际业务的映射和工作流产品对该模式的实现支持。最后是小结。<br />
<br />
<strong>一、基本概念</strong><br />
<br />
<strong>1、资源</strong><br />
既然是资源模式，那么什么是资源。在本章的前言里，我们已经提到人是业务流程执行里最为重要的资源，除去人之外，随着自动化水平的提高，还有其他的非人力资源，例如机器、设备、计算机等。资源指的是能够进行工作的实体，通俗一点，就是能够执行业务流程里任务的实体。对于需要盈利的公司而言，就是找到一种可以盈利的模式，然后找寻能够执行这些盈利工作的资源，通过资源的工作达到盈利的目的，通过合理调配这些资源达到利益最大化。<br />
<br />
因为人是最为重要的资源，所以在后续对资源模式的讨论中，没有特殊说明，资源指的都是人力资源，大多数的模式也将以人来说明。<br />
<br />
典型的，人是某个组织机构里的成员。组织机构对人员进行分组，执行相关的工作以达到共同的目标。例如，企业的目标是盈利，政府的目标是为人民提供更好的公共服务。组织机构对人员的分组具有多种形式，最常见的就是部门、角色和岗位（实际上与角色相比，岗位更多体现的是一种业务职能，而角色更多体现的是管理职能，与权限相关）。对于大的跨地域的组织而言，还有分支机构的划分，此外，还有临时组（典型的如以交付为核心的软件开发公司里的项目组）。在很多情况下，人可能具有多个角色、属于多个部门，这些，增加了管理的复杂性。<br />
<br />
对工作流产品而言，要对资源模式进行支持，则必然涉及到对资源分组的支持，在大多情况下，资源分组即组织机构模型。只有支持目标客户的组织机构模型，才能在实施工作流产品时最大限度的契合客户业务。当然，如果产品是某个行业的标准，让客户模型向产品靠拢也是另外一种方式。<br />
<br />
<strong>2、工作流产品里的组织机构建模</strong><br />
所有的工作流产品都有自己的组织机构模型，其是工作流产品里一个重要的模块。但是一套模型往往很难契合多种业务场景。在大多数的产品实现里，都会提供一套元模型，例如人（Person）和组（Group），然后建立多套与业务相关的模型向元模型适配，例如，角色、部门都是组的一种形式，它们只是拥有不同的业务语义而已。<br />
<br />
在工作流产品实施时，很重要的一步就是进行组织机构建模，然后将建立完成的模型与工作流产品内置的模型进行适配，在适配的过程中，妥协是经常出现的。<br />
<br />
<strong>3、工作项</strong><br />
一个业务流程由一系列相关的任务组成。在工作流产品里，使用图形化的节点代表这些任务，而实际的任务被映射为工作项（work item），任务的调用被映射为工作项的执行。一般情况下，一个任务对应着一个工作项，但是存在一个任务需要多人完成的情况，这个时候一个任务就会对应着多个工作项。工作项可以看作是工作流中最小的工作单元，其代表着一个单一资源对某一任务的执行。<br />
<br />
既然在工作流系统里任务的执行被映射为工作项的执行，那么就一定存在着人与工作项这个计算机概念的交互，在工作流系统里，这一交互通过工作项管理器来进行管理。即我们通常所见的工作项列表（任务列表），我们通过这一列表拾取任务、处理任务以及管理任务的状态。<br />
<br />
<strong>4、工作项的生命周期</strong><br />
工作项有其自己的生命周期。<br />
&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/ronghao/workitem.png" alt="" border="0" /><br />
<div align="center"><strong>图 5-1</strong><br />
</div>
如图5-1所示，当工作流系统执行某一任务节点时就会创建工作项，工作项可以是一个也可以是多个，正如上面已经提到的，工作项代表着一个单一资源对某一任务的执行即一个工作项只能由一个资源来执行，现在我们讨论的是一个工作项的生命周期。<br />
<br />
工作项被系统创建完毕后即处于创建状态，接下来系统会选取资源来执行该工作项。有两种状态：一种是提供状态，一种是指派状态，这两者的区别在于一个是可选的一个是必须的。如果系统提供一个工作项给你执行，这意味着你符合执行该工作的条件，但你不必为该工作负责，即你可以选择执行该工作也可以选择拒绝，你只是该工作的合适候选者；而如果系统指派一个工作项给你执行，则意味着你必须为该工作负责，该工作必须由你来执行。因为一个工作项只能由一个资源来执行，所以如果是指派的话，那么只能指定一个资源；而提供，则可以提供给一个资源也可以提供给多个资源来候选。通常工作项管理器会提供两种列表来区分这两种状态，分别是待拾取列表和待办列表，一旦资源对待拾取列表里的工作项进行拾取，工作项即进入到资源的待办列表，状态成为指派状态。<br />
<br />
工作项进入指派状态即意味着执行该工作的资源已确定，那么接下来就可以由资源来开始执行该工作，执行的过程中可以将工作暂时挂起中断处理，后续可以再恢复对该工作的执行。如果工作成功完成，则工作项成为完成状态；如果工作因为各种原因没有成功完成，则工作项置为失败状态。<br />
<img src ="http://www.blogjava.net/RongHao/aggbug/298728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-10-18 09:45 <a href="http://www.blogjava.net/RongHao/archive/2009/10/18/298728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Head First Process-深入浅出流程》连载预告</title><link>http://www.blogjava.net/RongHao/archive/2009/10/17/298716.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sat, 17 Oct 2009 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/10/17/298716.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/298716.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/10/17/298716.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/298716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/298716.html</trackback:ping><description><![CDATA[似乎一到年末，就会忙起来。<br />
<br />
05年的时候忙着和现在的老婆谈那从来没谈过而导致过分饥渴的恋爱；06年的时候新配置了机器，忙着通关使命召唤和生化危机；07年的时候和张祖良一起翻译<a href="http://www.china-pub.com/209169&amp;ref=xilie">AJAX企业级开发</a>，第一次翻译，忙得像黄牛，慢得像蜗牛，在心里祈祷，翻译出来的东西不被骂就好；08年的时候和丁雪峰、总司令又一起翻译<a href="http://www.china-pub.com/195860">Spring攻略</a>，第二次翻译，熟练了一些，但是每一个句子还是要花上很多时间，很多时候还得一个词一个词的确认，翻译对我来说是个苦力活，第一次翻译完我就告诉自己不要再翻译了，但是Spring攻略确实是一本好书，完全是书本身吸引了我，同样在心里祈祷，不要糟蹋了这本书。09年了，和<a href="http://snowfox2008.javaeye.com">辛鹏</a>一起完成这本《Head First Process-深入浅出流程》，还是祈祷，千万不要写出垃圾，有时候，我常想，有必要这么辛苦吗？我是一个喜欢意淫的人，经常就把思绪抛到了多年之后，在未来里洋洋自得，于是回来时就有了动力。<br />
<br />
我负责该书的第一部分，包括了工作流的控制模式、资源模式、数据控制模式与异常处理模式，包括了对三种流程规范的介绍、对开源工作流的介绍、对jBPM4的分析。辛鹏负责该书的后半部分，他对流程应用有着非常丰富的经验，目前他正在杭州实施一个BPM的大项目，其中包括了完整的IBM产品套件，包括了企业集成和ESB。很多人认为工作流只是OA，这其实是一个误区，工作流确实在OA里应用的非常多，但这仅仅只是一个方面。说实话，我对本书也非常的期待，非常期待辛鹏在书中分享他众多的实施经验，他是一个非常勤奋的人，这点让我钦佩不止，常常想，等我到了30多岁，还会不会有一颗勤奋的心。<br />
<br />
家住燕郊，上班在东直门，每天在路上四个小时，挤那传说中的930，时常安慰自己：哥挤的不是930，哥挤的是寂寞。谢谢老婆，尽管还还着房贷存在着心理障碍，但是还是为我在东直门租了个房子，下周起就可以走路上班了，这样也会有了更多的时间来完成这本书。<br />
<br />
还是那句话：战战兢兢。<br />
<br />
十一过完，公司的新项目也开始了，时尚网站。技术栈包括了：OSGI、JCR、REST、渐进式增强。该项目有个巨大的亮点，不是徐昊是我们的技术leader，而是开发人员中一半是女生，这样每天pair的时候就生活在祖国的花园中了。<br />
<br />
希望能写些有价值的东西，征得刘江的同意，将会在博客连载部分章节。第一部分连载的将是工作流的资源模式，内容包括前言、基本概念、创建模式、推模式、拉模式、迂回模式、自动开始模式、可见性模式、多资源模式以及最后的小结。限于篇幅，将会分节进行连载。考虑到复制麻烦，将会在<a href="http://www.opug.org.cn/blog">开放流程社区</a>连载所有内容，博客会连载概要并提供链接。<br />
<br />
<br />
<img src ="http://www.blogjava.net/RongHao/aggbug/298716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2009-10-17 23:03 <a href="http://www.blogjava.net/RongHao/archive/2009/10/17/298716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>