﻿<?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-LORD'S BLOG-文章分类-WorkFlow</title><link>http://www.blogjava.net/jiandeh/category/10391.html</link><description>你准备好迎接下一个挑战了吗？</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:31:50 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:31:50 GMT</pubDate><ttl>60</ttl><item><title>OSWorkflow2.8.0学习指南</title><link>http://www.blogjava.net/jiandeh/articles/42533.html</link><dc:creator>LORD BLOG</dc:creator><author>LORD BLOG</author><pubDate>Sat, 22 Apr 2006 12:44:00 GMT</pubDate><guid>http://www.blogjava.net/jiandeh/articles/42533.html</guid><wfw:comment>http://www.blogjava.net/jiandeh/comments/42533.html</wfw:comment><comments>http://www.blogjava.net/jiandeh/articles/42533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiandeh/comments/commentRss/42533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiandeh/services/trackbacks/42533.html</trackback:ping><description><![CDATA[OSWorkflow是一个灵活的工作流引擎，设计成可嵌入到企业应用程序中。它提供了许多的持久化API支持包括：EJB,Hibernate,JDBC和其它。OSWorkflow还可以与Spring集成。<br />网址：<a href="http://www.opensymphony.com/osworkflow/" target="_blank"><font color="#666666">http://www.opensymphony.com/osworkflow/</font></a><br /><br />1.OSWorkflow基本概念(gigix)<br /><a href="http://gigix.blogdriver.com/gigix/113138.html" target="_blank"><font color="#666666">http://gigix.blogdriver.com/gigix/113138.html</font></a><br />2.osworkflow中文指南(Quake Wang)<br /><a href="http://wiki.opensymphony.com/display/WF/Tutorial+-+Chinese" target="_blank"><font color="#666666">http://wiki.opensymphony.com/display/WF/Tutorial+-+Chinese</font></a><br />3.OSWorkflow入门(史帝芬心得笔记)<br /><a href="http://my.so-net.net.tw/idealist/OSWorkflow/" target="_blank"><font color="#666666">http://my.so-net.net.tw/idealist/OSWorkflow/</font></a><br />4.英文文档<br /><a href="http://wiki.opensymphony.com/display/WF/Manual" target="_blank"><font color="#666666">http://wiki.opensymphony.com/display/WF/Manual</font></a><br />5.深入分析(银狐999)<br /><a href="http://blog.csdn.net/james999/category/52990.aspx" target="_blank"><font color="#666666">http://blog.csdn.net/james999/category/52990.aspx</font></a><img src ="http://www.blogjava.net/jiandeh/aggbug/42533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiandeh/" target="_blank">LORD BLOG</a> 2006-04-22 20:44 <a href="http://www.blogjava.net/jiandeh/articles/42533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSWorkflow解读之一</title><link>http://www.blogjava.net/jiandeh/articles/42531.html</link><dc:creator>LORD BLOG</dc:creator><author>LORD BLOG</author><pubDate>Sat, 22 Apr 2006 12:35:00 GMT</pubDate><guid>http://www.blogjava.net/jiandeh/articles/42531.html</guid><wfw:comment>http://www.blogjava.net/jiandeh/comments/42531.html</wfw:comment><comments>http://www.blogjava.net/jiandeh/articles/42531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiandeh/comments/commentRss/42531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiandeh/services/trackbacks/42531.html</trackback:ping><description><![CDATA[
		<p>osworkflow中有关工作流流转的所有核心代码都在AbstractWorkflow中，BasicWorkflow就是派生自它，不过这个BasicWorkflow基本上没做什么事情。也许我们还可以从AbstractWorkflow派生自己的Workflow类以加入扩展功能，大概这也算是osworkflow所体现的一种灵活性了，即：允许对工作流流转的执行逻辑进行修改。AbstractWorkflow实现了Workflow接口，该接口包含了有关工作流的核心方法，最重要的是doAction方法，AbstractWorkflow实现了该方法，后面会提及，其他还有一些getter和query method。</p>
		<p>流程流转的执行逻辑&gt;&gt;</p>
		<p>当流程执行到的某个step时，可能有一个或多个action可供用户选择执行。一旦确定执行某个action后，我们需要调用AbstractWorkflow.doAction，并传入流程id和action的id。以下是对doAction的执行逻辑的一个不太严紧的算法描述：</p>
		<p>*　　*　　*</p>
		<p>- 　根据流程id，获得所有当前的step，这种情况往往发生在有split的时候，此时会有多个step等待执行；<br />- 　根据传入的action的id，检查是否是global action；<br />- 　若不是global action，则遍历所有当前的step，对每个step的每个action调用isActionAvailable方法，检查该action是否可用（记住step和action是一对多的关系）；<br />- 　所谓可用是指，通过执行passesConditions，逐个检查action的condition：若是OR的关系，则有一个condition为真即为可用，AND关系则类推；<br />- 　若action可用，则调用transitionWorkflow，这是流程流转处理的关键部分；<br />　执行transitionWorkflow时：<br />　- 　首先获取当前step，存在有多个当前step的情况，比如split，此时获取首个isAvailableAction为真的step；<br />　- 　调用verifyInputs验证输入（如果action有validator的话）；<br />　- 　执行当前step的post function（因为该step即将结束）；<br />　- 　执行action的pre function；<br />　- 　判断当前step所属的result中的所有condition是否满足要求，判断方法类似action的condition；<br />　- 　一旦满足，则获取result的pre function和post function；<br />　- 　否则即是unconditional result，获取相应的pre function和post function；<br />　- 　在没有split和join的情况下<br />　　-　 会根据在result中指定的下一个step的id，创建一个新的step，作为当前的step；<br />　　- 　从current steps中移除原来的当前step，并添加到history steps中；<br />　　- 　如果新的step有pre function，则会马上执行；<br />　- 　执行result的post function；<br />　- 　执行action的post function；<br />　- 　若action是intial action，则将流程设置为activated状态；<br />　- 　若action是finish action，则将流程设置为completed状态，返回true；<br />　- 　寻找auto action，若有的话，则执行之，执行方法是调用doAction本身；<br />　- 　返回false；<br />- 　根据transitionWorkflow的返回值判断流程是否结束；<br />- 　若返回false，则调用checkImplicitFinish检查是否存在implicit finish，即：当前没有一个step的action可用时，就认为流程应该结束；</p>
		<p>*　　*　　*</p>
		<p>-　若存在split，则会创建多个新的step，并且在创建之前先执行split的pre function，在创建之后执行split的post function；<br />-　创建step的过程和上面描述的普通状况相同：维护好current steps和history steps，并执行新的step的pre function；</p>
		<p>*　　*　　*</p>
		<p>-　若存在join，先结束当前step，并将该step添加至history steps和join steps；<br />-　查找history steps，对每个已完成的step，查看是否在其result或unconditional result中有join一项，若有则加入join steps中；<br />-　检查join是否已经满足：可以使用Bean Shell，在xml定义文件的join节点中，通过引用一个名为“jn”的特殊变量来指定join的满足条件，jn记录了有关join的关键信息；<br />-　若条件满足，则执行join的pre function，维护好history steps，并创建下一个step，然后执行join的post function；</p>
		<p>*　　*　　*</p>
		<p>-　对于条件循环的情况，可以通过将result的某个action的下一个step指定为自身来加以实现，这只是在xml定义文件中做文章，流程执行逻辑无需做特殊处理； </p>
<img src ="http://www.blogjava.net/jiandeh/aggbug/42531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiandeh/" target="_blank">LORD BLOG</a> 2006-04-22 20:35 <a href="http://www.blogjava.net/jiandeh/articles/42531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSWORKFLOW基本概念</title><link>http://www.blogjava.net/jiandeh/articles/42530.html</link><dc:creator>LORD BLOG</dc:creator><author>LORD BLOG</author><pubDate>Sat, 22 Apr 2006 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/jiandeh/articles/42530.html</guid><wfw:comment>http://www.blogjava.net/jiandeh/comments/42530.html</wfw:comment><comments>http://www.blogjava.net/jiandeh/articles/42530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiandeh/comments/commentRss/42530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiandeh/services/trackbacks/42530.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: OSWORKFLOW基本概念                                      																																												1. 												步骤、状态和动作																																																工作流要描...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiandeh/articles/42530.html'>阅读全文</a><img src ="http://www.blogjava.net/jiandeh/aggbug/42530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiandeh/" target="_blank">LORD BLOG</a> 2006-04-22 20:34 <a href="http://www.blogjava.net/jiandeh/articles/42530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>