问题 > 问题详情
eos工作流原理
最后更新: 1年前 · 

38672 浏览
最近在工作之余写的一点关于eos工作流的一点心得,希望与大家一起共享
94 个回应
Normal
jackeymao 2007年10月12日 14:28
看看看看~~
Normal
BL168.Xiao 2007年10月12日 14:32
下载啊?哦~~要是论坛的发文再方便一点就可以直接挂出来了
Normal
fengfengjunjun 2007年10月12日 15:07
EOS工作流引擎工作原理
作者:dogreet[font=Arial](呵呵,帮贴哈)[/font]
[font=Arial][/font]
[font=Arial][b]1. 工作流基础知识[/b][/font]
[font=Arial]……[/font]
[font=Arial][/font]
[font=Arial][b]2. EOS工作流引擎工作原理[/b][/font]
[font=Arial][b]  [/b]本文是我在工作之余写的一点我对EOS工作流的了解,我的理解不一定全是对的,可能会与引擎的真正的面目有出入。所以只能提供给大家一点参考。[/font]
[font=Arial][/font]
[font=Arial][b]2.1. EOS工作流引擎核心调度算法[/b][/font]
[font=Arial]  EOS工作流最重要的组成部分是它的核心调度算法,在我们没有深入研究它的工作原理之前我们认为它的工作原理是在工作项,活动和流程实例对象上加了一些标志位来驱动流程的运转。认为其引擎完全是个由数据库来驱动流程的引擎(安徽二期的工作流平台好象就是以库表来驱动流程的运转),其实它是由事件来驱动流程运转的引擎,数据库只是把引擎运转前后的状态持久化。在我近来在工作之余对其引擎的工作原理进行跟踪才弄明白在EOS帮助文档上介绍的“事件驱动”的工作流引擎。[/font]
[font=Arial][/font]
[font=Arial]2.1.1. EOS工作流引擎的事件类型[/font]
[font=Arial][img=600,690]http://gocom.primeton.com/uploads/FCKUserFiles/Image/01(66).jpg[/img]
[/font][font=Arial][/font]
[font=Arial]  以上的每个事件都是原子的不可分割的。其中一系列事件的集合通过EOS引擎事件调度机制实现我们平时在工作中经常遇到的如启动流程,结束工作项等等。(在事件类型类中EOS定义了29种事件,但在事件工厂类中EOS定义了26种类型。)[/font]
[font=Arial][/font]
[font=Arial][b]1.1.1. EOS工作流事件调度机制[/b][/font]
[font=Arial]  EOS事件的调度服务是在工作流引擎初始化时通过服务工厂类加载到内存中(ServiceFactory.initEventService())。用户可以通过服务工厂类(ServiceFactory)取得JVM的唯一事件服务实例进行事务调度。所有的事件程序入口都是事件类(EventService),这个类其实是个接口,其有两个实现类,一个是单线程的实现类SingleThreadEventService(在实现代码中其实不是单线程,而是单例的对象),一个是多线程的实现类MulThreadThreadSvc,(其实现方式不在这里详细说明,多线程的类后面又跟了一大堆的线程池实现代码),在事件服务类中有一个属性类是WFEventDisposer,这个类包含了事件的注册,事件的发布,事件的注册是一个静态代码块实现的。注册了上节描述的29种事件,其实就是把相应的事件代码注册到相应的处理类,事件处理类共用5个(ProcessScheduler,ActivityExecuter,ExceptionHandler,WorkItemHandler,ApplicationHandler),对应事件代码的前5个数字;共有事件的发布有两种,一种是正常发布,一种是无异常的发布(即在具体执行事件时关闭了异常处理)。所谓的事件发布是给事件服务类传递一个事件对象(WFEvent类),这个事件对象包含了事件类型,线程名,事件ID,流程定义ID,活动定义ID,活动实例ID,和工作项ID等等。[/font]
[font=Arial]  以上简要的描述了事件模型,下面来拿我们平时用的最多的一个构件:结束工作项来详细跟踪它的事件处理。结束工作项可能是最具有代表性的一个流程动作,因为在做这个时间后遍历了整个流程实例的流程:[/font]
[font=Arial]  1, 用户通过引擎的API调用WorkItemManager类的finishWorkItem方法,该方法通过服务工厂取得持久层的数据访问服务,并根据workitemID取得WFWorkItem对象。做相关的判断后通过事件工厂类的createFinishWorkItemEvent方法创建个事件代码为3004的事件对象(WFEvent)。然后通过服务工厂类取得事件服务类把该事件对象发布给事件处理服务。从此刻就开始了EOS事件调度服务的运转。[/font]
[font=Arial]  2, 事件服务类(拿单线程事件服务类做例子)拿到这个事件类后把该事件通过WFEventDisposer发布该事件。具体的发布过程很简单,即判断该事件类型是否已注册,如果已经注册则取到改事件代码的注册类。该代码是3004,则应取WorkItemHandler。然后调用WorkItemHandler的invoke()方法,[/font]
[font=Arial]  3, WorkItemHandler类invoke()中写到:if(event.getType() == 30004) {finishWorkItem(event);}则找到该方法,该方法开始做了相关的判断后做相关标志位的修改:置当前工作项的状态为12,然后判断当前活动是否结束。(大概的算法是取得已经结束的工作项和该活动总的工作项,取得活动定义的多工作项是否启动。如果是多工作项则判断完成个数策略:是按百分比还是按操作员个数等等,做一系列的判断后得到应该结束的工作项,如果小于等于已经结束的工作项则该活动结束,没有启动多工作项则相应的处理要简单点),如果该活动已完成,则调用事件服务的结束活动实例事件createFinishActivityEvent;如果没有结束则判断工作项启动的策略是“at_the_same_time”还是“one_by_one”,如果是“one_by_one”则找本活动实例下的工作项状态为1的工作并启动它。[/font]
[font=Arial]  4, 结束活动实例是调用事件工厂的方法createFinishActivityEvent,新建一个事件代码为2004的事件。用createFinishWorkItemEvent的方法发布该事件。到ActivityExecuter类中找到finishActivity,该方法修改活动实例状态为7,填写活动结束时间。如果该活动注册了时限则取消活动时限的注册。如果该活动实例定义了结束活动的触发动作则触发该动作(通过WFAppCaller调用)。最后由事件工厂产生一个事件代码为1002的createScheduleNextActivityEvent事件。由事件服务发布事件。[/font]
[font=Arial]  5, 启动下个活动实例的事件动作是事件工厂调用scheduleNextActivity方法,该方法通过流程定义找到下个环节的转移条件,并根据转移条件和分支模式(全部分支:AND;多路分支:XOR;单一分支:OR)生成一个环节定义列表。引擎首先把未启动的活动实例和挂起的活动实例找到,如果没有则生成一个活动实例。然后生成一个转移对象(WFTransition),最后把待启动的活动实例对象放到一个列表中。根据该列表中的活动定义的启动策略(直接启动,待激活,由规则逻辑指定)来启动活动实例;如果是直接启动活动实例则由事件工厂新建一个事件代码为2001的事件startActivity,如果待激活策略则由事件工厂产生事件代码为2000的事件preStartActivity。同样如果在流程定义中定义了创建活动实例触发的事件则触发该事件,scheduleNextActivity方法做了很多业务处理的事情,所以比较复杂。[/font]
[font=Arial]  6, 事件服务调用startActivity方法,修改当前活动状态位为2,并向时限管理服务注册时限,然后通过活动执行类的帮助类分派工作项,分派工作项的过程是判断是否是多工作项,如果不是则按参与人员分派,如果是则判断多工作项的启动策略,启动工作项业务处理比较复杂,并没有相应的事件代码对应,在这里不详细介绍。
以上的六个步骤完成了我们平时最常用的完成工作项的方法。综上所述应该能够对EOS工作流的事件调度机制有个清楚的认识,比如结束工作项的事件调度有3004->2004->1002->2001这几种事件的触发。同样还有我们平时比较常用的启动流程实例方法首先是创建一个流程实例,然后开始事件调度:10001->10002->2001,最后是分派工作项。
OSWorkflow里也有自己的调度机制,但在业务上要比EOS简单的多,准确的讲OSWorkflow只有两个概念:steps (步骤) 和 actions (动作)。一个简单的调度过程它可能从一个步骤流转到另外一个步骤(或者有时候还是停留在一样的步骤)。它的调度其实就是一个类:AbstractWorkflow,这个类里面有两个方法:doAction 和transitionWorkflow基本实现了所有的调度(其实也不能算是调度,只能算是状态的迁移)。OSWorkflow最大的优点是在执行调度过程中执行的一系列的Function(在SOA里叫服务模型,在EOS里叫展现逻辑),它在执行客户端的服务时的机制时还是比较复杂的,如果感兴趣在工作之余可以看一下。
还有个最近比较流行的开源的引擎,JBpm,我没看过这个,好象现在又整合到JBOSS下去了,好象很复杂。[/font]

[b]呵呵,还是下载吧,支持原创~~[/b]
Normal
yangmantis 2007年10月12日 15:26
大家帮顶啊,哈哈,共勉!
Normal
yangmantis 2007年10月12日 15:32
我的邮箱是 dogreet@gmai.com
共同学习
Normal
jy02136329 2007年10月26日 15:21
要仔细研究下了
Normal
jackxie 2007年10月26日 15:30
热烈地顶!!!!不错,学习下
Normal
xieqingzhong 2007年10月26日 16:28
啥也不说了,实在是太好了
Normal
Viva.Tao.Story 2007年10月29日 15:55
写的真不错!呵呵,楼主是个有心人
Normal
yangmantis 2007年10月29日 18:55
谢谢
Normal
wameng 2007年11月02日 10:23
谢谢!
Normal
wameng 2007年11月02日 10:23
谢谢!
Normal
wearwind 2007年11月06日 21:44
顶一下,楼主用得很深啊,都深到内核去了。
你在文章中提到了几个关于EOS工作流引擎的不足,不知道是针对哪个版本?还真希望工作流研发的兄弟们能针对性回复一下。
Normal
shawn 2007年11月30日 16:54
谢谢楼主,我现在是一头雾水啊!希望你的这个能对我的学习有所帮助.再次感谢
Normal
fogforest 2007年12月07日 14:25
见贴就顶
Normal
stonewu 2007年12月09日 01:18
很好,把工作流从里到外都解剖了一遍。至于你提到工作流持久层没有别致的处理对象关系模型的疑问,那是为了性能考虑的,反而直接用JDBC的方式查询数据库是效率最快的。用对象和xml属性之间一一对应起来,那也是为了性能考虑,访问Node的下的一个属性的效率,要比访问一个java对象下的一个get方法要慢的多,而引擎中查询,比对状态值等操作十分频繁,所以引擎中全部用java对象来组织数据,在引擎把数据放到数据总线上时,才会把对象转为xml格式。
Normal
zds312384205 2008年01月07日 17:27
谢谢哈
Normal
poseidonli 2008年01月11日 09:46
刚刚介入,努力学习中
Normal
ganlisxn 2008年02月28日 21:13
不错的学习笔记
Normal
ds83923 2008年03月01日 11:50
感谢分享
Normal
babala 2008年03月05日 15:48
是否存在工作流缓存,在集群环境下,存在一定不一致的问题。希望能深入向研发了解。
Normal
日出西落 2008年03月29日 16:05
下载了,学习中
Normal
wanggang24 2008年04月06日 10:03
刚接触EOS,楼主的资料好好学习
Normal
日出西落 2008年04月06日 10:11
不错,学习下
Normal
wanggang24 2008年04月06日 10:27
下载了
Normal
天使-snow 2008年07月17日 16:44
好东西,咱也看看
Normal
zhx831121 2008年07月19日 18:34
辛苦辛苦,
Normal
风舞狂沙 2008年07月20日 15:44
楼主辛苦了,感谢楼主!
Normal
FreshOutlook 2008年08月06日 16:47
谢谢楼主提供的内容
Normal
yuzou45 2008年08月11日 10:34
感谢好心人啊
Normal
SSH_Jacky 2008年08月15日 10:44
<span style="LINE-HEIGHT: 2">【适用范围】<br />
犑视玫腅OS版本,相关的操作系统/数据库/应用服务器环境<br />
【问题描述和定位】<br />
【解决方案和步骤】<br />
【备注】<br />
学习一下,哈哈。工作流这个东西很是麻烦,我讨厌复杂的业务流程。</span>
Normal
3xak47 2008年08月15日 13:39
介绍详细
Normal
linhan 2008年08月25日 10:36
下来学习,感谢楼主
Normal
sharezoon 2008年09月10日 13:42
支持!!
Normal
zhaozhongwei 2008年09月15日 14:22
楼主还是发了一定工夫呀,对工作流还是自己进行了分析,写的也不错. :-) 这样的帖子要顶
Normal
xujing 2008年09月18日 16:08
已经将此好文收录到EOS知识库-〉EOS感悟中了,感谢楼主的无私奉献,顶!
Normal
NEDVEDSONG 2008年10月14日 19:39
xiankankandeshuo!
Normal
maqixx 2008年10月21日 08:56
热烈地顶!!!!不错,学习下
Normal
jliker 2008年11月29日 18:20
不错,最后能打包,让大家下载,共同学习嘛
Normal
永远的白痴 2008年12月09日 16:30
谢谢啦
Normal
shensiguan 2008年12月22日 11:51
恩,不错,仔细回味下~
Normal
gogdo 2009年01月02日 10:55
非常感谢楼主。
Normal
zhifeiji512 2009年01月07日 08:50
谢谢楼主!
Normal
wuyawudi82 2009年01月16日 21:49
javax.servlet.ServletException: can not find dom
Normal
jnulion 2009年02月02日 13:23
李就是强人
Normal
koben 2009年03月05日 11:23
研究得比较细啊,学习!
Normal
清咖啡茶 2009年03月17日 09:43
楼主,辛苦了!真的很不错! :-)
Normal
shixinsheng 2009年03月17日 15:33
thx
Normal
i6208844 2009年04月30日 09:35
还没入门。请问能否用SQL 2000进行关联
Normal
lt90 2009年05月25日 15:07
学习下,SOA EOS
Normal
nietangkun 2009年05月26日 09:42
谢谢,先收藏了,非常好
Normal
admin 2009年08月28日 11:41
Normal
hongbod 2010年01月28日 18:07
学习学习!!!!
Normal
sunshine78 2010年02月22日 16:03
谢谢,仔细研究一下
Normal
wl_icebreg 2010年03月11日 15:19
先顶下先顶下先顶下
Normal
轻轻的风 2010年03月12日 14:03
为什么 我看不成呀???要到什么时候才可以看呢?:(
Normal
joey_g 2010年03月25日 11:51
学习了,谢谢!
Normal
holyselina 2010年03月30日 08:04
look~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Normal
lhx5154 2010年03月31日 20:16
共同学习..
Normal
jackieban 2010年05月07日 09:57
回复就回复,我先瞧瞧看
Normal
yujc 2010年05月14日 23:54
本帖隐藏的内容需要回复才可以浏览
Normal
tcray 2010年05月21日 09:40
ding:lol :lol :lol
Normal
pirate200628 2010年05月21日 13:26
正在学习,很迷茫
Normal
zsb77585210 2010年05月26日 10:27
看下是什么
Normal
superzheng 2010年06月07日 14:48
很认真的学习中
:loveliness:
Normal
hahahawa 2010年07月02日 16:35
Re: eos工作流原理
谢谢楼主,我现在是一头雾水啊!希望你的这个能对我的学习有所帮助.再次感谢
Normal
shibettle 2010年07月21日 13:36
看看,了解一下
Normal
hetengfeng 2010年08月24日 16:31
:lol :lol :lol :lol
Normal
dongkaixian 2010年08月27日 08:50
我看看,感谢分享
Normal
eseawind 2010年09月06日 16:41
看看里面到底是什么东东:lol
Normal
kang_oec 2010年09月14日 16:09
学习啦学习啦
Normal
woaiyaya 2010年09月16日 15:41
看看看看~~
Normal
violet6016 2010年09月27日 09:43
是不是要回复才能看哦
Normal
王于波 2010年10月24日 13:52
谢谢!回复了在了再说
Normal
pta 2010年10月25日 23:29
谢谢楼主,我现在是一头雾水啊!希望你的这个能对我的学习有所帮助.再次感谢
Normal
Francine 2010年11月15日 19:28
刚入门,懂得的实在是太少了……~~~~(>_<)~~~~
Normal
ko20050223 2010年11月17日 13:58
学学..................................
Normal
小萨 2010年11月30日 09:01
:) :) :lol
Normal
pateric 2010年12月28日 17:52
看看看看~~
Normal
mois 2011年03月13日 12:04
好东西:lol :lol
Normal
fullqin 2011年03月24日 08:46
看看,谢谢
Normal
wmiao89620 2011年04月25日 11:18
:victory: 不错的东西
Normal
qiuzhu1985 2011年06月09日 14:29
学习学习!!
Normal
萨巴鄂 2011年07月05日 14:58
谢谢资料共享
Normal
ctulips 2011年07月11日 14:12
学习中,谢谢:lol
Normal
悠远 2011年08月06日 11:43
谢谢楼主,我现在是一头雾水啊!希望你的这个能对我的学习有所帮助.再次感谢
Normal
LakeSky 2011年09月22日 20:48
:loveliness: 好东西,谢谢
Normal
huiji757 2011年09月23日 17:32
看看··学习学习
Normal
redyellow 2011年09月25日 16:08
看看看看看看
Normal
zhengch 2011年09月26日 16:16
good!,ths!!
Normal
rongzitou5945 2011年09月27日 08:47
学习学习学习学习
Normal
ahhsxycb 2011年09月30日 17:09
谢谢楼主,我现在是一头雾水啊!希望你的这个能对我的学习有所帮助.再次感谢
Normal
BMW 2011年10月12日 14:47
e eqesafsfaasfasdfsaf
Normal
king_kris 2014年07月02日 13:26
学习学习学习
需要 后方可回复
如果没有账号可以 一个帐号。

文档与知识库

产品官方文档和知识库
提供EOS、BPS的文档在线阅读以及超过2073个咨询故障和800+知识点。

反馈与阅读帮助

意见反馈  ·  阅读帮助

邀请他们回答

共有1人收藏该问题