﻿<?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-心情小站-随笔分类-SOA、BPM</title><link>http://www.blogjava.net/RongHao/category/22554.html</link><description>勤学、勤思</description><language>zh-cn</language><lastBuildDate>Sun, 18 Oct 2009 01:15:53 GMT</lastBuildDate><pubDate>Sun, 18 Oct 2009 01:15:53 GMT</pubDate><ttl>60</ttl><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>0</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><item><title>jBPM-side流程设计器功能规划</title><link>http://www.blogjava.net/RongHao/archive/2009/03/08/258501.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 08 Mar 2009 13:59:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/03/08/258501.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/258501.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/03/08/258501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/258501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/258501.html</trackback:ping><description><![CDATA[<p><br />
</p>
<p class="MsoNormal"><strong><font face="宋体">目标：</font>
</strong>
jBPM-side
ProcessDesigner<font face="宋体">是一个独立的设计器，基于</font>
Flex<font face="宋体">技术。其目的在于既使得程序开发人员能够基于其进行业务流程的建模，同时业务人员也能够基于其进行简单的建模和修改，例如修改节点的顺序、参与者等操作。此外，</font>
jBPM-side
ProcessDesigner<font face="宋体">具有很高的可配置性，在流程定义</font>
scheme<font face="宋体">变化的情况下，能够很快的做出适配。即其与具体的流程定义语言无关，可以对</font>
jPDL<font face="宋体">、</font>
XPDL<font face="宋体">、</font>
BPEL<font face="宋体">都进行建模。</font>
jBPM-side
ProcessDesigner<font face="宋体">的数据核心是</font>
xml<font face="宋体">。</font>
</p>
<p class="MsoNormal"><br />
</p>
<p class="MsoNormal"><strong><font face="宋体">功能规划：</font>
</strong>
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>一、</span>
</span>
<font face="宋体">图形建模</font>
</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><font face="宋体">支持流程模型与图形元素的一一对应，支持通过图形元素来进行流程的建模。流程模型与图形元素之间通过</font>
xml<font face="宋体">进行互相转换。图形建模方面，支持图形元素的拖拽、定位、复制、粘贴，支持快捷键操作，例如</font>
do/undo<font face="宋体">、</font>
delete<font face="宋体">。</font>
</p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><br />
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>二、</span>
</span>
<font face="宋体">流程参与者的适配导入</font>
</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><font face="宋体">支持在进行流程建模时，适配导入流程参与者。在进行人工参与节点定义时，选择参与者。进行人员</font>
/<font face="宋体">部门</font>
/<font face="宋体">角色的本地建模，提供最简单的必需属性。</font>
</p>
<p class="MsoNormal"><br />
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>三、</span>
</span>
<font face="宋体">图形展现与</font>
xml<font face="宋体">编辑的互相切换</font>
</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><font face="宋体">支持流程图形与</font>
xml<font face="宋体">编辑的切换，支持</font>
xml<font face="宋体">定义的本地导入和导出。</font>
</p>
<p class="MsoNormal"><br />
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>四、</span>
</span>
<font face="宋体">流程的分包与版本管理</font>
</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><font face="宋体">支持流程定义的分包和版本管理，需要服务器端的支持。</font>
</p>
<p class="MsoNormal"><br />
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>五、</span>
</span>
<font face="宋体">与服务器端的远程调用</font>
</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><font face="宋体">在支持服务器端的远程调用之前，</font>
jBPM-side
ProcessDesigner<font face="宋体">仅仅是本地</font>
xml<font face="宋体">的导入导出建模。采用</font>
restful-ws<font face="宋体">，基于</font>
xml<font face="宋体">在服务器与设计器之间传递数据。</font>
</p>
<p class="MsoNormal"><br />
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>六、</span>
</span>
<font face="宋体">与业务适配的</font>
DSL</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><br />
</p>
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -24pt;" mce_style="margin-left: 42pt; text-indent: -24pt;"><!----><strong><span><span>七、</span>
</span>
<font face="宋体">流程的权限管理</font>
</strong>
<!----></p>
<p class="MsoNormal" style="margin-left: 0.25in;" mce_style="margin-left: 0.25in;"><font face="宋体">支持对流程定义的分类权限管理，不同业务部门对属于自己的流程定义有各自的管理权限。此功能独立与</font>
jBPM-side
ProcessDesigner<font face="宋体">，但是需要通过契约使得</font>
jBPM-side
ProcessDesigner<font face="宋体">对流程定义的展现进行过滤。</font>
</p>
<img src ="http://www.blogjava.net/RongHao/aggbug/258501.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-03-08 21:59 <a href="http://www.blogjava.net/RongHao/archive/2009/03/08/258501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你服务，你全家才服务</title><link>http://www.blogjava.net/RongHao/archive/2009/02/19/255494.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 19 Feb 2009 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/02/19/255494.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/255494.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/02/19/255494.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/255494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/255494.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>在拥挤的公交车上读完《工作流管理(模型、方法和系统)》，自从搬完家，上班的路途突然变得遥远。</p>
<p><br />
这本书确实是按照它的副标题组织的，分别介绍工作流的建模模型、应用工作流开发的方法以及部分商业的工作流产品。<br />
对petri网的介绍是这本书的重点，如果想对petri网有个大概的了解而又不愿意接触深奥的数学，那么可以一读。本书随后分析了如何对流程模型进行分
析，包括对建模正确性与否的定量分析以及对资源运行效率的定性分析。至于介绍的工作流产品，因为年代久远，可读性不高。应用工作流开发的方法就更是理论
了，不过作为一本2000年的书，里面提到的一些原则还是很有敏捷的意思，例如和客户在一起、迭代开发、交流的重要性等等。</p>
<p><br />
读完这本书，加上先前的范玉顺的书，突然就明白为什么BPEL会如此之流行，原因在于它们都非常强调BPR的概念，即业务流程重组。也就是从一开始，工作
流系统就是瞄准BPR这个目标来的，想利用工作流系统将整个企业的业务流程都管理起来。目标如此远大，整合自然是不能避免，整合包括了对人员的整合，也包
括了对IT系统的集成。如此以来，恍然大悟：BPEL这种强调服务集成的执行语言无怪乎会大红大紫了。至于说国内最普遍的工作流应用：将工作流引擎嵌入应
用系统中，分离流程逻辑与业务逻辑，则自然登不了大雅之堂了。一句话说，就是国内应用工作流的层次太低。或者反过来也可以理解：现在的所谓BPM软件都眼
高手低，不太适合国内的应用。</p>
<p><br />
可是问题依旧存在，即BPEL根本上说是一种执行语言，要业务人员理解简直是强人所难，所以BPMN应运而生。好吧，BPMN有了，自然BPMN到
BPEL的映射就出现了，可惜这终究是一厢情愿，一种是业务建模语言，一种是计算机执行语言，中间的代沟比70、80还宽。就像科比，篮筐在他眼里比大海
还广阔。</p>
<p><br />
此外，BPEL的应用还存在一个天然的障碍，即应用集成从来都不是一件轻松的事情。将接口用web
service包装一下就SOA了？就面向服务了？这鬼话你也信，那可真是你服务，你全家才服务呢。应用集成不轻松，所谓的企业敏捷性：能够根据外部环境
的变化迅速调整服务编排流程那自然是镜中月，水中花了。君不见，无数程序员们在开口大骂：靠，流程又要调整，早吃屎了？！</p>
<p><br />
所以结论有三:<br />
1、国内的嵌入式工作流应用还是什么适用就用什么吧，和XPDL\BPEL都无关；<br />
2、一心要SOA、要BPEL。那别指望它能减少工作量，也别指望流程能够迅速修改；<br />
3、要对企业流程进行敏捷管理，那就考虑文档化，别考虑执行。</p>
</div>
<img src ="http://www.blogjava.net/RongHao/aggbug/255494.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-02-19 14:20 <a href="http://www.blogjava.net/RongHao/archive/2009/02/19/255494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流技术基础读后</title><link>http://www.blogjava.net/RongHao/archive/2009/02/09/253934.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 09 Feb 2009 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2009/02/09/253934.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/253934.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2009/02/09/253934.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/253934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/253934.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><o:p></o:p></strong></p>
<p class="MsoNormal"><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">大概花了三天的时间读完这本书，书本身也不厚，读起来很快。这本书出版于</span>2001<span style="font-family: 宋体;" lang="ZH-CN">年，所以对它也没有抱有很大的期望，但是还不错，特别是前三章，很有些惊喜。后面关于工作流仿真的描述也很到位。但是关于技术实现，则大都略过了。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">总结一下里面个人觉得不错的部分。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">第一章很不错，强调为什么需要工作流管理系统。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">企业经营环境的变化：过去企业市场竞争主要围绕着如何提高生产率进行，现在则是围绕新产品的竞争而展开。新产品的价格总是高于其价值，通过竞争，价格才逐渐接近价值，产品失去独占期，同时也意味着产品生命周期的结束。与产品生命周期缩短所对应的，是客户定制产品数量的增加。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">在这种情况下，传统串行的产品研制会延长产品的上市时间，同时串行过程也是在企业以功能为核心划分组织机构下的必然产物。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">敏捷制造提出的背景：用户需求多样化、个性化，所有企业都将处于一种连续改变、不可预见的市场环境中，此时问题的核心在于是否抓住机遇、快速响应市场、开发新产品。敏捷制造的基本思想是，企业能够对持续变化、不可预测的市场需求做出快速反应，强调面向市场的敏捷性。实现敏捷制造的关键是对企业进行敏捷化改造和重组。其中企业组织结构发生重大的变化，传统的企业组织结构是功能部门制，即按照不同的功能和职能设立不同的部门，上下级之间形成一个树型的结构。这种结构的缺点在于：每个单元都由上一级的功能单元进行管理，出现问题时，每一级都会把责任推到上一级，这样会造成部门职责不清。柔性底，一个生产流程往往跨越多个部门，部门之间的协调成本很高，扯皮。需要建立起面向流程的组织机构，按照企业要实现的主要业务流程来配置组织机构，以项目来组织人员，减少内部不必要的沟通协调成本，提高对市场的响应速度。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">由此，需要工作流系统来对企业的流程进行分析和梳理。然后围绕这些流程来进行企业的业务重组和改造。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">第二章的亮点在于如何实施工作流系统。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">工作流的实施不同于普通的业务处理系统，它首先需要在战略层次上对企业的业务目标进行分析，确定企业的战略目标和组织要求，然后再进入到具体的实施阶段，分为三个阶段：模型建立阶段、模型实例化阶段和模型执行阶段。实施工作流的目的在于提高企业的柔性，能够根据市场的变化不断改进其业务流程。其中作者强调了工作流的两个重要职责：集成和仿真。工作流系统本身是一个完成流程建模和流程管理的软件系统，但是为了在企业的实际业务中得到有效的应用，它必须和企业已有的或购买的其他业务系统实现集成，通过集成来提高整个企业</span><span lang="ZH-CN"> </span><span style="font-family: 宋体;" lang="ZH-CN">的应用水平和应用效率。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">第三章分析工作流系统的组成以及</span>WFMC<span style="font-family: 宋体;" lang="ZH-CN">定义的五个接口。很清晰。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">第四章到第八章描述具体商业产品的大概技术实现、</span>XPDL<span style="font-family: 宋体;" lang="ZH-CN">规范和分布式的工作流，由于现在已经是</span>B/S<span style="font-family: 宋体;" lang="ZH-CN">软件的天下，所以里面的分布式在这里显得理所当然。这部分可以跳过。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">第九章讲述作者实现的一个工作流系统</span>CIMFlow<span style="font-family: 宋体;" lang="ZH-CN">。亮点在于分布式工作流机的设计方案。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">核心思想是：多个工作流机分配给多个部门，与这个部门相关的流程或流程节点就由这个部门专属的工作流机执行，部门可以各自独立修改这些流程或流程节点。另外为了集中管理，再设置一个主控工作流机，集中管理这些部门工作流机。这样可以提高流程的柔性。很赞的思想，但是实现无疑复杂了。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">第十章讲如何在企业流程重组中应用工作流。偶觉得，这本书一旦上升到企业运营的层次讲解工作流，马上就很赞了，</span>O(<span style="font-family: 宋体;" lang="ZH-CN">&#8745;</span>_<span style="font-family: 宋体;" lang="ZH-CN">&#8745;</span>)O~<span style="font-family: 宋体;" lang="ZH-CN">。其中关于流程仿真部分很是好看，颠覆了自己对流程仿真的观点。以前认为是流程仿真是确保流程建模的逻辑正确，属于软件测试的范畴。这里的仿真却是为企业决策提供数据。需要注意的是对资源的定义。资源包括了人、业务系统、运营成本等等，很广义的概念。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">最后一章再次强调工作流集成能力的重要意义。不禁让我想起了</span>BPEL<span style="font-family: 宋体;" lang="ZH-CN">。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">合上书，我想，这是在讲工作流吗，</span>( <span style="font-family: 宋体;" lang="ZH-CN">⊙</span>o<span style="font-family: 宋体;" lang="ZH-CN">⊙</span> )?<span style="font-family: 宋体;" lang="ZH-CN">，咋和我印象中的工作流不一样哩。我想，作者更强调的应该是一种高端的业务流程管理，它既不是现有的工作流、也不是</span>BPM<span style="font-family: 宋体;" lang="ZH-CN">软件，然而又不是</span>BPG<span style="font-family: 宋体;" lang="ZH-CN">，因为它管理的流程是可以马上执行的。只能这么想，作为</span>7<span style="font-family: 宋体;" lang="ZH-CN">年前作者对工作流的理解，期望太多。</span></p>
<p class="MsoNormal"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;" lang="ZH-CN">如果有电子版，值得一读，如果买纸版，就没有必要了。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/253934.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-02-09 18:07 <a href="http://www.blogjava.net/RongHao/archive/2009/02/09/253934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BPM向左，工作流向右（二）工作流系统杂谈</title><link>http://www.blogjava.net/RongHao/archive/2008/11/07/239209.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 07 Nov 2008 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/11/07/239209.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/239209.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/11/07/239209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/239209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/239209.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">当面对一个完整的工作流系统时，你可能会被它众多的功能所困惑：流程流转模式、时间服务、组织适配、表单权限等等。但是如果我们转换一种思路，首先从用户使用的角度来进行分析，工作流系统的组成就会变得异常清晰。实际在现实开发中，整个系统也是由用户的业务需求一步步迭代而来。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: -24pt;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>一、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">从用户的角度分析工作流系统的组成</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">这里的用户分为两类：一类是应用系统开发人员（以后简称开发人员），一类是应用系统的最终用户（以后简称最终用户）。对于最终用户而言，工作流系统往往是不能直接使用的，它需要由</span><span style="font-size: 12pt;">IT</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">部门的开发人员嵌入到应用系统中。开发人员才是工作流系统的直接使用者，这造成了问题：工作流系统更多关注于开发人员的需求，例如如何快速开发、如何更好的嵌入业务逻辑等等，而最终用户的需求被或多或少的忽略了。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter" />
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0" />
<v:f eqn="sum @0 1 0" />
<v:f eqn="sum 0 0 @1" />
<v:f eqn="prod @2 1 2" />
<v:f eqn="prod @3 21600 pixelWidth" />
<v:f eqn="prod @3 21600 pixelHeight" />
<v:f eqn="sum @0 0 1" />
<v:f eqn="prod @6 1 2" />
<v:f eqn="prod @7 21600 pixelWidth" />
<v:f eqn="sum @8 21600 0" />
<v:f eqn="prod @7 21600 pixelHeight" />
<v:f eqn="sum @10 21600 0" />
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
<o:lock v:ext="edit" aspectratio="t" />
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:414.75pt;
height:289.5pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg" o:title="截图00" />
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/ronghao/___________.gif" alt="" border="0" /><br />
<!--[endif]--><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">这里从最终用户的角度进行分析。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">面向开发人员的流程设计器</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">最终用户通过流程设计器对业务流程进行描述，实际是一个流程建模的过程。理论上，业务分析师完成这个业务流程建模的过程，并且业务分析师往往被假定为非技术人员。对于业务分析而言，流程建模通常是抽象的，一定程度上是模糊的，建模的目的在于通过图形的形式向其他人解释一个业务的过程，图形只是一种方式，采用它只是它更易于理解和易于沟通，实际类似于</span><span style="font-size: 12pt;">DSL</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">。实际上企业的规章制度、文字描述的执行流程都是对业务流程具体的描述方式。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">对于工作流而言，这个建模所产生的流程是需要被引擎执行的。这就要求流程中每一个节点的定义都是要有明确含义的，它需要被计算机明确而准确的解释。同时，出于集成业务系统的需要，流程模型定义往往带有很多额外的属性。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">所以现实中的流程设计器往往属性配置繁多。导致最终用户在打开设计器后根本无从修改和建模，他需要关注很多与业务无关的配置，无意中的修改往往产生流程无法运行的后果。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>2、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">工作项列表</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">即任务列表。工作流系统通过工作项列表进行人工任务的分配。最终用户通过该列表签收、处理每天的工作，工作以工作项的形式展现。对于工作项，用户有着多种业务操作：签收、完成提交、收回、回退等等。对于分配给他人的工作项，也存在着多种业务操作：催办、提醒、时间限定等等。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>3、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程追踪</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">用户在处理工作项时，对该工作在流程中所处的位置进行查看，了解当前流程的状态和执行情况。一般情况下，流程追踪以图形化的方式展现。用户通过不同的图标和标示来区分流程中各个节点的状态和参与者信息。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>4、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程实例管理</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">包括流程实例、节点实例、工作项实例的管理。改变状态，包括了挂起、重新启动、终止、跳转等等。主要目的在于对流程人为执行错误进行人工干预以及对流程信息的监控。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: -24pt;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>二、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">系统架构</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 21pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">从用户的角度分析完工作流系统的组成，这里从开发人员的角度分析工作流系统的架构。系统架构里的每一部分是如何与用户使用的部分进行对应，以及每一部分在实现时需要注意的事项。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">整体构成</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">如图，各模块分层组织，位于上层的模块依赖于底层的模块。正如你所看到的，流程定义模型位于整个工作流系统的最低层，因为它是整个工作流系统的基础。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:414.75pt;height:305.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.jpg" o:title="截图01" />
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/ronghao/_______.gif" alt="" border="0" /><br />
<!--[endif]--><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程定义模型：定义对流程进行描述的所有对象。因为对流程进行描述的本质就是利用这些模型进行建模，所以这些模型对象的实现直接决定着工作流系统对流程的描述能力。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">组织结构适配器：工作流系统在与业务系统进行集成时，需要进行组织适配，通过这一过程将业务系统里的组织机构导入到工作流系统里。具体实现时，工作流系统需要建立起自己的组织机构模型（包含在流程定义模型里），要适应多种业务系统，往往需要建立多套模型，根据具体情况进行切换。有多种方式完成这个适配，最简单的方式是利用</span><span style="font-size: 12pt;">SQL</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">配置读取数据进行语义转换。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程设计器：供用户使用的可视化图形工具。每种图形都对应着一种流程定义模型。具体的实现有</span><span style="font-size: 12pt;">Swing</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">、</span><span style="font-size: 12pt;">SWT</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">，但是基于</span><span style="font-size: 12pt;">AJAX</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">的</span><span style="font-size: 12pt;">WEB</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">设计器无疑会提供更好的可用性。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程执行引擎：将流程定义模型解释为流程实例模型。利用这些流程实例模型完成流程的调度和执行。在工作流系统里，执行引擎是整个系统的核心。实现时不仅需要考虑各种流程调度的实现，还要考虑执行的效率、缓存、日志等等。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">工作项引擎：解析参与者定义模型和工作项定义模型，生成相应的工作项。对用户对工作项的操作作出响应。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;">WEB</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">应用：工作流系统的</span><span style="font-size: 12pt;">WEB</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">展现。包括了工作项列表、流程追踪以及流程实例管理的操作和显示。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程仿真：对建立好的流程模型进行运行仿真，模拟流程模型的执行过程。目的在于发现流程建模过程中的疏漏，发现由此导致的流程不能运行。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">时间服务：提供对整个流程实例执行时间和任务执行时间的控制，根据规则触发相应的时间事件，例如任务超时、任务预警等等。根据规则自动触发启动新的流程实例。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">业务集成：提供工作流系统与业务系统的契合方式。典型的实现包括通过注册事件监听器和提供接口抽象类调用业务系统代码、提供</span><span style="font-size: 12pt;">API</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">给业务系统调用、工作项驱动业务表单和脚本引擎执行业务逻辑脚本等等。特定于工作项驱动业务表单，为方便开发，绝大多数的工作流厂商都提供了电子表单的实现。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>2、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">基于事件的流程执行引擎</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">流程执行引擎的主要职责就是负责流程的调度和执行。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">首先需要将流程定义模型解释为流程实例模型，在定义模型和实例模型之间建立起对应关系。一个简单的对应关系如下图所示：</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:415.5pt;height:262.5pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.jpg" o:title="截图02" />
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/ronghao/_________.gif" alt="" border="0" /><br />
<!--[endif]--><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">执行引擎将流程定义模型的属性读取到相应的实例模型里，由实例模型完成流程的调度和执行。当然，上图只是一个简单的描述，实际情况要复杂的多，特别是节点定义（</span><span style="font-size: 12pt;">ActivityDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">），根据实际应用，往往存在着多种类型，典型的有开始节点（</span><span style="font-size: 12pt;">StartDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）、任务节点（</span><span style="font-size: 12pt;">TaskDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）、自动节点（</span><span style="font-size: 12pt;">AutoDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）、分裂节点（</span><span style="font-size: 12pt;">SplitDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）、汇聚节点（</span><span style="font-size: 12pt;">JoinDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）、结束节点（</span><span style="font-size: 12pt;">EndDefinition</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）等等。这些节点的实例根据类型的不同执行不同的逻辑。其中，分裂节点实例和汇聚节点实例负责流程的调度，它们决定流程的流向，通常情况下，它们会调用一个脚本引擎执行一段脚本来决定流程的流向，同时，也会提供对外暴露的接口，由业务系统实现，接口返回的结果决定流程的流向。任务节点实例和自动节点实例则负责流程的执行，为保证流程执行引擎职责的清晰以及对外围设施的松耦合，它们只是发布相关的事件，通过事件发布</span><span style="font-size: 12pt;">/</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">订阅机制来触发具体的逻辑执行。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:414.75pt;height:246.75pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image007.jpg" o:title="截图03" />
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/ronghao/________.gif" alt="" border="0" /><br />
<!--[endif]--><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">典型的事件有流程启动事件、流程结束事件、进入节点事件、离开节点事件、时间事件等。例如，任务节点实例的进入节点事件将会触发工作项引擎生成工作项（</span><span style="font-size: 12pt;">Workitem</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">），并触发时间服务器开始计时。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>3、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">基于充血模型的工作项引擎</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">对最终用户而言，大部分的业务操作都集中在对工作项的操作上。常见的包括工作项的提交、收回、委派、追加和退回。这些操作从系统设计的角度不仅涉及到工作项（</span><span style="font-size: 12pt;">Workitem</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">）对象内部状态的变化，而且影响到流程执行引擎的调度以及相关的其他工作项对象状态。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">工作项引擎的职责包括两部分。第一，监听任务节点实例的进入事件，生成工作项实例。第二，处理上面提到的各种工作项操作。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" style='width:414.75pt;height:278.25pt'>
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image009.jpg" o:title="截图04" />
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/ronghao/________1.gif" alt="" border="0" /><br />
<!--[endif]--><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">实现时，工作项生成器根据任务参与者的执行模式典型的分为四种情况：</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">竞争参与，</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">当有多个参与者参与该任务时，产生竞争，谁先开始这项工作，就由谁负责完成该工作。此时，工作项生成器生成多个工作项实例，在某个工作项完成时会终止其余工作项。</span><span style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">顺序参与，</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">多个参与者按照指定的顺序完成该工作。</span><span style="font-size: 12pt; font-family: 宋体;">A<span lang="ZH-CN">完成之后由</span>B<span lang="ZH-CN">完成，</span>B<span lang="ZH-CN">完成之后再交给</span>C<span lang="ZH-CN">完成。此时，工作项生成器生成多个工作项实例，根据顺序依次激活各个工作项。</span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18.75pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">共同参与，</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">多个参与者同时对工作进行处理。此时，工作项生成器生成多个工作项实例并全部激活。</span><span style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18.75pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">智能决策<span>，</span>存在多个参与者的情况下，</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">工作项生成器</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">能够根据一定的指标（由数据分析，例如人员的处理效率，工作负载等等）和规则来决定该节点的参与者并为其生成相应工作项。这里涉及到算法。</span><span style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="a" style="text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">对于工作流系统而言，各种流程实例对象都是充血模型。特定于各种工作项操作的处理，此时的工作项对象亦设计为充血模型，将业务逻辑封装到领域模型里，简化领域模型之间的交互，省去频繁的</span><span style="font-size: 12pt;">get/set</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">。由领域模型再委派到具体的处理类里。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;">Client-&gt;(Business&nbsp;Facade)-&gt;Domain&nbsp;Model-&gt;service-&gt;Data&nbsp;Access(DAO)</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 42pt; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-size: 12pt;"><span>4、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">工作项驱动业务表单的业务集成方式</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">最终用户对任务的处理，必然由工作项对应着某一业务表单。用户在工作项列表里选择自己需要办理的工作项，由工作项导航到业务表单。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt;"><o:p>&nbsp;</o:p></span></p>
<p class="a" style="margin-left: 24pt; text-indent: 0in;"><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">特定于</span><span style="font-size: 12pt;">WEB</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">系统，业务表单的导航由</span><span style="font-size: 12pt;">url</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">完成。在流程定义模型设计时，将</span><span style="font-size: 12pt;">url</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">设置入节点属性，生成工作项时将此</span><span style="font-size: 12pt;">url</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">保存在工作项对象属性里。点击工作项详细信息时即打开该</span><span style="font-size: 12pt;">url</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">，完成到业务表单的导航。业务表单页面通常需要引入处理工作项逻辑的父页面或者导入定制的</span><span style="font-size: 12pt;">js</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">库，这些父页面或</span><span style="font-size: 12pt;">js</span><span style="font-size: 12pt; font-family: 宋体;" lang="ZH-CN">库由工作流产品提供。这样，对于业务表单编写，工作流逻辑是透明的。</span><span style="font-size: 12pt;"><o:p></o:p></span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/239209.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> 2008-11-07 11:20 <a href="http://www.blogjava.net/RongHao/archive/2008/11/07/239209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BPM向左，工作流向右（一）什么是业务流程</title><link>http://www.blogjava.net/RongHao/archive/2008/08/26/224529.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 26 Aug 2008 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/08/26/224529.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/224529.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/08/26/224529.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/224529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/224529.html</trackback:ping><description><![CDATA[<p><strong></strong><strong></strong><span style="font-size: 12pt; font-family: 宋体;"><br />
从事工作流以及相关开发已经三年。提到工作流，很多人都会想到</span><span style="font-size: 12pt;">BPM</span><span style="font-size: 12pt; font-family: 宋体;">，想到业务流程。对于业务流程，我的理解经过了一个过程，从最开始对工作流抱有的不切实际的期望，到对</span><span style="font-size: 12pt;">BPM</span><span style="font-size: 12pt; font-family: 宋体;">的一些看法，再到目前的趋于实际。有一些感触，也有一些理解。对于业务流程管理而言，我想说的是：</span><span style="font-size: 12pt;">BPM</span><span style="font-size: 12pt; font-family: 宋体;">向左，工作流向右，都不靠谱，或者说它们实际所能描述的流程和这里的业务流程根本就风牛马不相及，不是一个概念，唯一的相同点是只不过都叫流程而已。</span></p>
<p style="margin-left: 24pt; text-indent: -24pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">一、什么是业务流程</span></strong></p>
<p style="margin-left: 24pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">业务流程是一个技术</span><span style="font-size: 12pt;"><a href="http://www.shenmeshi.com/Science/Index.html"></a></span><span style="font-size: 12pt; font-family: 宋体;">术语，它具有准确的定义：有组织的活动，</span><span style="font-size: 12pt; font-family: 宋体;">相互联系，为客户创造价值。</span></p>
<p style="margin-left: 24pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">这句话很好理解。甚至可以说任何企业的活动都是以业务为主线，以流程为线索串联起来的。企业的规章制度、操作手册等都与业务流程有着契合点。</span></p>
<p style="margin-left: 24pt; text-indent: -24pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">二、业务流程对于企业的意义</span></strong></p>
<p style="margin-left: 24pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">业务流程对于企业的意义不仅仅在于对企业关键业务的一种描述，更在于对企业的业务运营有着指导意义，这种意义体现在对资源的优化、对企业组织机构的优化以及对管理制度的一系列改变。这种优化的目的实际也是企业所追求的目标：降低企业的运营成本，提高对市场需求的响应速度，争取企业利润的最大化。</span></p>
<p style="margin-left: 24pt; text-indent: -24pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">三、业务流程也是一个体系</span></strong></p>
<p style="margin-left: 24pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">业务流程通常的表现形式是流程图（不是唯一形式），毕竟图形是最易于理解的一种形式，但似乎我们太关注于流程图本身而忽略了其他。除了流程图之外，业务流程还应该包括目标和指导方针，这才是一个完整的业务流程。在梳理业务使用业务流程描述时首先要想到的是该流程所要达到的目标，能为客户创造什么价值，脱离开业务目标或者说纯粹为描述业务而描述业务是没有意义的。同时在制定业务流程时也要考虑到该业务流程的指导方针，同一个业务可能有很多种业务流程的描述形式，具体哪一种是最合适的，这里就必须有一个指导方针来进行约束。</span></p>
<p style="margin-left: 24pt; text-indent: -24pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">四、业务流程的特征</span></strong></p>
<p style="margin-left: 42pt; text-indent: -18pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">1、层次性、逐层抽象</span></strong></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">业务流程是有层次性的，这种层次体现在由上至下、由整体到部分、由宏观到微观、由抽象到具体的逻辑关系。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/rh1.gif" alt="" border="0" height="391" width="586" /><br />
</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt;"><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">这样一个层次关系符合人们的思维习惯，有利于企业业务模型的建立。一般来说，我们可以先建立主要业务流程的总体运行过程（其中包括了整个企业的大的战略），然后对其中的每项活动进行细化，落实到各个部门的业务过程，建立相对独立的子业务流程以及为其服务的辅助业务流程。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">业务流程之间的层次关系一定程度上也反映了企业部门之间的层次关系。不同层级的部门有着对业务流程不同的分级管理权限。决策层、管理者、使用者可以清晰的查看到下属和下属部门的业务流程。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/rh2.gif" alt="" border="0" height="410" width="584" /><br />
</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt;"><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 42pt;">为使得所建立的业务流程能够更顺畅的运行，业务流程的改进与企业组织结构的优化是一个相互制约、相互促进的过程。</p>
<p style="margin-left: 42pt; text-indent: -18pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">2、以人为本</span></strong></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">组织中最重要的部分是人员的工作方式以及构成他们每日操作的工作流程。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">人是业务流程的驱动者，组织中的每一个人都会在业务流程中充当一个角色。通过良好的业务流程，每一个人都会有自己清晰的职责，要求具有良好的沟通协作意识和团队意识，明确自己在一个个业务流程中所担当的角色。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">同时对于参与其中的业务流程，每个人员都要有自己的反馈。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">首先，每个人员都能查看到这些业务流程，他们需要充分理解这些业务流程、流程的业务意义和目的，这些业务流程通过切合他们理解能力的方式（切合业务的图形、说明文字、相应的制度、规范、标准等等）得以展现。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">其次，对于流程运行中存在的问题或瓶颈，每个人员都要积极反馈（提出修改的建议，或者在权限范围内直接修改）以促进流程的持续改进，业务流程的管理和变动不仅仅是业务分析人员或管理人员的职责，每一个员工都要参与其中，否则只有失败。管理人员和决策层更重要的职责是制定出业务流程的规则和约束，在这个规则和约束范围内，员工可以根据变化的商业环境对业务流程做出迅速修改，这样不必等到领导了解情况后再做出决策从而失去机会。</span></p>
<p style="margin-left: 42pt; text-indent: -18pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">3、对流程运行效益的分析</span></strong></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">从企业投资者的角度来讲，好的业务流程设计必然是能够为企业带来最高利润的设计。因此，对业务流程的效益分析是评价业务流程的一个重要方面。财务数据是最关键的数据，但这种分析不一定完全是由数据支撑的，有些是不能量化的，比如人员效率等等。</span></p>
<p style="margin-left: 24pt; text-indent: -24pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">五、业务流程管理</span></strong></p>
<p style="margin-left: 24pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">良好的业务流程管理是保证企业灵活运营的关键（业务流程管理又何尝不是一种业务流程？）。</span></p>
<p style="margin-left: 42pt; text-indent: -18pt;"><strong><span style="font-size: 12pt; font-family: 宋体;">1、业务分析</span></strong></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">实际这也是业务流程管理最重要的部分。它需要对企业业务有着强大的分析能力，因为业务分析对企业的运营有着重大的指导意义，只有具备了这样的业务分析能力，才能把握住企业运转的真实流程，而且这种分析能力往往带有对整个行业的深刻理解和前瞻性。没有异议，业务分析在于人，与</span><span style="font-size: 12pt;">IT</span><span style="font-size: 12pt; font-family: 宋体;">无关。</span></p>
<p style="margin-left: 42pt; text-indent: -18pt;"><span style="font-size: 12pt; font-family: 宋体;"><strong>2</strong><strong>、业务流程的持续改进</strong></span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">不仅仅是流程管理人员（管理决策层）根据运行效益的分析和商业环境的分析对流程进行重整。还包括每个员工对其参与的流程的持续反馈和持续改进。柔性的业务流程。</span></p>
<p style="margin-left: 42pt; text-indent: -18pt;"><strong><span style="font-size: 12pt;">3、IT</span><span style="font-size: 12pt; font-family: 宋体;">系统与业务流程的关系</span></strong></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt;">IT</span><span style="font-size: 12pt; font-family: 宋体;">系统与业务流程并没有直接的关系。正如</span><span style="font-size: 12pt;">06z</span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;">SOA</span><span style="font-size: 12pt; font-family: 宋体;">帖子里表达的：</span><span style="font-size: 12pt;">soa95%</span><span style="font-size: 12pt; font-family: 宋体;">以上的工作是在做业务流程的分析解构和重整，技术层面的支持只占</span><span style="font-size: 12pt;">5%</span><span style="font-size: 12pt; font-family: 宋体;">不到。在落实到技术层面，你觉得一个</span><span style="font-size: 12pt;">soa</span><span style="font-size: 12pt; font-family: 宋体;">产品究竟应该包括些什么内容呢？这些内容又能有多少是能够辅助大家对业务流程进行分析和测试，对业务元素进行重整和再分配？如果你们真的有这个能力，你们觉得是在这里继续开发软件过苦日子，还是去开拓商业咨询呢？我的观点是：</span><span style="font-size: 12pt;">SOA</span><span style="font-size: 12pt; font-family: 宋体;">很美好，但是一落地就变成了小丑。所谓的业务流程管理软件同理。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">可以这样理解：业务流程管理是一个很大的命题，</span><span style="font-size: 12pt;">IT</span><span style="font-size: 12pt; font-family: 宋体;">系统通过信息化对它的子集进行支撑，这里的</span><span style="font-size: 12pt;">IT</span><span style="font-size: 12pt; font-family: 宋体;">系统包括的范围很广泛，包括了所有的企业应用软件（所有的企业应用软件都可以看作是对企业某部分的业务流程进行的描述）。业务流程管理的核心在于业务流程的分析解构和重整，这点是所有软件都不可企及的，关键在于人。至于</span><span style="font-size: 12pt;">BPM</span><span style="font-size: 12pt; font-family: 宋体;">还是工作流，它们本来就有它们自己的适用范围，硬要把它提升到业务流程管理的高度来宣传，那就真的和小丑一样，滑稽而可笑。</span></p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">关注下篇：</span><span style="font-size: 12pt;">BPM</span><span style="font-size: 12pt; font-family: 宋体;">是干什么的</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/224529.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> 2008-08-26 17:33 <a href="http://www.blogjava.net/RongHao/archive/2008/08/26/224529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流之收回</title><link>http://www.blogjava.net/RongHao/archive/2008/07/15/215036.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 15 Jul 2008 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/07/15/215036.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/215036.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/07/15/215036.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/215036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/215036.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: 12pt; font-family: 宋体;">收回</span></strong></p>
<p><span style="font-size: 12pt; font-family: 宋体;">收回是工作流参与者对自己&#8220;已办任务&#8221;（对已完成的工作项）的一种操作，即参与者主动对已办理过的工作项进行重新办理。</span></p>
<p><strong><span style="font-family: 宋体;">为什么要收回？</span></strong></p>
<p>参与者完成任务后，发现自己办理有错误等情况后，需要将此任务收回重新办理。</p>
<p><strong>工作项的参与方式</strong></p>
<p>目前有四种方式：共同参与、竞争参与、顺序参与、基于角色的共同参与。</p>
<p>下面会针对这四种方式进行讨论。</p>
<p><strong>工作项收回模式</strong></p>
<p><strong>1、未触发下一节点的工作项的收回</strong></p>
<p>即当前任务节点并未完成，依旧处于执行状态</p>
<p><br />
</p>
<p>1.1共同参与</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/ronghao/sh1.gif" alt="" border="0" height="328" width="583" /><br />
</p>
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p>如图：在节点A未结束之前，workitem1、workitem2和workitem3正常完成后可以任意收回。在只产生一个workitem的情况下，不存在未触发下一节点的收回情况。</p>
<p><br />
</p>
<p>1.2顺序参与</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/ronghao/sh2.gif" alt="" border="0" height="355" width="580" /><br />
</p>
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">如图：</span><span style="font-size: 12pt;">workitem1</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;">workitem2</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;">workitem3</span><span style="font-size: 12pt; font-family: 宋体;">顺序完成，</span><span style="font-size: 12pt;">workitem1</span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;">workitem2</span><span style="font-size: 12pt; font-family: 宋体;">签收（包括挂起和手工终止）前可以收回，同样，</span><span style="font-size: 12pt;">workitem2</span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;">workitem3</span><span style="font-size: 12pt; font-family: 宋体;">签收（包括挂起和手工终止）前也可以收回。</span><span style="font-family: 宋体;">在只产生一个</span>workitem<span style="font-family: 宋体;">的情况下，</span><span style="font-size: 12pt; font-family: 宋体;">不存在未触发下一节点的收回情况。</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt;">1.3</span><span style="font-size: 12pt; font-family: 宋体;">竞争参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">因为只会产生一个</span><span style="font-size: 12pt;">workitem</span><span style="font-size: 12pt; font-family: 宋体;">，该</span><span style="font-size: 12pt;">workitem</span><span style="font-size: 12pt; font-family: 宋体;">完成后会立刻触发下一节点，所以不存在未触发下一节点的收回情况。</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt;">1.4</span><span style="font-size: 12pt; font-family: 宋体;">基于角色的共同参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">与</span><span style="font-size: 12pt;">1.1</span><span style="font-size: 12pt; font-family: 宋体;">相同。</span></p>
<p><strong><span style="font-size: 12pt;">2</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">、已触发下一节点的工作项的收回</span></strong></p>
<p><strong>&nbsp;</strong></p>
<p><span style="font-size: 12pt;">2.1</span><span style="font-size: 12pt; font-family: 宋体;">共同参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/sh3.gif" alt="" border="0" /><br />
</span></p>
<p><span style="font-size: 12pt;"><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">问题</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt; font-family: 宋体;">：多个工作项时谁可以执行收回操作？</span></p>
<p><span style="font-size: 12pt;">workitem1</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;">workitem2</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;">workitem3</span><span style="font-size: 12pt; font-family: 宋体;">都可以执行收回操作。第一个工作项的收回将会导致节点</span><span style="font-size: 12pt;">B</span><span style="font-size: 12pt; font-family: 宋体;">实例的删除，同时节点</span><span style="font-size: 12pt;">A</span><span style="font-size: 12pt; font-family: 宋体;">重新恢复执行状态。</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">问题</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt; font-family: 宋体;">：节点</span><span style="font-size: 12pt;">B</span><span style="font-size: 12pt; font-family: 宋体;">处于什么状态节点</span><span style="font-size: 12pt;">A</span><span style="font-size: 12pt; font-family: 宋体;">的工作项可以执行收回操作？</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">由</span><span style="font-size: 12pt;">A</span><span style="font-size: 12pt; font-family: 宋体;">触发的节点</span><span style="font-size: 12pt;">B</span><span style="font-size: 12pt; font-family: 宋体;">处于正在执行的状态，节点</span><span style="font-size: 12pt;">B</span><span style="font-size: 12pt; font-family: 宋体;">所产生的工作项：</span></p>
<p><span style="font-size: 12pt;">a</span><span style="font-size: 12pt; font-family: 宋体;">共同参与</span><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 工作项均未签收、挂起或手工终止</span></p>
<p><span style="font-size: 12pt;">b</span><span style="font-size: 12pt; font-family: 宋体;">顺序参与</span><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; 第一个工作项未签收、挂起或手工终止</span></p>
<p><span style="font-size: 12pt;">c </span><span style="font-size: 12pt; font-family: 宋体;">竞争参与&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">工作项均未签收、挂起或手工终止</span></p>
<p><span style="font-size: 12pt;">d</span><span style="font-size: 12pt; font-family: 宋体;">角色</span><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">同共同参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">问题</span><span style="font-size: 12pt;">3</span><span style="font-size: 12pt; font-family: 宋体;">：工作项收回产生的影响？</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">节点</span><span style="font-size: 12pt;">A</span><span style="font-size: 12pt; font-family: 宋体;">重新执行，收回的工作项重新执行。节点</span><span style="font-size: 12pt;">B</span><span style="font-size: 12pt; font-family: 宋体;">重新恢复未触发状态，</span><span style="font-size: 12pt;">B</span><span style="font-size: 12pt; font-family: 宋体;">所产生的工作项全部删除。</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt;">2.2</span><span style="font-size: 12pt; font-family: 宋体;">顺序参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/sh4.gif" alt="" border="0" /><br />
</span></p>
<p><span style="font-size: 12pt;"><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">问题</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt; font-family: 宋体;">：多个工作项时谁可以执行收回操作？</span></p>
<p><span style="font-size: 12pt;">workitem1</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;">workitem2</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;">workitem3</span><span style="font-size: 12pt; font-family: 宋体;">根据顺序可以依次执行收回操作。</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt;">2.3</span><span style="font-size: 12pt; font-family: 宋体;">竞争参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">情况简单，只有一个工作项，所以可以直接收回。</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><br />
</span></p>
<p><span style="font-size: 12pt;">2.4</span><span style="font-size: 12pt; font-family: 宋体;">基于角色的共同参与</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">同</span><span style="font-size: 12pt;">2.1</span></p>
<p><span style="font-size: 12pt;"><br />
</span></p>
<p><strong>工作流收回模式</strong></p>
<p>后续触发节点只能是人工节点（可以是多个，至少一个），否则不支持收回。目前不支持父子流程之间的收回。</p>
<p><span style="font-size: 12pt; font-family: 宋体;">一个典型的同步汇聚情况：</span></p>
<p><span style="font-size: 12pt; font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/sh5.gif" alt="" border="0" /><br />
</span></p>
<p><span style="font-size: 12pt;"><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-size: 12pt; font-family: 宋体;">节点</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt; font-family: 宋体;">首先执行完毕，但是因为是同步汇聚，所以它不会触发实际的流转；而节点</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt; font-family: 宋体;">的完成则会触发节点</span><span style="font-size: 12pt;">3</span><span style="font-size: 12pt; font-family: 宋体;">的执行。在这种情况下，节点</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt; font-family: 宋体;">的工作项可以执行收回操作，而节点</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt; font-family: 宋体;">的工作项因为后续没有触发节点而不能收回。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/215036.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> 2008-07-15 18:28 <a href="http://www.blogjava.net/RongHao/archive/2008/07/15/215036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流回退模式分析</title><link>http://www.blogjava.net/RongHao/archive/2008/06/24/210210.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 24 Jun 2008 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/06/24/210210.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/210210.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/06/24/210210.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/210210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/210210.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;">
<p><strong><span style="font-family: 宋体;">回退（Rollback WorkItem）</span></strong></p>
<p>回退是工作流参与者对自己&#8220;待办任务&#8221;（实际是对工作项）的一种操作，即参与者主动回退待办任务列表中的任务到已经执行过的人工节点。</p>
<p><strong><span style="font-family: 宋体;">为什么要回退？</span></strong></p>
<p>参与者接受任务后，发现不应由自己办理此任务或以前的执行者办理有错误等情况后，需要将此接受的任务回退给以前某个节点的执行者重新办理。</p>
<p><strong>回退模式</strong></p>
<p>回退的情况实际上是非常复杂的，其中包括了参与者的重新选择以及回退的条件判断等等。这里先列出常见的回退模式（其实也是我们支持的模式）。</p>
<p style="margin-left: 18pt; text-indent: -18pt;">串行</p>
<p style="margin-left: 18pt; text-indent: -18pt;">&nbsp;&nbsp;&nbsp; <img src="http://www.blogjava.net/images/blogjava_net/ronghao/cx.gif" alt="" border="0" height="288" width="576" /><br />
</p>
<p style="margin-left: 18pt;"><!--[if gte vml 1]>
<![endif]--></p>
<p style="margin-left: 18pt;">这种情况最为简单，后续节点可以回退到前续任意人工节点。回退后，节点重走。</p>
<p style="margin-left: 18pt; text-indent: -18pt;">分支</p>
<p style="margin-left: 18pt; text-indent: -18pt;">&nbsp;&nbsp;&nbsp; <img src="http://www.blogjava.net/images/blogjava_net/ronghao/fz.gif" alt="" border="0" height="386" width="558" /><br />
</p>
<p style="margin-left: 18pt;"><!--[if gte vml 1]>
<![endif]--></p>
<p style="margin-left: 18pt;">这种情况也相对简单，实际执行的分支上的节点可以回退到前续任意人工节点（不区分主支和分支）。同样，主支上的节点也可以回退到任意实际执行的分支上的节点。</p>
<p style="margin-left: 18pt;">可能的问题：多次回退后的回退节点选择。例如：第一次流程经过节点2、节点3到达节点5，节点5可以回退到节点1、节点2和节点3的任意一个，此时节点5回退到节点1，节点1重走，这一次流程改为经过节点4到达节点5，节点5回退时如何选择回退节点？此时的策略是以最近实际执行的分支为准，即节点5只允许回退到节点4和节点1，不允许回退到节点2和节点3。（抹去记忆）</p>
<p style="margin-left: 18pt; text-indent: -18pt;">并发</p>
<p style="margin-left: 18pt; text-indent: -18pt;">&nbsp;&nbsp;&nbsp; <img src="http://www.blogjava.net/images/blogjava_net/ronghao/bf1.gif" alt="" border="0" height="385" width="572" /><br />
</p>
<p style="margin-left: 18pt;"><!--[if gte vml 1]>
<![endif]--></p>
<p style="margin-left: 18pt;">对于并发的情况，分支节点只允许在分支的节点间回退。</p>
<p style="margin-left: 18pt;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/bf2.gif" alt="" border="0" height="383" width="575" /><br />
</p>
<p style="margin-left: 18pt;"><!--[if gte vml 1]>
<![endif]--></p>
<p style="margin-left: 18pt;">同理，主支节点也只允许在主支的节点间回退。</p>
<p style="margin-left: 18pt; text-indent: -18pt;">多实例汇聚</p>
<p style="margin-left: 18pt; text-indent: -18pt;">&nbsp;&nbsp;&nbsp; <img src="http://www.blogjava.net/images/blogjava_net/ronghao/dsl.gif" alt="" border="0" height="369" width="575" /><br />
</p>
<p style="margin-left: 18pt;"><!--[if gte vml 1]>
<![endif]--></p>
<p style="margin-left: 18pt;">在这种情况下，节点5会产生2个实例，实际相当于继续并发。节点5根据具体哪个节点触发的它而产生回退节点。同时不允许回退到节点1以及前续的节点去。</p>
<p style="margin-left: 18pt; text-indent: -18pt;">子流程</p>
<p style="margin-left: 18pt; text-indent: -18pt;">&nbsp;&nbsp;&nbsp; <img src="http://www.blogjava.net/images/blogjava_net/ronghao/zlc.gif" alt="" border="0" height="367" width="579" /><br />
</p>
<p style="margin-left: 18pt;"><!--[if gte vml 1]>
<![endif]--></p>
<p style="margin-left: 18pt;">支持子流程到父流程的回退，也支持父流程到子流程节点的回退。需要注意的是子流程节点有可能产生多个子流程实例，在这种情况下不支持父子流程之间的相互回退。</p>
<p><strong>回退节点的参与者选择</strong></p>
<p style="margin-left: 18pt;">默认策略是由原先节点的实际参与者重新处理，比如节点2回退到节点1，则节点1的实际参与者重新处理该节点任务。这也符合大多数实际的业务场景。</p>
<p style="margin-left: 18pt;">在节点任务竞争参与的情况下，提供另一种策略，即让人员重新竞争。</p>
<p><strong>回退的条件判断</strong></p>
<p style="margin: 6pt 0cm 6pt 17.95pt;"><span style="font-size: 12pt; font-family: 宋体;">对于多人（或者多部门，用户）参与的工作项，提供不同的回退策略</span></p>
<p style="margin: 6pt 0cm 6pt 63.2pt; text-indent: -21pt;"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">任意人回退即回退，剩余工作项手工终止</span></p>
<p style="margin: 6pt 0cm 6pt 63.2pt; text-indent: -21pt;"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">最后提交人回退才回退</span></p>
<p style="margin: 6pt 0cm;"><span style="font-size: 12pt;">&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">流程定义期定义该策略。</span></p>
<p style="margin: 6pt 0cm 6pt 18pt; text-indent: -18pt;"><span style="font-size: 12pt;">&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">另外流程定义时提供节点可回退列表，由用户在定义期对可回退的节点进行限制。</span></p>
<p style="margin: 6pt 0cm;"><strong><span style="font-size: 12pt; font-family: 宋体;">关于业务补偿</span></strong></p>
<p style="margin: 6pt 0cm 6pt 18pt;"><span style="font-size: 12pt; font-family: 宋体;">业务补偿是一个很重要的概念，在回退的情况下需要相应的回退部分业务操作。这里由引擎提供统一的接口，返回回退路径，由客户自定义代码进行匹配处理。</span></p>
<p style="margin: 6pt 0cm;"><strong>&nbsp;</strong></p>
<p style="margin: 6pt 0cm;"><strong><span style="font-size: 12pt; font-family: 宋体;">关于实现</span></strong></p>
<p style="margin: 6pt 0cm 6pt 18pt;"><span style="font-size: 12pt; font-family: 宋体;">很多工作流引擎通过流程定义时绘出回退线来显式的支持回退，这种实现在业务复杂的情况下会造成流程图的异常烦琐，但是比较清晰，实现比较容易。隐式实现相比而言优点更多。</span></p>
</span>
<img src ="http://www.blogjava.net/RongHao/aggbug/210210.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> 2008-06-24 09:12 <a href="http://www.blogjava.net/RongHao/archive/2008/06/24/210210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流流程状态管理及变迁</title><link>http://www.blogjava.net/RongHao/archive/2008/05/26/203016.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 26 May 2008 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/05/26/203016.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/203016.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/05/26/203016.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/203016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/203016.html</trackback:ping><description><![CDATA[<p>这是我们（东方易维）工作流产品设计过程中采取的设计：<br />
<strong></strong></p>
<p><span style="font-family: 宋体;">一、流程实例的状态</span></p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体;">状态分为</span>5<span style="font-family: 宋体;">种：实例化、执行中、挂起、手工结束、正常结束。</span></p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体;">状态的变迁如下图：</span></p>
<p><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/Imag00000.gif" alt="" border="0" /><br />
</span></p>
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-family: 宋体;">二、节点实例的状态</span></p>
<p style="text-indent: 15.75pt;"><span style="font-family: 宋体;">状态分为</span>5<span style="font-family: 宋体;">种：实例化、执行中、挂起、手工结束、正常结束。</span></p>
<p style="text-indent: 15.75pt;"><span style="font-family: 宋体;">状态的变迁如下图：</span></p>
<p style="text-indent: 15.75pt;"><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/Imag00000.gif" alt="" border="0" height="393" width="553" /><br />
</span></p>
<p style="text-indent: 15.75pt;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-family: 宋体;">三、具体节点的状态</span></p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体;">细分：</span></p>
<p style="margin-left: 38.25pt; text-indent: -18pt;"><span style="font-family: 宋体;">A、人工节点、等待节点</span></p>
<p style="margin-left: 38.25pt; text-indent: 0cm;"><span style="font-family: 宋体;">这两个节点被触发后存在一个执行等待的过程，所以可以被用户直接挂起和手工结束。人工节点的挂起意味着所有未完成工作项的挂起，同时相应时间服务的时间计算的挂起。手工结束会使流程跳过该节点（所有工作项手工结束），继续往后流转。</span></p>
<p style="margin-left: 21pt;">B<span style="font-family: 宋体;">、开始节点、结束节点、分支节点、自动节点</span></p>
<p style="margin-left: 39pt; text-indent: 0cm;"><span style="font-family: 宋体;">这些节点的特点在于被触发后立刻执行和流转，所以不会存在挂起和手工结束的状态。</span></p>
<p style="margin-left: 21pt;">C<span style="font-family: 宋体;">、并发节点、汇聚节点</span></p>
<p style="margin-left: 39pt; text-indent: 0cm;"><span style="font-family: 宋体;">并发节点和汇聚节点不存在挂起的状态，同时不能被用户直接手工结束，它们的状态受流程实例状态和相关节点实例状态的影响。</span></p>
<p style="margin-left: 39pt; text-indent: 0cm;"><span style="font-family: 宋体;">并发节点和汇聚节点的情况复杂一些，分模式讨论</span></p>
<p style="margin-left: 39pt; text-indent: 0cm;"><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/Imag00001.gif" alt="" border="0" /><br />
</span></p>
<p style="margin-left: 39pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 39pt; text-indent: 0cm;"><strong><span style="font-family: 宋体;">图</span>1</strong></p>
<p style="margin-left: 57pt; text-indent: -18pt;"><span style="font-family: 宋体;">1、同步汇聚（图</span>1<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">根据情况触发节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">中的一个或多个，汇聚节点等待所有实际触发的节点完成后再执行流转。中间汇聚节点只会产生一个实例。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.1<span style="font-family: 宋体;">、正常流转时的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">当汇聚节点未被触发时（即节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">都未执行结束），并发节点处于执行状态，一旦汇聚节点被触发（即节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">有一个执行结束），并发节点正常结束并且汇聚节点处于执行状态，所有并发出的节点实例执行结束后，汇聚节点正常结束，流程继续流转。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.2<span style="font-family: 宋体;">、用户挂起、手工结束相关节点的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.2.1<span style="font-family: 宋体;">、汇聚节点未激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的挂起和恢复执行不会影响并发节点的状态（依旧处于执行状态）；节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的任一手工结束都会触发汇聚节点，使并发节点正常结束，如果所有并发的节点实例都结束（包括手工结束和正常结束），汇聚节点正常结束，触发流程流转。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.2.2<span style="font-family: 宋体;">、汇聚节点已激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的挂起和恢复执行不会影响汇聚节点的状态（依旧处于执行状态）；节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的手工结束会影响汇聚节点的状态，每个节点实例的手工结束会引起汇聚节点的判断，如果所有并发的节点实例（包括正常结束和手工结束）都结束，汇聚节点正常结束，触发流程流转。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.3<span style="font-family: 宋体;">、用户挂起、手工结束流程的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.3.1<span style="font-family: 宋体;">、汇聚节点未激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">流程的挂起和恢复执行不会影响并发节点的状态（依旧处于执行状态），节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">会被全部挂起或恢复；流程的手工结束会引起所有节点的手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">1.3.2<span style="font-family: 宋体;">、汇聚节点已激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">流程的挂起和恢复执行不会影响汇聚节点的状态（依旧处于执行状态），节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">未执行结束的实例会被全部挂起或恢复；流程的手工结束会引起所有节点的手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: -18pt;">2、nOutOfM<span style="font-family: 宋体;">汇聚（图</span>1<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">根据情况触发节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">中的一个或多个，汇聚节点等待</span>N<span style="font-family: 宋体;">个实际触发的节点完成后即执行流转（</span>N&gt;0<span style="font-family: 宋体;">且</span>N&lt;M<span style="font-family: 宋体;">，</span>M<span style="font-family: 宋体;">为实际触发的节点个数），在</span>N&lt;=0<span style="font-family: 宋体;">和</span>N&gt;=M<span style="font-family: 宋体;">的情况下即为同步汇聚。中间汇聚节点只会产生一个实例。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.1<span style="font-family: 宋体;">、正常流转时的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">当汇聚节点未被触发时（即节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">都未执行结束），并发节点处于执行状态，一旦汇聚节点被触发（即节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">有一个执行结束），并发节点正常结束并且汇聚节点处于执行状态，</span>N<span style="font-family: 宋体;">个并发出的节点实例执行结束后，汇聚节点正常结束，流程继续流转，</span>M-N<span style="font-family: 宋体;">的节点实例被手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.2<span style="font-family: 宋体;">、用户挂起、手工结束相关节点的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.2.1<span style="font-family: 宋体;">、汇聚节点未激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的挂起和恢复执行不会影响并发节点的状态（依旧处于执行状态）；节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的任一手工结束都会触发汇聚节点，使并发节点正常结束，如果</span>N<span style="font-family: 宋体;">个并发的节点实例都手工结束，并发节点正常结束，触发汇聚节点，汇聚节点正常结束，触发流程流转，</span>M-N<span style="font-family: 宋体;">的节点实例被手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.2.2<span style="font-family: 宋体;">、汇聚节点已激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的挂起和恢复执行不会影响汇聚节点的状态（依旧处于执行状态）；节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">的手工结束会影响汇聚节点的状态，每个节点实例的手工结束会引起汇聚节点的判断，如果</span>N<span style="font-family: 宋体;">个并发的节点实例（包括正常结束和手工结束）都结束，汇聚节点正常结束，触发流程流转，</span>M-N<span style="font-family: 宋体;">的节点实例被手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.3<span style="font-family: 宋体;">、用户挂起、手工结束流程的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.3.1<span style="font-family: 宋体;">、汇聚节点未激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">流程的挂起和恢复执行不会影响并发节点的状态（依旧处于执行状态），节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">会被全部挂起或恢复；流程的手工结束会引起所有节点的手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">2.3.2<span style="font-family: 宋体;">、汇聚节点已激活时</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">流程的挂起和恢复执行不会影响汇聚节点的状态（依旧处于执行状态），节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">未执行结束的实例会被全部挂起或恢复；流程的手工结束会引起所有节点的手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: -18pt;"><span style="font-family: 宋体;">3、辨别汇聚（图</span>1<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">是</span>nOutOfM<span style="font-family: 宋体;">汇聚的特例，</span>N=1</p>
<p style="margin-left: 57pt; text-indent: -18pt;"><span style="font-family: 宋体;">4、多实例汇聚（图</span>2<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 57pt; text-indent: -18pt;"><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/Imag00003.gif" alt="" border="0" /><br />
</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><strong><span style="font-family: 宋体;">图</span>2</strong></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">根据情况触发节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">中的一个或多个，节点</span>0<span style="font-family: 宋体;">和节点</span>1<span style="font-family: 宋体;">任意一个执行结束后都会触发汇聚节点产生一个新的实例，汇聚节点实例紧接着触发节点</span>2<span style="font-family: 宋体;">，节点</span>2<span style="font-family: 宋体;">也会产生多个实例。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">4.1<span style="font-family: 宋体;">、正常流转时的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">当汇聚节点未被触发时（即节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">都未执行结束），并发节点处于执行状态，一旦汇聚节点被触发（即节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">有一个执行结束），汇聚节点会紧接着触发节点</span>2<span style="font-family: 宋体;">，汇聚节点正常结束。所有并发出的节点实例执行结束后，并发节点正常结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">4.2<span style="font-family: 宋体;">、用户挂起、手工结束相关节点的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">的挂起和恢复执行不会影响并发节点的状态（依旧处于执行状态）；节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">的手工结束会影响并发节点和汇聚节点的状态，每个节点实例的手工结束会引起汇聚节点产生新的实例并触发节点</span>2<span style="font-family: 宋体;">，同时会引起并发节点的判断，如果所有并发的节点实例都手工结束，并发节点正常结束。</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;">4.3<span style="font-family: 宋体;">、用户挂起、手工结束流程的处理策略</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">流程的挂起和恢复执行不会影响并发节点的状态（依旧处于执行状态），节点</span>0<span style="font-family: 宋体;">、节点</span>1<span style="font-family: 宋体;">、节点</span>2<span style="font-family: 宋体;">会被全部挂起或恢复；流程的手工结束会引起所有未结束节点的手工结束。</span></p>
<p style="margin-left: 57pt; text-indent: -18pt;"><span style="font-family: 宋体;">5、隐式结束，没有汇聚节点与并发节点对应（图</span>3<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 57pt; text-indent: -18pt;"><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/Imag00002.gif" alt="" border="0" /><br />
</span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><strong><span style="font-family: 宋体;">图</span>3</strong></p>
<p style="margin-left: 57pt; text-indent: 0cm;"><span style="font-family: 宋体;">所有节点结束时（正常结束或手工结束），并发节点正常结束。流程的手工结束会引起所有未结束节点的手工结束。</span></p>
<p><span style="font-family: 宋体;">四、流程实例状态变化对节点实例状态造成的影响</span></p>
<p>1<span style="font-family: 宋体;">、流程实例的挂起</span></p>
<p>&nbsp;&nbsp; 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>2<span style="font-family: 宋体;">、流程实例的手工结束</span></p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体;">所有节点全部手工结束。</span></p>
<p><span style="font-family: 宋体;">五、节点实例状态变化对流程实例状态造成的影响</span></p>
<p><span style="font-family: 宋体;">隐式结束的情况下，节点的手工结束或正常结束都会触发流程的判断，如果所有的节点都已结束则流程结束。</span></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/203016.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> 2008-05-26 19:36 <a href="http://www.blogjava.net/RongHao/archive/2008/05/26/203016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流需求分析</title><link>http://www.blogjava.net/RongHao/archive/2008/05/08/199297.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 08 May 2008 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/05/08/199297.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/199297.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/05/08/199297.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/199297.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/199297.html</trackback:ping><description><![CDATA[用户的需求大概分为两部分：一部分是整个项目完全基于工作流来搭建开发，这也是很多工作流厂商患有&#8220;平台压迫症&#8221;的原因；另一部分是将工作流作为业务组件加入已有的项目中，推动业务的&#8220;审批&#8221;流转。<br />
<br />
前者的要求显然更高，但也意味着有更多的利润。其实这一部分的用户又可以进一步的细分：一是技术能力比较差的公司，他们通过层层外包接到项目，而又没有实力自己开发，于是想通过采购工作流加上几个刚入门的程序员来完成整个项目的开发（这类用户往往也是业务平台最大的客户群），他们想着是一整套的开发解决方案，甚至包括业务分析；二是对业务编程的需求，他们需要流程引擎能够侵入业务编程的内部，对业务的状态和生命周期进行灵活的管理，从而最大程度的简化开发或者说满足一些复杂业务编程的需要。<br />
<br />
后者的需求则比较简单，多是某一行业的项目公司，突然碰到有审批的需求了，采用工作流多是满足人工&#8220;审批&#8221;的需要，以及部分的统计分析。<br />
<br />
需要承认，工作流其实与最终用户还差得很远，也就是说在众多厂商的网页上，那副著名的业务流程生命周期其实是一句空话。一句话说，就是那个什么流程设计器是给程序员用的，至于用户，哪凉快哪去。也就是说现在的工作流还不能给最终用户提供价值。OK，既然工作流的价值是提供给集成商的，集成商就会考虑成本，于是工作流能否提供一个完整的开发解决方案就成了最重要的考量。<br />
<br />
最后说说市场。工作流其实有着很大的市场，只不过这个市场被开源工作流和平台瓜分掉了。因为目前的工作流不能给最终用户提供价值，所以集成商在遇到审批的需求时，首先想到的会是开源的工作流引擎，从jbpm、osworkflow的流行也可以看出这一点，并且知识的积累确实比购买工作流来的划算，同时很多公司通过积累也会有自己的流程组件，这并没有太大的难度。难度留给技术能力一般的公司，他们首先想到的会是一整套解决方案而不仅仅止于流程服务，于是平台出现了，平台说：&#8220;灰壳显灵，银弹来了。&#8221;<br />
<br />
关于平台，有一个很时髦的流行词汇，叫&#8220;业务应用基础平台&#8221;，稍候待续。
<img src ="http://www.blogjava.net/RongHao/aggbug/199297.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> 2008-05-08 17:49 <a href="http://www.blogjava.net/RongHao/archive/2008/05/08/199297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>py工作流分析</title><link>http://www.blogjava.net/RongHao/archive/2008/05/06/198753.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 06 May 2008 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/05/06/198753.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/198753.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/05/06/198753.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/198753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/198753.html</trackback:ping><description><![CDATA[py工作流是国内比较好的工作流之一。大概看过它的一些文档，分析一下。<br />
<strong>1、路由模型</strong><br />
&nbsp;py支持的工作流模式其实并不多，只是支持1到7七种模式而已，其中比较重要的是模式6和模式7，即M选N分支和M选N聚合，看过它的实现，利用转移线条件来触发转移线，从而触发后续的节点。这样做比较简单，但是同时也存在很多问题，例如在路由非常复杂的情况下，例如多个分支节点的串联，以及并发路由存在多个节点时，这种做法实现起来就非常困难。另外，并发路由的工作流变量会存在相互冲突的情况，也包括业务数据的冲突。可以说py的路由模型还是很简单的，支持简单的业务可能没有问题，对于复杂的业务可能需要很多其他额外的办法。当然，很多国内的工作流甚至连模式6和模式7都支持不了，同时工作流的应用目前还具有很浓的&#8220;审批&#8221;的影子（貌似有人很讨厌审批这个说法），所以目前的路由模型应该满足需求了。<br />
<strong>2、任意路由和回退</strong><br />
&nbsp;没有看到任意路由和回退的复杂示例。关于任意路由，产品说明中说到可以在整个流程范围内任意自由路由，我觉得这个说法本来就是有问题的，并发路由的情况下，并发支线往主线上跳转，这种情况会有很多问题存在，其他并行的支线如何处理？或者说根本就没有考虑到这些复杂的情况？回退也是一样的道理，至于业务补偿的提出还是不错的，不过推给了用户自己设置回退动作。<br />
<strong>3、关于WFMC和BPEL规范</strong><br />
&nbsp;看看流程定义文件就知道了，它不支持任何规范。敢说国内工作流的流程定义就没有遵循规范的。<br />
<strong>4、参与者的指定</strong><br />
&nbsp;提供了组织机构、角色、个人这三种常见的参与者设置模式，还提供了流程启动者、活动执行者、从相关数据或从规则逻辑中获取参与者的模式。<br />
<strong>5、工作的代理和代办</strong><br />
<strong>6、时间服务</strong><br />
&nbsp;提供了四种时限。活动提醒、活动执行、流程提醒、流程执行。<br />
<strong>7、业务开发</strong><br />
&nbsp;感觉这是非常出彩的地方，在一个简单的示例中几乎不需要任何编码，比如一个简单的请假管理。看看它的流程定义文件，它几乎将整个业务表单都嵌入到流程定义里去了。这样做是否合适？我个人倾向于引擎与业务完全分开，通过反射或者某种映射将两者关联到一起。如果是用户自己开发已有的复杂业务，如何将工作流嵌入？至于studio也是非常出色的，具有开发调试的功能。调用接口非常的清晰。<br />
<strong>总结一下</strong>：py工作流还是一个不错的工作流引擎，抛开它的宣传，感觉引擎的实现还是有些简单，或者说只是满足了目前的一些常见需求，至于所说的SOA和服务编排，我觉得目前还不现实。它的优势在于与其平台的完全融合，能够利用很多既有设施，可是这又何尝不是把双刃剑？另外，强大的市场宣传和良好的服务团队也是选择工作流时的重要考虑。
<img src ="http://www.blogjava.net/RongHao/aggbug/198753.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> 2008-05-06 17:21 <a href="http://www.blogjava.net/RongHao/archive/2008/05/06/198753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流委办功能分析</title><link>http://www.blogjava.net/RongHao/archive/2008/04/07/191330.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 07 Apr 2008 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/04/07/191330.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/191330.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/04/07/191330.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/191330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/191330.html</trackback:ping><description><![CDATA[委办是什么？即分发给A的工作项可以委派给B代为进行处理。委办只针对个人。委派给组织或岗位似乎没有意义。<br />
<strong>一、委办的分类</strong><br />
&nbsp;1、用户单一工作项的委办以及收回委办<br />
&nbsp;2、用户所有工作项的委办，全权委办<br />
&nbsp;3、用户按流程划分工作项的委办，基于模板的全权委办，也可以理解为基于业务的委办<br />
<strong>二、委办的触发与终止</strong><br />
&nbsp;1、对于单一工作项的委办，在待签收和待办工作项列表需要出现委办的功能按钮，由用户选择其他用户代为办理。工作项委办后进入委办工作项列表，用户可以收回委办，同时用户和被委办人都可以对该工作项进行办理，用户自己处理则工作项自动被收回委办。<br />
&nbsp;2、对于全权委办以及基于模板的全权委办，需要委办申请单。用户通过填写委办申请单，将某段时期内工作项列表的处理工作委派给他人。消息通知：当用户将工作委派给指定的被委办人时，被委办人可以收到提醒消息。<br />
&nbsp;3、委办的自动终止以及手动结束：当委托的时间到期时，委办功能自动终止，委办申请记录将只读。用户也可以手动结束委托，逻辑删除或对委办申请记录进行修改。维护委办申请列表。<br />
<strong>三、委办工作项列表</strong><br />
&nbsp;1、用户可以在委办列表里对委办的工作项状态进行跟踪，对于还未被被委办人签收的工作项可以收回或直接办理<br />
&nbsp;2、被委办的工作项进入委办人的委办列表<br />
&nbsp;3、被委办的工作项按状态进入被委办人的待签、待办和办结列表，注明是被委办即可<br />
&nbsp;4、委办工作项的再委办，工作项增加委办的说明字段，委办工作项的依次状态影响<br />
<strong>四、其他</strong><br />
&nbsp;1、提交工作项页面，选择用户出现委办人时，名字红现，括弧注明其将被委办的被委办人<br />
&nbsp;2、提交工作项页面，选择部门或角色包含委办人时，不做处理。引擎生成工作项时做出处理，对工作项做出委托说明<br />
&nbsp;3、流程跟踪列表，增加委办说明字段
<img src ="http://www.blogjava.net/RongHao/aggbug/191330.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> 2008-04-07 18:28 <a href="http://www.blogjava.net/RongHao/archive/2008/04/07/191330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流管理权限分析</title><link>http://www.blogjava.net/RongHao/archive/2008/03/08/184703.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sat, 08 Mar 2008 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/03/08/184703.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/184703.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/03/08/184703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/184703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/184703.html</trackback:ping><description><![CDATA[既然是与用户相关的权限，那么权限的表现则一定与UI紧密相连。工作流管理系统里，用户与工作流的交互界面有四种：<br />
<strong>1、流程设计器</strong><br />
&nbsp;&nbsp; &nbsp;流程设计器的功能比较单一：定义或更新流程定义。里面涉及到包、模板和版本的概念。资源即流程模板（例如发文模板、收文模板），权限可以细分为：维护、只读以及不可见。<br />
<strong>2、流程管理控制台</strong><br />
&nbsp; 对流程实例（包括活动实例和工作项实例）进行管理。这里对资源的划分有两种方式：操作和数据。从操作来分比较琐碎，例如：流程实例的挂起、终止、恢复、跳转，活动实例的挂起、终止、恢复等等，当然可以做一种集合，例如：对流程实例的管理、对活动实例的管理、对工作项实例的管理、时间服务的管理等等。从数据划分则很好理解，例如：发文的流程实例、收文的活动实例等等。两种方式的组合构成最终的权限。<br />
<strong>3、工作项列表</strong><br />
&nbsp;&nbsp; &nbsp;这个似乎没什么好说的，工作项直接分配到用户、部门和岗位。<br />
<strong>4、与流程相关的业务数据</strong><br />
&nbsp;&nbsp; &nbsp;用户对业务自身的权限以及不同流程节点对业务的权限。看问题的两种方式。业务数据处于流程中时由流程决定权限，例如拟稿时可以操作哪些字段，审批时是否可以上传附件等等。流程结束后，业务数据归档，此时的权限由业务权限+流程权限组合。简单的一个例子：普通用户A可以在发文模块里看到自己参与过的所有发文文件，发文管理员B则可以看到发文模块里所有的发文文件。<br />
&nbsp;&nbsp; &nbsp;<br />
<strong>结合具体的业务需求：</strong><br />
1、主控岗位的提出。例如发文管理，存在主控岗位，可以对所有的发文流程进行管理，催办、督办等等。<br />
2、大集中模式下对数据的再划分。还是以发文管理为例，北京公司的发文管理员对北京的发文数据进行管理，上海公司的发文管理员则只能对上海的发文数据进行管理。<br />
<br />
<strong>最终的权限分类：</strong><br />
1、流程设计器里流程模板的可见与不可见。可见即可维护。<br />
2、流程管理按操作来分显得没有实际的意义，用户关注的是业务数据即操作的范围。流程实例（活动实例）的可见与不可见。可见即可操作。更进一步说，用户甚至根本都不会登录到流程管理控制台，他会倾向于在业务菜单里有自己相应的流程管理功能，例如在发文管理里增加发文催办、督办等等。<br />
3、不用<br />
4、往业务权限表里增加流程参与者的权限信息。<br />
<strong><br />
总结</strong>：总是感觉工作流管理部分的权限不是那么的必要，流程定义的复杂度让最终用户很难直接使用，流程实例的管理更多的是契合到业务中去，而这种契合表现则是流程数据按业务进行划分后的管理。
<img src ="http://www.blogjava.net/RongHao/aggbug/184703.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> 2008-03-08 16:31 <a href="http://www.blogjava.net/RongHao/archive/2008/03/08/184703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讨论一下你觉得一个工作流产品好的标准</title><link>http://www.blogjava.net/RongHao/archive/2008/02/22/181412.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 22 Feb 2008 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2008/02/22/181412.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/181412.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2008/02/22/181412.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/181412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/181412.html</trackback:ping><description><![CDATA[工作流现在已经应用的非常广泛了，审批OA等等自然不必多说，许多业务系统里也有大量的应用。前两天的<br />
一个项目就是使用工作流将整个项目管理的过程进行整合，包括了前期预算、项目进度管理、合同管理等等。<br />
可供选择的工作流也很多，商业的、开源的。那么你是如何评价一个工作流产品的好坏的呢？你的标准是什么？<br />
当然，用户也经常会问我这个问题，我的回答是：根据你实际的业务。是的，不管是什么样的工作流，都是<br />
为了满足业务的需要，你把你的需求提出来，我们看看是否满足，不能直接满足，最合适的间接方式又是什么。你说，我要有催办。是的，我们有。你说，我要有任意回退和任意流。是的，我们有。你说，我想对流程实例进行分级管理。oh,没有也，重要吗？让我们想想其他办法。你说，你们符合BPEL标准吗？这个。。。你说，你们采用了petri网模型吗？汗。。。你说，你们是SOA架构吗？。。。<br />
我的衡量标准是这样的：<br />
1、流转功能<br />
&nbsp; 包括了基本的工作流模式实现，串行、并发、分支、汇聚、循环等等。这个是最基本的。其实打开流程设计器拖拖拽拽很快就能知道这个产品到底实现了哪些流转模型。实际这个的实现也是引擎的核心。有多种模型可以选择。petri 模型应该是最灵活的了，也有很大的实现难度。但是流程模型做这么灵活，到底实际能用上多少&#8230;&#8230;就我个人的经验来说，大部分的复杂性都是由流程的分支并发（m/n）引起的，最坏的办法是强制要求客户将这些并发的任务改成 step by step 的执行。这样牺牲一点效率，还是可以把项目做成的。<br />
2、业务的内在支持<br />
&nbsp; 比如说催办、时间服务、收回等等。我觉得这个与实际业务挂钩，反而是最为主要的考虑。因为采用间接的方式必然会产生编程，而很显然会耗费成本。<br />
3、与业务的契合方式<br />
&nbsp; 流程维护流转。业务还是自己实现。如何将这两者很好的衔接起来。同时这个过程还存在权限的限定，每个运行节点对业务的权限肯定存在差别，是否有一套完整的解决方案？当然这其中也包括了组织机构的适配，对各种组织模型的支持。<br />
4、定义良好的API<br />
&nbsp; 通常会存在工作流无法直接满足的业务场景，那么肯定需要程序直接调用工作流的API，清晰且简洁的API。<br />
5、流程的仿真<br />
&nbsp; 这种仿真比较简单，目的在于检验所定义的流程是否正确。出错要有明确的提示信息。普元的单点调试？<br />
6、电子表单<br />
&nbsp; 我始终觉得电子表单目前实际应用并不理想，它仅仅只能处理简单的业务。但是销售的经验告诉我，这是一个巨大的闪光点。用户喜欢自己动手。流程定义实际最终用户很难实际操作。我在想：简化版本的流程设计器+电子表单也许会有很好的售前效果。<br />
7、良好的售后<br />
8、良好的最终用户体验<br />
9、性能<br />
10、最好能够和标准扯上关系，可是谁知道我是否真的有关系呢？<br />
<img src ="http://www.blogjava.net/RongHao/aggbug/181412.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> 2008-02-22 15:02 <a href="http://www.blogjava.net/RongHao/archive/2008/02/22/181412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对流程驱动开发的YY</title><link>http://www.blogjava.net/RongHao/archive/2007/11/02/157661.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 02 Nov 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/11/02/157661.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/157661.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/11/02/157661.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/157661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/157661.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">也许是流程做多了的缘故，所以看起程序开发来一切都是流程或者说都包含流程。个人认为大多数的企业应用（不包括特殊应用，例如文档库、信息资源库、</span><span style="font-size: 9pt;">BBS</span><span style="font-size: 9pt; font-family: 宋体;">等等）不过是对数据以一定的样式展现（表单），以一定的逻辑对数据进行操作（业务规则），以及把这些处理数据的过程以一定的流程进行管理（流程）。上面三个方面分别对应着表单、业务规则和流程。程序开发中则对应于表单引擎、规则引擎和工作流引擎。而这些方面又可以统一到一个更大范畴的流程上来，所以这里有对流程驱动开发的设想。</span></p>
<p style="text-indent: 18pt;"><span style="font-size: 9pt; font-family: 宋体;">先来看看具体的应用场景。</span></p>
<p style="margin-left: 36pt; text-indent: -18pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">单表增删改查</span></strong></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">这是最简单的情形，也没有流程，对这个情形不加讨论。但是这里会提到表单引擎，</span><span style="font-size: 9pt;">VB</span><span style="font-size: 9pt; font-family: 宋体;">里的数据控件非常的易用，没有</span><span style="font-size: 9pt;">PO</span><span style="font-size: 9pt; font-family: 宋体;">，没有</span><span style="font-size: 9pt;">DAO</span><span style="font-size: 9pt; font-family: 宋体;">，也没有</span><span style="font-size: 9pt;">Service</span><span style="font-size: 9pt; font-family: 宋体;">，直接与数据库字段进行绑定。我们的表单引擎也可以采用这种方式。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">支持表单控件（输入框、文本框、下拉框等）的拖拽，将整个表单与数据库表绑定。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/ronghao/Image00000.gif" height="332" width="628" /><br />
</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">表单控件与数据库字段的绑定。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><br />
</span></p>
<p style="margin-left: 36pt; text-indent: -18pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">单表业务</span></strong><strong><span style="font-size: 9pt;">+</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">流程</span></strong></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">比上面的情况稍微复杂一点点，也就是要在业务里引入流程，其实这也是现在工作流引擎应用最多的地方，比如说政府</span><span style="font-size: 9pt;">OA</span><span style="font-size: 9pt; font-family: 宋体;">里的收文、发文。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">这里只需要将表单与流程进行绑定，表单引擎的处理方式不变，依然是直接与数据库表进行绑定。表单负责对数据库里的业务数据进行展现，工作流则负责推动这些数据在业务意义上状态的转换，互不影响，并在需要的时候在自动节点上对这些数据进行相应的业务处理。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/ronghao/Image00001.gif" height="325" width="642" /><br />
</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">关于表单权限。这个也是表单与工作流进行绑定时所必须考虑到的问题。其实只是需要在表单引擎里引入权限角色的概念，每个角色对应于一种权限，这种权限具体说来就是表单里每个字段的可见、可编辑等等。然后在人工节点定义时指定表单权限角色即可。这样也实现了流程与表单权限一定程度上的解耦。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/ronghao/Image00002.gif" height="379" width="642" /><img alt="" src="http://www.blogjava.net/images/blogjava_net/ronghao/Image00009.gif" height="310" width="663" /></span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><br />
</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">其实还有一种更方便的方式，将表单直接与人工节点进行绑定，每个人工节点对应于不同的表单。</span></p>
<p style="margin-left: 36pt; text-indent: -18pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">复杂一点，多表关联的情况</span></strong></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">复杂一点的情况是业务往往是多表的关联。这需要对表单引擎做出扩展，让它可以根据关联字段对关联表做出查询，得到关联表的设计结构，继续映射。这让我想起了</span><span style="font-size: 9pt;">ORM</span><span style="font-size: 9pt; font-family: 宋体;">，这里很有</span><span style="font-size: 9pt;">FRM</span><span style="font-size: 9pt; font-family: 宋体;">的意思在里面。其实对于常用的关联查询往往有通用的组件可用，例如根据</span><span style="font-size: 9pt;">userid</span><span style="font-size: 9pt; font-family: 宋体;">渲染出用户名，根据数据字典的</span><span style="font-size: 9pt;">id</span><span style="font-size: 9pt; font-family: 宋体;">关联渲染出相应的值，</span><span style="font-size: 9pt;">oa</span><span style="font-size: 9pt; font-family: 宋体;">里的正文、附件、印章等等。</span></p>
<p style="margin-left: 36pt; text-indent: -18pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">流程跨越多个业务</span></strong></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">流程需要跨越多个业务，一个典型的流程如下：</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/ronghao/Image00010.gif" height="336" width="672" /><br />
</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">会议审批会涉及到两张业务表：会议室使用表，会议记录表。在会议申请和领导审批节点，最终用户打开的都是会议申请的表单，对应于会议记录表，对该表进行操作。但是流程运行到会议室管理员安排会议室的节点，该节点最终用户不仅需要看到会议申请的表单同时还要看到会议室使用情况的表单，如果有空闲的会议室，用户登记操作会议室使用表，然后通知申请者；如果没有空闲的会议室，则不用登记直接通知申请者。这个过程中跨越了两个业务，分别是会议室管理和会议管理。表单在各个节点也是不同的。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">这其实对工作流引擎提出了比较高的要求。例如如果流程已经结束，会议得到批准，但申请者突然有事要改变会议时间怎么办？回退。这里的回退无疑就需要有业务的补偿，例如要删除会议室的相关记录。</span></p>
<p style="margin-left: 36pt; text-indent: -18pt;"><strong><span style="font-size: 9pt; font-family: 宋体;">应用集成</span></strong></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">一个流程不仅会跨越多个业务，也会跨越多个系统。这里的应用场景很多，重要的是要去其他系统抓取数据和操作数据，仅仅靠数据库表对表单的映射满足不了需求。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/ronghao/Image00011.gif" /><br />
</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><span style="font-size: 9pt; font-family: 宋体;">对工作流引擎做出改进，与前面相比，需要由引擎来完成对其他系统服务的调用。这里一个很重要的载体就是</span><span style="font-size: 9pt;">XML</span><span style="font-size: 9pt; font-family: 宋体;">。首先要定义交换数据所用的</span><span style="font-size: 9pt;">XML scheme</span><span style="font-size: 9pt; font-family: 宋体;">，然后将这个</span><span style="font-size: 9pt;">XML scheme</span><span style="font-size: 9pt; font-family: 宋体;">再与表单引擎做出映射。实际执行时，工作流的自动节点会在人工节点前调用其他系统的服务，按照</span><span style="font-size: 9pt;">XML scheme</span><span style="font-size: 9pt; font-family: 宋体;">将数据转换为符合定义的</span><span style="font-size: 9pt;">XML</span><span style="font-size: 9pt; font-family: 宋体;">，在紧接着的人工节点送给表单引擎，表单引擎渲染。修改数据也是同样的过程，表单引擎将处理后的数据以</span><span style="font-size: 9pt;">XML</span><span style="font-size: 9pt; font-family: 宋体;">返回，工作流再次做出转换，调用服务的修改功能。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体;">上面五种都是比较常见的应用场景，理想的情况下，开发方式应该是这样的：画出应用流程</span><span style="font-size: 9pt; font-family: Wingdings;">&#224;</span><span style="font-size: 9pt; font-family: 宋体;">定义流程表单</span><span style="font-size: 9pt; font-family: Wingdings;">&#224;</span><span style="font-size: 9pt; font-family: 宋体;">表单与数据库进行映射</span><span style="font-size: 9pt; font-family: Wingdings;">&#224;</span><span style="font-size: 9pt; font-family: 宋体;">对流程进行业务仿真</span><span style="font-size: 9pt; font-family: Wingdings;">&#224;</span><span style="font-size: 9pt; font-family: 宋体;">完成开发。问题是这样的：你的表单引擎是否足够强大？表单与后台是直接用</span><span style="font-size: 9pt;">SQL</span><span style="font-size: 9pt; font-family: 宋体;">进行交互的，也就是</span><span style="font-size: 9pt;">Transaction Script</span><span style="font-size: 9pt; font-family: 宋体;">模式，没有业务对象，对于复杂业务逻辑如何处理？如何使用规则引擎来解决业务逻辑的问题？权限如何以一种</span><span style="font-size: 9pt;">AOP</span><span style="font-size: 9pt; font-family: 宋体;">的方式对数据操作进行横切？</span></p>
<p><span style="font-size: 9pt; font-family: 宋体;">呵呵，纯属个人</span><span style="font-size: 9pt;">YY</span><span style="font-size: 9pt; font-family: 宋体;">。</span></p>
<p style="margin-left: 36pt; text-indent: 0cm;"><strong>&nbsp;</strong></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/157661.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> 2007-11-02 10:07 <a href="http://www.blogjava.net/RongHao/archive/2007/11/02/157661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流参与者和工作项模式分析</title><link>http://www.blogjava.net/RongHao/archive/2007/10/30/157009.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 30 Oct 2007 10:06:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/10/30/157009.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/157009.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/10/30/157009.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/157009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/157009.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">原文地址：http://www.blogjava.net/RongHao/archive/2007/10/30/157009.html<br />
</span></p>
<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">对于当前的工作流应用来说，人工节点无疑扮演着一个非常重要的角色。因为无论是传统的协同办公系统还是越来越多的企业应用，都需要有人参与到具体的流程中来。这篇文章着重分析工作流应用中人工节点所涉及到的参与者模式以及与此关联的工作项模式，最后会提供部分的解决方案作为参考。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">先简单说说什么是人工节点。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">人工节点的概念是与自动节点相对的。顾名思义，人工节点就是需要有人参与的节点，在实际流程中，它体现在产生由人完成的工作项以及由人决定一些决策变量，这些决策变量会对流程的运行产生影响（例如分支的选择等等）。自动节点则是由工作流引擎自己调用完成，不需要人的参与，通常是执行定制的业务操作。相比较而言，人工节点更多的应用在管理流程里，而自动节点更多的则是应用在企业业务流程里。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">人工节点的职责有三个：第一是决定该节点的参与者；第二是根据参与者生成需要人来处理的工作项；最后是当工作项被参与者处理完毕时，它将继续触发流程的流转。参与者处理工作项时可以处理相应的业务和设置流程决策变量。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">下面我们就按照这三个职责分别对人工节点所涉及到的参与者模式和工作项模式进行分析。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><strong><span style="font-size: 12pt;" lang="EN-US"><span>1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span></strong><!--[endif]--><strong><span style="font-size: 12pt; font-family: 宋体;">决定参与者模式</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">换句话说就是决定该节点的参与者，这里有两种模式：引擎自动获取和最终用户指定。</span><span style="font-size: 12pt;" lang="EN-US"><o:p><br />
&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US">1</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">．</span></strong><strong><span style="font-size: 12pt;" lang="EN-US">1</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">引擎自动获取</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">所谓引擎自动获取就是由引擎在运行期计算实际的节点参与者，不需要最终用户的参与。这个计算基于流程定义时对该节点参与者的定义。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span>（1）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">直接指定人员、部门或角色</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">这种情况最简单，也最直接，用户定义节点时直接在组织用户树里选定人员、部门或角色，然后在运行期根据定义执行与或者是或的运算。大多数的工作流引擎都支持这种模式。但很明显它也存在着很大的局限性，它是静态的，一旦流程定义完毕参与者也就跟着固定下来，运行期的任何变化都不会对参与者造成影响，一个很简单的需求，请假流程，节点的参与者需要是当前申请者的部门领导，因为申请者在定义期是不确定的，所以根本无法指定节点的参与者，所以这种模式远远满足不了用户稍微复杂一点的需求。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span>（2）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">调用用户定制的计算参与者代码</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">这种情况通常是由引擎提供一个接口或是父类，用户需要实现或是继承这个接口或父类，然后实现相应的方法。这个方法通常会传递进一个执行上下文的参数，用户代码通过这个上下文可以访问到当前流程实例的信息，例如当前节点状态，工作流变量等等，然后用户可以根据实际业务和当前流程实例信息进行逻辑计算，最后返回一个参与者的</span><span style="font-size: 12pt;" lang="EN-US">ID</span><span style="font-size: 12pt; font-family: 宋体;">集合。对于上一个模式里提到的计算当前申请者部门领导的例子，这个模式实现起来非常简单，首先获得当前申请者</span><span style="font-size: 12pt;" lang="EN-US">ID</span><span style="font-size: 12pt; font-family: 宋体;">，然后在根据这个</span><span style="font-size: 12pt;" lang="EN-US">ID</span><span style="font-size: 12pt; font-family: 宋体;">找出该申请者部门再找出该部门领导即可。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">实际流程运行到该节点就会调用用户自己定制的计算参与者的代码，方法返回的参与者</span><span style="font-size: 12pt;" lang="EN-US">ID</span><span style="font-size: 12pt; font-family: 宋体;">即作为该节点的实际参与者。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">这种模式对于工作流引擎的实现而言最为简单，因为它把最大的复杂性都抛给了用户，由用户代码来计算实际的参与者。实际上很多开源的工作流引擎采用的都是这种方式，例如</span><span style="font-size: 12pt;" lang="EN-US">JBPM</span><span style="font-size: 12pt; font-family: 宋体;">。但是这种方式给用户带来最大灵活性的同时也带来了复杂和烦琐。特别是当面对一个数量巨大的流程需求时，为每一个流程的每一个人工节点都定义一个参与者计算类是让人头疼的。再加上现在强调业务的敏捷，业务里的改变要迅速反馈到流程的定义里，让最终用户来编写或修改这个参与者计算类不现实也不可能。补充一下，这也是用户在考虑采用开源的工作流引擎还是商业工作流引擎时需要着重考虑的一个方面。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span>（3）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">指定前续节点的参与者</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">实际上是用户在节点定义时指定参与者为前续某个节点的参与者，当流程运行到该节点，引擎会自动获取所指定的前续节点的参与者作为该节点的实际参与者。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">这个模式实现起来并不困难，大多数商业工作流引擎都对该模式进行了支持。它能够满足用户的部分特定需求。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span>（4）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">更为复杂的情况</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">用户的需求永远是复杂的，引擎所要做得就是尽量降低这种复杂性，流程的变化要能够迅速跟上业务的变化。考虑下面两种稍微复杂一点但是又很常见的需求。需求一：参与者为当前申请者的部门领导且职位为副总；需求二：参与者需要是测试部的所有女同事。这两种需求模式</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">3</span><span style="font-size: 12pt; font-family: 宋体;">都不能满足，</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">可以，但是正如提到的那样，模式</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">可能会非常的烦琐，不能适应业务的敏捷。其实这里的复杂性主要体现在：</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、这里的参与者可能是运行期决定的；</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">、参与者的限制条件可能非常多，而这些条件不是简单的部门、角色或职位所能描述的。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">对于一般的工作流引擎而言，它们都会选择模式</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">的实现，让用户自己实现逻辑。实际在后面的部分解决方案里，我们会看到更为好一点的实现方式。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 36pt;"><strong><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US">1.2</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">最终用户指定</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">运行期由最终用户来决定节点的参与者。这也是中国国情所独有的特色。这种模式最为常见的就是用户提交工作项时的提交页面，用户在该页面上选定下一节点（多数分支用户选定时）和下一节点的参与者。这种模式本身并不困难，问题在于在提交页面需要给用户提供一个参与者的选择范围，让用户进行选择。而关于这个选择范围，则又回到前面所提到的引擎自动获取的模式，这个范围同样是需要引擎计算的。于是又回到了刚刚讨论过的四种模式。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US">2</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">、参与者执行模式</span></strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">现在，已经获得了节点的参与者。引擎下一步将会根据这个参与者生成工作项，注意，这里的参与者可能是一个人，也可能会是一个人员范围（即多个人）。于是就产生了参与者的执行模式，也可以理解为工作项的生成模式。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US">2.1</span><strong><span style="font-size: 12pt; font-family: 宋体;">竞争参与</span></strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-size: 12pt; font-family: 宋体;">当有多个参与者参与这个节点时就会产生竞争参与这个模式。同样一个工作，</span><span style="font-size: 12pt;" lang="EN-US">A</span><span style="font-size: 12pt; font-family: 宋体;">可以完成，</span><span style="font-size: 12pt;" lang="EN-US">B</span><span style="font-size: 12pt; font-family: 宋体;">也可以完成，于是就产生竞争，谁先开始这项工作，就由谁负责完成该工作。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US">2.2</span><strong><span style="font-size: 12pt; font-family: 宋体;">顺序参与</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">多个参与者按照指定的顺序完成该工作项。</span><span style="font-size: 12pt;" lang="EN-US">A</span><span style="font-size: 12pt; font-family: 宋体;">完成之后由</span><span style="font-size: 12pt;" lang="EN-US">B</span><span style="font-size: 12pt; font-family: 宋体;">完成，</span><span style="font-size: 12pt;" lang="EN-US">B</span><span style="font-size: 12pt; font-family: 宋体;">完成之后再交给</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">完成。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US">2.3</span><strong><span style="font-size: 12pt; font-family: 宋体;">同时参与</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">多个参与者同时对工作进行处理，所有参与者均完成后，流程继续向后流转。这个模式其实比较复杂，因为这里同时涉及到一个完成规则：是所有参与者均完成工作项后流程流转，还是有其他规则？例如完成</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">个工作项即可流转，完成</span><span style="font-size: 12pt;" lang="EN-US">80%</span><span style="font-size: 12pt; font-family: 宋体;">的工作项即可流转。稍候会讨论到。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt;" lang="EN-US">2.4</span><strong><span style="font-size: 12pt; font-family: 宋体;">负载均衡</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp; </span></span></strong><span style="font-size: 12pt; font-family: 宋体;">这也是一个常见的需求。这项工作</span><span style="font-size: 12pt;" lang="EN-US">A</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">B</span><span style="font-size: 12pt; font-family: 宋体;">都可以完成，但是</span><span style="font-size: 12pt;" lang="EN-US">A</span><span style="font-size: 12pt; font-family: 宋体;">目前有</span><span style="font-size: 12pt;" lang="EN-US">10</span><span style="font-size: 12pt; font-family: 宋体;">个待办工作项，</span><span style="font-size: 12pt;" lang="EN-US">B</span><span style="font-size: 12pt; font-family: 宋体;">只有</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">个待办工作项。于是用户期望该工作交由</span><span style="font-size: 12pt;" lang="EN-US">B</span><span style="font-size: 12pt; font-family: 宋体;">来完成。这里需要实现一个简单的负载均衡。其实这种情况只是智能决策的一种最简单的情况，所谓智能决策是指系统能够根据一定的指标（由数据分析，例如人员的处理效率，工作负载等等）和规则来决定该节点的参与者。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18.75pt; text-indent: -18.75pt;"><!--[if !supportLists]--><strong><span style="font-size: 12pt;" lang="EN-US"><span>3、</span></span></strong><!--[endif]--><strong><span style="font-size: 12pt; font-family: 宋体;">工作项完成模式</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-size: 12pt; font-family: 宋体;">这个模式在参与者执行模式为同时参与时有效。在说到这个模式之前，先简单说说工作项可能存在的几种特殊状态，这些状态包括挂起、人工终止和委派。挂起就是工作项暂时停止执行，挂起会影响到流程的流转，会导致流程的挂起。人工终止则是人工手动改变该工作项的状态，使该工作项终止执行，这个人通常会是管理员。人工终止也会对流程流转产生影响，当除去该工作项之外的所有工作项都完成时，人工终止该工作项会触发流程的流转。委派就是将该工作项委派给他人完成，同时该工作项也就结束了。人工终止和委派是工作项结束的特殊状态。</span><span style="font-size: 12pt;" lang="EN-US"><o:p><br />
&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><strong><span style="font-size: 12pt;" lang="EN-US">3.1</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">全部完成</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-size: 12pt; font-family: 宋体;">当所有工作项都结束时触发节点的结束和流程的流转。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><strong><span style="font-size: 12pt;" lang="EN-US">3.2</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">完成规定的个数</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-size: 12pt; font-family: 宋体;">节点定义时指定工作项必须完成的个数，当完成的工作项达到这个指定的个数时触发节点的结束和流程的流转。</span><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><strong><span style="font-size: 12pt;" lang="EN-US">3.3</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">完成规定的百分比</span></strong><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-size: 12pt; font-family: 宋体;">节点定义时指定工作项必须完成的百分比，当完成的工作项占所有工作项的比例达到这个指定的百分比时触发节点的结束和流程的流转。</span><span style="font-size: 12pt;" lang="EN-US"><o:p><br />
&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体;">其实这里很明显的可以看出不管是所谓的参与者执行模式还是工作项完成模式不过都是一定的规则，既然是一定的规则那必然就限定了应用的灵活性，用户能否自定义规则？根据业务灵活地修改规则？规则引擎</span><span style="font-size: 12pt;" lang="EN-US">+DSL</span><span style="font-size: 12pt; font-family: 宋体;">应该是一个不错的选择。</span><strong><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></strong></p>
<img src ="http://www.blogjava.net/RongHao/aggbug/157009.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> 2007-10-30 18:06 <a href="http://www.blogjava.net/RongHao/archive/2007/10/30/157009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件研发-我们缺失的一环</title><link>http://www.blogjava.net/RongHao/archive/2007/10/29/156630.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 29 Oct 2007 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/10/29/156630.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/156630.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/10/29/156630.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/156630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/156630.html</trackback:ping><description><![CDATA[周末参加了清华大学信息系统与工程研究所组织的一次工作流研讨会。<br />
会上清华大学的研究人员介绍了他们对工作流研究的一些成果。其中主要关注了数据挖掘和分析。<br />
关于数据挖掘，有两个方面。第一个方面是当企业没有应用工作流时，对企业日常数据进行挖掘，分析数据<br />
之间的关联和逻辑，得出一套基本的企业应用业务流程，为将来应用工作流做出准备；第二个方面是当企业<br />
已有工作流应用时，对相关流程数据进行挖掘，根据数据描绘出正在运行的流程，很显然，这个方面与流程<br />
仿真有关。<br />
关于数据分析，则主要是对流程数据进行分析，这个涉及的内容就比较多，包括流程的运行效率，人员效率<br />
分析，统计等等。其中有一个非常有趣的例子：贪官A试图逃跑，逃跑前是有一定前兆的，比如向国外转移<br />
账款，给小蜜频繁打电话，工作效率降低等等。于是数据分析就可以起作用，对A最近的所有数据进行分析，<br />
得出他将要逃跑的结论。而来自有生博大的赵斌，谈论到他们已经实施的项目中，涉及到对一些电子公文<br />
流程中的办文统计，并依据&#8220;指标&#8221;进行工作量和效率的分析。<br />
这其实也反映出我们工作流软件中缺失的部分：数据分析-数据统计-优化流程。而这也正是BPM的重要功能之一。也是未来发展的趋势。功能缺失最重要的原因在于实际上我们的软件没有研发只有开发。具体他们略微谈到了他们一些实现的方式，非常的理论，涉及到算法，数据结构等等。我们软件开发最主要的是满足用户的各种业务需求，比如说回退、收回、会签等等，这也是现实情况所决定的，开发团队的人员通常都不是很多，并且这种分析挖掘需要的人员无疑需要很高的理论水准，这个本科往往是达不到的(不得不承认研究生和博士就是比本科要优秀)，博士硕士的研发团队的开发成本会非常的高，并且实际产生的利润很难评价，对于不大的公司来讲这个是很难接受的。于是就造成了这种状况：软件研发缺失掉了。<br />
依托高校是个不错的想法，但是依托高校不等于说你把办公地点搬到清华大学门口就是依托高校了，也有这种依托，那是买煎饼的。<br />
<img src ="http://www.blogjava.net/RongHao/aggbug/156630.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> 2007-10-29 11:57 <a href="http://www.blogjava.net/RongHao/archive/2007/10/29/156630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作流开发小结</title><link>http://www.blogjava.net/RongHao/archive/2007/08/27/140051.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 27 Aug 2007 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/08/27/140051.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/140051.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/08/27/140051.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/140051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/140051.html</trackback:ping><description><![CDATA[工作流开发已经有一段时间了，这里把自己的一些想法小结一下。仅仅就工作流引擎来说，不包括一些外围的实现，例如流程定义器，管理控制，工作项列表等。<br>工作流引擎其实就是一个状态机，只不过在状态变化的过程中加入了其他一些工作。我把工作流引擎的职责理解为以下四个方面：<br>1、对工作流模式的支持。<br>&nbsp;&nbsp; 这无疑是最重要的部分，状态的变迁往往取决于不同模式的选择。支持的模式越多则客户的开发代码会越少。衡量一个工作流引擎的技术水准很大程度取决于引擎支持模式的多少。<br>2、工作流变量的传递和转换。<br>&nbsp;&nbsp; 工作流引擎通过工作流变量与外部应用交互，工作流变量在各个活动节点以及父流程与子流程之间传递。变量除基本类型（String,int等）以外，也需要支持一些复杂的数据类型（例如对象，以一种配置映射的方式）。这里还涉及到一个上下文的问题。<br>3、任务项的分配。<br>&nbsp;&nbsp; 任务项的分配往往和工作流组织权限联系起来，其实工作流组织权限存在的目的就是决定任务项分配，决定由谁来完成这个工作项。工作项涉及到的内容也比较多，比如工作项的回退，撤回等等。<br>4、调用外部应用。<br>&nbsp;&nbsp; 单纯的表单推动已经不再适用，活动节点本身需要支持许多的业务操作，而这些操作与引擎本身是无关的，与外部的应用有关，所以就需要引擎提供一种调用外部应用的机制。外部应用可以是javabean,webservice,rcp等等形式。<br>除去上述四方面还有一些外围的工作：例如时间服务，节点的事件机制等等。<br>对客户而言，他们需要的仅仅只有两个接口：任务项管理接口（比如提交任务项，委派任务项等等）和流程状态管理接口（比如启动一个新的流程实例，推动流程流转等等）。在理想的情况下，给用户提供一个封装完全的提交页面和父类Action也是很好的一种方法。<br><img src ="http://www.blogjava.net/RongHao/aggbug/140051.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> 2007-08-27 17:21 <a href="http://www.blogjava.net/RongHao/archive/2007/08/27/140051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS学习笔记</title><link>http://www.blogjava.net/RongHao/archive/2007/06/12/123644.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 12 Jun 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/12/123644.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/123644.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/12/123644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/123644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/123644.html</trackback:ping><description><![CDATA[这是我前年AXIS学习的笔记，最早写在了JR上，是分散的五篇（其中一篇是转载）。按内容分别是：<br>1、<a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123633.html">介绍AXIS</a><br>2、<a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123634.html">使用Handler来增强Web服务的功能（这是一篇转载）</a><br>3、<a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123635.html">建立安全的AXIS服务(上)</a><br>4、<a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123636.html">建立安全的AXIS服务(下)</a><br>5、<a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html">AXIS服务间传递JavaBean及其安全解决</a><br>其实很多内容现在自己看来写的都很浅显，包括输出大量使用了System.out以及没有测试。这里也不打算<br>修改了，简单整理了一下并提供源代码的下载。希望能给需要的人一些帮助。<br><a  href="http://www.blogjava.net/Files/RongHao/soapTest.zip">代码下载</a><br> <img src ="http://www.blogjava.net/RongHao/aggbug/123644.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> 2007-06-12 16:36 <a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS服务间传递JavaBean及其安全解决</title><link>http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 12 Jun 2007 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/123638.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/123638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/123638.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是AXIS学习笔记的最后一篇。在前面我们讨论了最简单的HelloWorld服务，客户端并没有向服务器端传递参数，现在我们来传JavaBean。当然，也可以传递你自己定义的JAVA类，但那样你必须自己创建专门的XML序列化器和反序列化器；而对JavaBean，AXIS提供了现成的序列化器。（有人说：懒惰是程序员最大的美德）&nbsp;&nbsp;一、服务器端&nbsp;&nbsp;1、...&nbsp;&nbsp;<a href='http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html'>阅读全文</a><img src ="http://www.blogjava.net/RongHao/aggbug/123638.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> 2007-06-12 16:25 <a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建立安全的AXIS服务（下）</title><link>http://www.blogjava.net/RongHao/archive/2007/06/12/123636.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 12 Jun 2007 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/12/123636.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/123636.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/12/123636.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/123636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/123636.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 四、使用WS-Security规范对信息进行加密与身份认证&nbsp;&nbsp;&nbsp;&nbsp;我们打算用Handler结合WSSecurity实现Web服务安全&nbsp;&nbsp;&nbsp;&nbsp;设想流程：用WSClientRequestHandler.java位于客户端对客户端发出的XML文档进行加密&nbsp; WSServerRequestHandler.ja...&nbsp;&nbsp;<a href='http://www.blogjava.net/RongHao/archive/2007/06/12/123636.html'>阅读全文</a><img src ="http://www.blogjava.net/RongHao/aggbug/123636.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> 2007-06-12 16:20 <a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建立安全的AXIS服务(上)</title><link>http://www.blogjava.net/RongHao/archive/2007/06/12/123635.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 12 Jun 2007 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/12/123635.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/123635.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/12/123635.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/123635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/123635.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前面的文章中，我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全问题。根据应用的对安全要求的级别不同，可以采用不同的方式来实现安全性，以下是目前最常用的一些实现方式（从低到高排列）：&nbsp;&nbsp;&nbsp;&nbsp;1、J2EE&nbsp;Web应用默认的访问控制（数据是明文的）；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、使用a...&nbsp;&nbsp;<a href='http://www.blogjava.net/RongHao/archive/2007/06/12/123635.html'>阅读全文</a><img src ="http://www.blogjava.net/RongHao/aggbug/123635.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> 2007-06-12 16:10 <a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Handler来增强Web服务的功能</title><link>http://www.blogjava.net/RongHao/archive/2007/06/12/123634.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 12 Jun 2007 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/12/123634.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/123634.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/12/123634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/123634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/123634.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文作者：&nbsp;陈亚强原文链接：http://www.ibm.com/developerworks/cn/webservices/ws-handler/index.html高级软件工程师,&nbsp;北京华园天一科技有限公司&nbsp;2003&nbsp;年&nbsp;8&nbsp;月&nbsp;一、Handler的基本概念J2EE&nbsp;Web&nbsp;服务中的H...&nbsp;&nbsp;<a href='http://www.blogjava.net/RongHao/archive/2007/06/12/123634.html'>阅读全文</a><img src ="http://www.blogjava.net/RongHao/aggbug/123634.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> 2007-06-12 16:01 <a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解AXIS</title><link>http://www.blogjava.net/RongHao/archive/2007/06/12/123633.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 12 Jun 2007 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/12/123633.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/123633.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/12/123633.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/123633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/123633.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><strong><span style="font-family: 宋体;">一、软件环境</span></strong><span lang="EN-US"><br>
<br>
&nbsp;1</span><span style="font-family: 宋体;">、</span><span lang="EN-US">axis-1_2&nbsp;&nbsp;(</span><span style="font-family: 宋体;">从</span><span lang="EN-US">apache</span><span style="font-family: 宋体;">网站下载最新</span><span lang="EN-US">axis-bin-1_2.zip</span><span style="font-family: 宋体;">解压即可）</span><span lang="EN-US"><br>
<br>
&nbsp;2</span><span style="font-family: 宋体;">、</span><span lang="EN-US">Tomcat5.0&nbsp;<br>
<br>
&nbsp;3</span><span style="font-family: 宋体;">、</span><span lang="EN-US">JDK5.0<br>
<br>
</span><strong><span style="font-family: 宋体;">二、相关配置</span></strong><span lang="EN-US"><br>
<br>
&nbsp;1</span><span style="font-family: 宋体;">、在你的</span><span lang="EN-US">%TOMCAT_HOME%\common\lib</span><span style="font-family: 宋体;">下需要加入三个包</span><span lang="EN-US">&nbsp;activation.jar</span><span style="font-family: 宋体;">、</span><span lang="EN-US">mail.jar</span><span style="font-family: 宋体;">、</span><span lang="EN-US">tools.jar<br>
<br>
&nbsp;2</span><span style="font-family: 宋体;">、环境变量设置</span><span lang="EN-US"><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AXIS_HOME&nbsp;</span><span style="font-family: 宋体;">即</span><span lang="EN-US">axis-bin-1_2.zip</span><span style="font-family: 宋体;">解压的目录（我的是在</span><span lang="EN-US">F:\soap\axis-1_2</span><span style="font-family: 宋体;">）</span><span lang="EN-US"><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AXIS_LIB&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体;">即</span><span lang="EN-US">&nbsp;%AXIS_HOME%\lib<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;AXISCLASSPATH&nbsp;</span><span style="font-family: 宋体;">即</span><span lang="EN-US">&nbsp;%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;</span></p>
<p class="MsoNormal"><span lang="EN-US">%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;</span><span style="font-family: 宋体;">也就是把</span><span lang="EN-US">%AXIS_LIB%</span><span style="font-family: 宋体;">下所用</span><span lang="EN-US">JAR</span><span style="font-family: 宋体;">文件都导入</span><span lang="EN-US"><br>
<br>
</span><strong><span style="font-family: 宋体;">三、实验一下</span></strong><span lang="EN-US"><br>
<br>
&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体;">在</span><span lang="EN-US">%AXIS_HOME%\webapps</span><span style="font-family: 宋体;">下找到</span><span lang="EN-US">axis</span><span style="font-family: 宋体;">文件夹，将其整个拷贝到</span><span lang="EN-US">%TOMCAT_HOME%\webapps</span><span style="font-family: 宋体;">下，启动</span><span lang="EN-US"><br>
<br>
&nbsp;&nbsp;Tomcat,</span><span style="font-family: 宋体;">打开浏览器访问</span><span lang="EN-US"><a href="http://localhost:8080/axis/">http://localhost:8080/axis/</a></span><span style="font-family: 宋体;">，出现以下页面说明你配置成功了。很简单吧：）</span><span lang="EN-US"><br>
<br>
<br>
</span><strong><span style="font-family: 宋体;">四、发布我们的第一个程序</span></strong><span lang="EN-US"><br>
<br>
&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体;">第一个程序简单的返回</span><span lang="EN-US">HELLO&nbsp;WORLD</span><span style="font-family: 宋体;">！</span><span lang="EN-US"><br>
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;HelloWorld.java<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloWorld&nbsp;{<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;sayHello()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">HELLO&nbsp;WORLD!</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;<br>&nbsp;&nbsp;}&nbsp;<br>}</span></div>
<br>
<br>
</span><strong><span style="font-family: 宋体;">我们的第一种发布方式：</span></strong><span lang="EN-US"><br>
<br>
</span><span style="font-family: 宋体;">将</span><span lang="EN-US">HelloWorld.java</span><span style="font-family: 宋体;">拷贝到</span><span lang="EN-US">%TOMCAT_HOME%\webapps\axis</span><span style="font-family: 宋体;">下，然后将其改名为</span><span lang="EN-US">HelloWorld.jws,</span><span style="font-family: 宋体;">这样</span><span lang="EN-US">AXIS</span><span style="font-family: 宋体;">就自然将其发布了。现在写个客户端程序访问一下：</span><span lang="EN-US"><br>
</span><span lang="EN-US">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">TestClient.java<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis.client.Call;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis.client.Service;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.xml.rpc.ParameterMode;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TestClient<br>{<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://localhost:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">8080</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/axis/HelloWorld.jws</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">指明服务所在位置</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;&nbsp;service&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Service();&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建一个Service实例，注意是必须的！</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Call)&nbsp;service.createCall();</span><span style="color: #008000;">//</span><span style="color: #008000;">创建Call实例，也是必须的！</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.net.URL(endpoint)&nbsp;);</span><span style="color: #008000;">//</span><span style="color: #008000;">为Call设置服务的位置</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">sayHello</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;);</span><span style="color: #008000;">//</span><span style="color: #008000;">注意方法名与HelloWorld.java中一样！！</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;res&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)&nbsp;call.invoke(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Object[]&nbsp;{}&nbsp;);</span><span style="color: #008000;">//</span><span style="color: #008000;">返回String，没有传入参数</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&nbsp;res&nbsp;);<br>&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>
<br>
</span><span style="font-family: 宋体;">我的测试是在</span><span lang="EN-US">jbuilder2005</span><span style="font-family: 宋体;">中，注意项目中要导入其自带的</span><span lang="EN-US">AXIS</span><span style="font-family: 宋体;">包（当然应该把其中</span><span lang="EN-US">JAR</span><span style="font-family: 宋体;">文件替换一下），可以看到程序返回了</span><span lang="EN-US">&nbsp;"HELLO&nbsp;WORLD!"<br>
<br>
</span><span style="font-family: 宋体;">可以看到在</span><span lang="EN-US">AXIS</span><span style="font-family: 宋体;">里发布服务其实是一件很容易的事，这是因为这个服务很简单的原因：）下面我们介绍第二种发布方式，这是常用的。</span><span lang="EN-US"><br>
<br>
</span><strong><span style="font-family: 宋体;">我们的第二种发布方式：</span></strong><span lang="EN-US"><br>
<br>
1</span><span style="font-family: 宋体;">、将</span><span lang="EN-US">HelloWorld.java</span><span style="font-family: 宋体;">编译成</span><span lang="EN-US">HelloWorld.class,</span><span style="font-family: 宋体;">放到</span><span lang="EN-US">%TOMCAT_HOME%\webapps\axis\WEB-INF\classes</span><span style="font-family: 宋体;">下</span><span lang="EN-US"><br>
<br>
2</span><span style="font-family: 宋体;">、在</span><span lang="EN-US">%TOMCAT_HOME%\webapps\axis\WEB-INF</span><span style="font-family: 宋体;">下新建</span><span lang="EN-US">deploy.wsdd</span><span style="font-family: 宋体;">文件，即</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">服务发布描述文件</span><span lang="EN-US"><br>
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deploy.wsdd<br><br></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">deployment&nbsp;xmlns</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://xml.apache.org/axis/wsdd/</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns:java</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://xml.apache.org/axis/wsdd/providers/java</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">service&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">HelloWorld</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;provider</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java:RPC</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">parameter&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">className</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">HelloWorld</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">parameter&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">allowedMethods</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sayHello</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">service</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">deployment</span><span style="color: #000000;">&gt;</span></div>
<br>
<br>
</span><span style="font-family: 宋体;">在</span><span lang="EN-US">DOS</span><span style="font-family: 宋体;">下转换目录到</span><span lang="EN-US">%TOMCAT_HOME%\webapps\axis\WEB-INF</span><span style="font-family: 宋体;">，命令：</span><span lang="EN-US"><br>
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">java&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">cp&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">AXISCLASSPATH</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;org.apache.axis.client.AdminClient&nbsp;deploy.wsdd</span></div>
<br>
</span><span style="font-family: 宋体;">你会发现目录下多了一个</span><span lang="EN-US">server-config.wsdd</span><span style="font-family: 宋体;">文件，这就是</span><span lang="EN-US">AXIS</span><span style="font-family: 宋体;">的配置文件，以后所有的服务发布描述都会在里面找到。（当然，你可以直接修改它，不用再写</span><span lang="EN-US">deploy.wsdd</span><span style="font-family: 宋体;">）然后打开浏览器</span><span lang="EN-US">http://localhost:8080/axis/servlet/AxisServlet</span><span style="font-family: 宋体;">，你就会看到你的服务已发布</span><span lang="EN-US"><br>
<br>
</span><span style="font-family: 宋体;">同样用客户端程序访问一下：（注意和上边的差别！！）</span><span lang="EN-US"><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">HelloClient.java<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis.client.Call;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.axis.client.Service;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloClient<br>{<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://localhost:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">8080</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/axis/services/HelloWorld</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">注意！差别仅仅在这里！！</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;&nbsp;service&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Service();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Call)&nbsp;service.createCall();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.net.URL(endpoint)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(</span><span style="color: #000000;">"</span><span style="color: #000000;">sayHello</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;res&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)&nbsp;call.invoke(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Object[]&nbsp;{}&nbsp;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;res&nbsp;);<br>&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br></span><span lang="EN-US"></span></p><img src ="http://www.blogjava.net/RongHao/aggbug/123633.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> 2007-06-12 15:48 <a href="http://www.blogjava.net/RongHao/archive/2007/06/12/123633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BPM正当时，workflow持续增长</title><link>http://www.blogjava.net/RongHao/archive/2007/06/08/122900.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 08 Jun 2007 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/06/08/122900.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/122900.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/06/08/122900.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/122900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/122900.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 这段时间突然多了好多客户演示，与单纯的OA不同，这次客户的项目涉及比较广泛，有税务有银行甚至还有erp，都是业务系统。与OA相比，更多的业务操作加入到了流程当中。这是个很好的现象，workflow的市场在持续增长。用户本身以前从来没有用过工作流，都是从去年才开始逐渐关注。有流程的地方就应该有工作流，这是用户的一个认知过程。工作流的使用在大众化，并不再局限于OA和一些特定的领域，由此带来的必然是工作流的竞争加剧和价格的白菜化。<br>&nbsp;&nbsp;&nbsp; 对工作流厂商来说，我觉得现在是一个很好的机会。就工作流系统本身，各个厂家产品的功能应该相差并不多，关键还在于产品的成熟度，如果听到用户抱怨他们成了你的测试部时，那你基本上就完了。在大的功能相差不大的情况下，剩下的就是用户体验，如何尽可能的让用户开发方便，良好的可扩展的接口固然不错，提供几个典型的实现就更好了。甚至在对方也采用webwork、struts的情况下可以提供已封装好的action,或者页面组件。最后不得不提的是价格，对一个成熟的产品来说，实际上它的成本是接近于0的，但实际情况切是往往需要很多的技术支持，越是不成熟的产品它的成本必然越高。就功能上来说，门户搭配工作项列表比单纯的工作项列表要好很多。<br>&nbsp;&nbsp;&nbsp; 在workflow价格低廉的情况下，BPM无疑是一个新的利润点。workflow在大多情况下是一种嵌入式，BPM则是独立部署。在用户实际业务集成的需求下，BPM更多的是一种高端的产品出现。目前国内真正意义上的BPM还是处于空白的状态，有的也只是在workflow中加入一些统计和报表的功能，一种概念上的炒作。所以说现在BPM正当时，对工作流厂家来说，BPM应该是努力的方向。<br>&nbsp;&nbsp;&nbsp; 但是BPM对于很多研发团队只有几个人的厂家来说是否又过于遥远呢？<br><img src ="http://www.blogjava.net/RongHao/aggbug/122900.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> 2007-06-08 17:36 <a href="http://www.blogjava.net/RongHao/archive/2007/06/08/122900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说说所谓的业务平台</title><link>http://www.blogjava.net/RongHao/archive/2007/05/22/119151.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 22 May 2007 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/05/22/119151.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/119151.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/05/22/119151.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/119151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/119151.html</trackback:ping><description><![CDATA[平台现在无疑已经是一个用滥的概念。先来看看业务平台的定义：是为企业提供的一个可快速开发的、稳定的、成熟的业务基础开发平台。实际上在一个技术人员的眼里，平台=类springside的开发框架+一套组织机构+和组织机构相适应的一套权限系统+门户+信息资源库+工作流引擎+一些通用的业务模块。因为一直做关于所谓业务平台的开发，有过困惑也有思考，这里说说自己对于平台的一些想法，也希望大家多多拍砖。我认为一个好的业务平台应该做到下面的几点：<br><span style="font-weight: bold;">1、业务性</span>。 <br>&nbsp;&nbsp; 这个问题我曾经和胡长城有过很长时间的争论。最后我得承认胡兄的正确性：业务确实是一个平台的根本。一个业务平台如果不满足业务的需求，那么它存在的意义就值得怀疑。一个很简单的例子，协同办公中不可缺少的发文管理，正文需要用到电子签章，业务中有这个需求，平台不支持，那么这个平台就不是个好的业务平台。<br><span style="font-weight: bold;">2、易用性</span><br>&nbsp;&nbsp; 业务平台不是面对最终用户的，它需要做二次开发。这样平台对程序员的友好性就相当重要，毕竟平台的使用者还是程序员。<br>&nbsp;&nbsp; <span style="font-weight: bold;">基础代码生成是必要的</span>，不管你采用何种方式，是根据已有表格来生成模型和相应代码还是先画出模型再来生成表格和相应代码（所谓的MDA）。平台的代码结构最好能够和IDE有个良好的结合，因为项目的开发往往是几个程序员协作的过程，平台对代码开发的支持不可能做到IDE的水平。最好的方式是生成的代码自动在IDE里有着清晰的结构，在IDE里编辑、测试自己的代码，然后自动发布到平台相应目录中，启动平台，代码运行成功。eclipse插件是个很好的选择。<br>&nbsp;&nbsp; <span style="font-weight: bold;">良好的API的支持</span>，开发中不可避免的会与平台已有的组织机构模型和权限系统交互，这样良好的、封装清晰的API支持就很重要。<br>&nbsp;&nbsp; <span style="font-weight: bold;">页面组件的支持</span>。往往有时候凌乱的WEB页面最让人头疼。对常用的一些页面元素可以用标签或是AJAX做进一步的封装。比如树组件、弹出层组件、分页组件等等。与这些相比，一些业务页面组件的封装也很重要。比如需要在页面选择用户，直接封装出一个用户选择组件，而不用开发人员在页面用弹出层+用户树自己再去组装。再比如说发文中的签批意见，可以用AJAX直接封装到页面里，不用用户自己调用相应API。意思就是让用户开发尽量简单，把工作从代码里尽量推到页面上去。<br><span style="font-weight: bold;">3、模块化。</span><br>&nbsp;&nbsp; 尽管这个或类似概念（比如说组件、构件）一再被平台厂家们提及，我对实际的实现一直报怀疑的态度。实际的实现往往是对模块的一个模拟。这里的模块实际上是对代码做出的一种人为上的区分，所谓的模块配置，更直接一点就是页面URL的配置。与代码行为无关，与运行期管理更没关。<br><span style="font-weight: bold;">4、可扩展性</span><br>&nbsp;&nbsp; 这个暂且不说，很大的一个话题。<br><span style="font-weight: bold;">5、前瞻性</span>。<br>&nbsp;&nbsp; 一个优秀的平台凭什么和别人不同，一个很重要的一点就是平台的前瞻性。一句话，就是要有别人没有的东西。个人非常看好未来对业务整合的需求，遗留的业务系统+国外大厂商的概念轰炸让客户开口就是业务整合、BPM。是时候不再忽悠而是做点实际的东西了。<br>可以说，业务性+易用性在现阶段就是一个很好的平台了。如果再有些前瞻性的东西（注意：不是口头上！）这个平台应该说很优秀了。至于模块化、可扩展性，想想，现在只能说忽悠了。<br><img src ="http://www.blogjava.net/RongHao/aggbug/119151.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> 2007-05-22 16:22 <a href="http://www.blogjava.net/RongHao/archive/2007/05/22/119151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也来说说应用集成</title><link>http://www.blogjava.net/RongHao/archive/2007/05/18/118435.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Fri, 18 May 2007 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/05/18/118435.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/118435.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/05/18/118435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/118435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/118435.html</trackback:ping><description><![CDATA[随着近两年来各企业/单位的基础系统的建设，应用集成的需求已经越来越急切。个人认为现在的应用集成可以分为以下三种情况：<br><span style="font-weight: bold;">&nbsp; 一、门户+单点登录</span>。这种情况最简单，说白了就是简单的页面集成。各个系统通过门户统一登录，登录完毕后在门户上显示各自的业务页面，当需要具体处理各项业务时跳转到各自的业务系统里。当然这里也有问题，仅仅B/S系统能做这种集成。这种情况也是实际项目中碰到最多的情况。<br><span style="font-weight: bold;">&nbsp; 二、数据集成。</span>这个和第一种情况相比就复杂了很多。拿一个简单的情况来说，系统A和系统B里都有各自的一套组织机构，现在我想做集成，只保留一套组织机构然后做统一管理。需求合情合理，处理起来就麻烦了。模型设计相似还好一点，再简单一点可以做数据库的同步。但这往往是开发人员的一厢情愿。写适配器几乎是必须的。模型的不同带来的问题是最大的，系统A里有岗位这个对象，系统B里没有，怎么办？这种情况在实际项目中越来越多了，然后每一次都让人特别的难受。<br><span style="font-weight: bold;">&nbsp; 三、业务集成。</span>提到业务集成，不得不说说SOA。SCA让业务集成看起来那么的顺理成章，SDO又搞定了数据交换这个头痛的问题。一切都是那么的美好（有点不太真实，嚯嚯）。因为最近对BPM关注比较多也准备往这方面做一些尝试，所以这里拿BPM举例，好比一个公司录人的流程，一开始我会调用原有的HR系统的业务服务录入人员信息，然后我又会在下一个流程节点调用财务系统相应的业务服务来计算新员工工资。可以这样认为，BPM是业务集成的最好的例子。这种情况在实际中用户也越来越多的提出来，或者说提到了这个概念（和各大公司的宣传有很大的关系）。个人也认为这一块应该有很大的发展空间。麻烦的地方也在于数据或者说服务的调用交互。<br>除了第一种情况，剩下两种情况都是很麻烦的。很多人都在说业务集成，但是数据集成是在任何有不止一套遗留系统时必须面对的问题。甚至我可以这么认为，数据集成是最困难的，因为它还没有一个标准，也不会有标准了。<br><img src ="http://www.blogjava.net/RongHao/aggbug/118435.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> 2007-05-18 18:08 <a href="http://www.blogjava.net/RongHao/archive/2007/05/18/118435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>