﻿<?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-大博的BLOG-文章分类-jbpm</title><link>http://www.blogjava.net/swboo/category/23365.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 18 Mar 2008 05:52:07 GMT</lastBuildDate><pubDate>Tue, 18 Mar 2008 05:52:07 GMT</pubDate><ttl>60</ttl><item><title>JBPM3.2.2表关系，希望高手们能积极大家来讨论下关系的存在原因</title><link>http://www.blogjava.net/swboo/articles/186958.html</link><dc:creator>大博的BLOG</dc:creator><author>大博的BLOG</author><pubDate>Tue, 18 Mar 2008 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/swboo/articles/186958.html</guid><wfw:comment>http://www.blogjava.net/swboo/comments/186958.html</wfw:comment><comments>http://www.blogjava.net/swboo/articles/186958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/swboo/comments/commentRss/186958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/swboo/services/trackbacks/186958.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;JBPM表关系说明1 流程配置类数据库表：1.1 JBPM_PROCESSDEFINITION：流程模版表                                    关系表                                    外键存在表                                 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/swboo/articles/186958.html'>阅读全文</a><img src ="http://www.blogjava.net/swboo/aggbug/186958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/swboo/" target="_blank">大博的BLOG</a> 2008-03-18 11:13 <a href="http://www.blogjava.net/swboo/articles/186958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的基于JBPM3.1.4工作流引擎的WEB请假流程例子------第二部分发布工作流</title><link>http://www.blogjava.net/swboo/articles/131156.html</link><dc:creator>大博的BLOG</dc:creator><author>大博的BLOG</author><pubDate>Wed, 18 Jul 2007 14:18:00 GMT</pubDate><guid>http://www.blogjava.net/swboo/articles/131156.html</guid><wfw:comment>http://www.blogjava.net/swboo/comments/131156.html</wfw:comment><comments>http://www.blogjava.net/swboo/articles/131156.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/swboo/comments/commentRss/131156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/swboo/services/trackbacks/131156.html</trackback:ping><description><![CDATA[<p>&nbsp;发布工作流很简单咯,我们用JUNIT测试用例来发布,至于如何呢看下面代码把,里面注释很清楚<br><br>public class ManyShenpiIssue extends TestCase {<br>&nbsp;public void testIssueDefinition() throws FileNotFoundException<br>&nbsp;{<br><span style="COLOR: #339966">&nbsp;&nbsp;//从JBPM.CFG.XML取得JBPM配置</span><br>&nbsp;&nbsp;JbpmConfiguration config = JbpmConfiguration.getInstance();<br><span style="COLOR: #339966">&nbsp;&nbsp;//创建一个JBPM容器</span><br>&nbsp;&nbsp;JbpmContext jbpmContext = config.createJbpmContext();<br><span style="COLOR: #339966">&nbsp;&nbsp;//由processdefinition.xml生成想对应的流程定义类processDefinition</span><br>&nbsp;&nbsp;InputStream is = new FileInputStream("process/shenpi/processdefinition.xml");<br>&nbsp;&nbsp;ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);<br><span style="COLOR: #339966">&nbsp;&nbsp;//利用容器的方法将流程定义数据部署在数据库上</span><br>&nbsp;&nbsp;jbpmContext.deployProcessDefinition(processDefinition);<br>&nbsp;<span style="COLOR: #339966">&nbsp;//关闭jbpmContext</span><br>&nbsp;&nbsp;jbpmContext.close();<br>&nbsp;&nbsp;<br>&nbsp;}</p>
<p>}<br>工作流在着就算发布完成了,很简单对不对呀<br>现在大家对引擎的概念还是很模糊对不对,没事下面的内容我会做详细解释</p>
<img src ="http://www.blogjava.net/swboo/aggbug/131156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/swboo/" target="_blank">大博的BLOG</a> 2007-07-18 22:18 <a href="http://www.blogjava.net/swboo/articles/131156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的基于JBPM3.1.4工作流引擎的WEB请假流程例子------第一部分环境准备与工作流定义</title><link>http://www.blogjava.net/swboo/articles/129958.html</link><dc:creator>大博的BLOG</dc:creator><author>大博的BLOG</author><pubDate>Thu, 12 Jul 2007 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/swboo/articles/129958.html</guid><wfw:comment>http://www.blogjava.net/swboo/comments/129958.html</wfw:comment><comments>http://www.blogjava.net/swboo/articles/129958.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/swboo/comments/commentRss/129958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/swboo/services/trackbacks/129958.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Arial">-----本文原作者:孙文博,发于<a href="http://www.blogjava.net/swboo">http://www.blogjava.net/swboo</a>为了让更多人了解如要转载请说明,谢谢大家支持原创.<br><br>对于刚开始接触JBPM的朋友来说,理解工作流引擎着个概念来说是要费工夫的(本人很苯,也是理解了好久才知道引擎的意思的).现在网上大多数的JBPM例子都是使用的是JUNIT来说明问题的,但是对于一些没有从事过JAVA或的刚开始从事JAVA开发的朋友来说,无疑是很有难度的,所以我在这里写一个WEB的例子来教大家JBPM的的使用,以及引擎的含义,好了接下来让咱们开始.<br><br><br><strong>1环境准备<br></strong>至于如何配置ＪＢＰＭ环境我就不说了，要是不会请去看陈刚老师的ＢＬＯＧ上面很详细（<a href="http://www.blogjava.net/chengang/category/12967.html">http://www.blogjava.net/chengang/category/12967.html</a>）我在这里只做如何将ＪＢＰＭ和ＷＥＢ组合起来<br><strong><br>1.1使用环境　</strong><br><span style="COLOR: #ff0000"></span><font color=#ff0000>JDK1.5<br></font>Tomcat5.5.9<br>JBPM3.1.4<br>数据库mssql2000<br><br><strong>1.2创建一个ＷＥＢ项目，不说了用过eclipse的人都知道如何创建</strong><br><br><br><strong>1.3创建一个流程定义，就是在web项目中添加Process Definition</strong><br><br><strong>1.4流程定义代码 <br></strong><span style="BACKGROUND-COLOR: #c0c0c0">注明:下面我将流程写如流程定义文件当中要是想使用请删除里面的流程说明部分</span><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p style="FONT-FAMILY: Arial">开始结点<br>&lt;process-definition<br>&nbsp; xmlns=""&nbsp; name="shenpi"&gt;<br><span style="COLOR: #800080">流程开始结点</span><br>&nbsp;&nbsp; &lt;start-state name="start"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;task name="startrequest"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &lt;controller&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">&nbsp;设置请假人的<span style="COLOR: #339966">流</span>程变量</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;variable name="name"&gt;&lt;/variable&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">设置请假天数的流程变量</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;variable name="countday"&gt;&lt;/variable&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">&nbsp;&nbsp;设置审批请假角色的流程变量<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;variable name="roles"&gt;&lt;/variable&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controller&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/task&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;event type="node-leave"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">&nbsp;当离开开始结点后处理的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="startleave" class="com.jbpm.handler.StartLeave"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/event&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="" to="shenpi"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/transition&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; &lt;/start-state&gt;<br><br><span style="COLOR: #800080">审批结点</span><br>&nbsp;&nbsp; &lt;task-node name="shenpi"&gt;<br><span style="COLOR: #339966">审批任务</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;task name="whoshenpi"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;controller&gt;<br><span style="COLOR: #339966">设置是否通过的流程变量</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;variable name="shifoutongguo"&gt;&lt;/variable&gt;<br><span style="COLOR: #339966">保存该谁审批的流程变量</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;variable name="who"&gt;&lt;/variable&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controller&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/task&gt;<br><span style="COLOR: #339966">用来处理进入审批结点的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;event type="node-enter"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="com.jbpm.handler.ShenpiEnter"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/event&gt;<br><span style="COLOR: #339966">用来处理离开审批结点的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;event type="node-leave"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="com.jbpm.handler.ShenpiLeave"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/event&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="" to="decision1"&gt;&lt;/transition&gt;<br>&nbsp;&nbsp; &lt;/task-node&gt;<br><br><span style="COLOR: #800080">设置下一个人审批的结点<br></span>&nbsp;&nbsp; &lt;node name="whocheck"&gt;<br><span style="COLOR: #339966">设置下一个审批人的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action class="com.jbpm.handler.WhoCheckAction"&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/action&gt;<br><span style="COLOR: #339966">设置离开此结点的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;event type="node-leave"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="whocheckleave" class="com.jbpm.handler.WhoCheckLeave"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/event&gt;<br><span style="COLOR: #339966">设置进入此结点的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;event type="node-enter"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="whocheckenter" class="com.jbpm.handler.WhoCheckEnter"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/event&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="" to="decision2"&gt;&lt;/transition&gt;<br>&nbsp;&nbsp; &lt;/node&gt;<br><br><span style="COLOR: #800080">判断是否审批人是否通过的结点</span><br>&nbsp;&nbsp; &lt;decision name="decision1"&gt;<br><span style="COLOR: #339966">判断此业务流程的类<br></span>&nbsp;&nbsp;&nbsp;&nbsp; &lt;handler class="com.jbpm.decision.IsGoDecisionHandler"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="end" to="end"&gt;<br><span style="COLOR: #339966">判断流程是否通过的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="com.jbpm.handler.ProcessEnd"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/transition&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="go" to="whocheck"&gt;&lt;/transition&gt;<br>&nbsp;&nbsp; &lt;/decision&gt;<br><br><span style="COLOR: #800080">判断是否审批人是否是最后一个人的结点</span><br>&nbsp;&nbsp; &lt;decision name="decision2"&gt;<br><span style="COLOR: #339966">判断是否通过的类</span><span style="COLOR: #339966"><br></span>&nbsp;&nbsp; &lt;handler class="com.jbpm.decision.IsGoDecisionHandler"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="end" to="end"&gt;<br><span style="COLOR: #339966">判断是够是最后一个人的类</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="com.jbpm.handler.ProcessEnd"&gt;&lt;/action&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/transition&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition name="go" to="shenpi"&gt;&lt;/transition&gt;<br>&nbsp;&nbsp; &lt;/decision&gt;<br><br><span style="COLOR: #800080">&nbsp;&nbsp;&nbsp;流程结束结点</span><br>&nbsp;&nbsp; &lt;end-state name="end"&gt;<br><span style="COLOR: #339966">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;判断是否通过的变量</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;controller&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;variable name="shifoutongguo" access="read"&gt;&lt;/variable&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controller&gt;&nbsp;&nbsp; &nbsp;&nbsp;<br>&nbsp;&nbsp; &lt;/end-state&gt;<br>&lt;/process-definition&gt;</p>
<p style="FONT-FAMILY: Arial"><br><br><strong>1.5流程说明<br></strong>本流程定义了一个请假流程其中员工提出申请开始一个请假流程,然后主管审批,此例子我设置了3个chief来处理,只要里面一个不通过流程就结束了.</p>
(太晚了明天继续)2007.7.12 
<img src ="http://www.blogjava.net/swboo/aggbug/129958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/swboo/" target="_blank">大博的BLOG</a> 2007-07-12 23:10 <a href="http://www.blogjava.net/swboo/articles/129958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载蜂巢软件分析的 JBPM的执行流程</title><link>http://www.blogjava.net/swboo/articles/129610.html</link><dc:creator>大博的BLOG</dc:creator><author>大博的BLOG</author><pubDate>Wed, 11 Jul 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/swboo/articles/129610.html</guid><wfw:comment>http://www.blogjava.net/swboo/comments/129610.html</wfw:comment><comments>http://www.blogjava.net/swboo/articles/129610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/swboo/comments/commentRss/129610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/swboo/services/trackbacks/129610.html</trackback:ping><description><![CDATA[1.实例化流程定义类，可选的方式包括：<br>ProcessDefinition.parseXmlResource("websale.par/processdefinition.xml");<br>1.1 装载 指定名字的文件为一个InputStream<br>1.2 解析这个InputStream中的流程定义xml<br>1.3 包装 InputStream为 InputStreamReader<br>1.4 实例化 JPDLReader<br>1.5 请求 JPDLReader.readProcessDefinition<br>1.5.1 创建流程定义的实例 processDefinition = ProcessDefinition.createNewProcessDefinition();<br>1.5.1.1 实例化 ProcessDefinition<br>1.5.1.2 装载 module定义对象 到 流程定义对象中,module定义于"jbpm.default.modules.properties"文件<br>1.5.2 请求 SchemaValidationHelper校验 流程定义文件是否符合其Schema<br>1.5.3 解析流程定义xml文件的根元素下的各个元素<br>1.5.3.1 解析 swimlane<br>1.5.3.1.1 解析每个 swimlane 定义，针对每个 swimlane定义<br>1.5.3.1.1.1 生成一个 swimlane对象<br>1.5.3.1.1.2 生成 assignment元素的 class属性所指定的类的对象（称为 委托对象），并放置到 swimlane对象中。<br>1.5.3.1.1.3 如果没有assignment元素，并且 该 swimlane 也不是 starttask所引用的swimlane,则 addWarning。<br>1.5.3.1.1.4 将swimlane追加加到 taskMgmtDefinition 的属性中。<br>1.5.3.2 解析 actions<br>1.5.3.2.1 遍历根元素下的每个Action元素<br>1.5.3.2.2 如果 该action的名字符合 给定的类型，则创建Action：createAction<br>1.5.3.2.2.1 在ActionTypes中找到当前Action的name所对应的class,并实例化该class(即action对象)<br>1.5.3.2.2.1.1 设置action对象的name<br>1.5.3.2.2.1.2 在ProcessDefinition对象的actions属性中追加action<br>1.5.3.2.2.1.2.1 解析 各Action元素的特殊属性到 Action对象中<br>1.5.3.2.2.1.2.1.1 如果是普通Action元素<br>1.5.3.2.2.1.2.1.1.1 如果 action元素的 ref-name属性 不为空，则 在JpdlXmlReader 的 unresolvedActionReferences属性中追加 该action元素和action对象<br>1.5.3.2.2.1.2.1.1.2 如果 action元素的 class 属性 不为空，则 <br>1.5.3.2.2.1.2.1.1.3 实例化 Delegation，将实例化后的对象作为action对象的属性。<br>1.5.3.2.2.1.2.1.1.4 调用Delegaton的 read方法，解析action元素的class、config-type等属性到delegation对象中，并解析 元素的content到delegation对象中<br>1.5.3.2.2.1.2.1.1.5 根据 action元素的accept-propagated-events 属性，决定action对象的isPropagationAllowed属性（该属性决定该actions是否只处理该action所关联的元素发出的事件，不处理子元素传来的事件）<br>1.5.3.2.2.1.2.1.2 如果是 CancelTimerAction 元素<br>1.5.3.2.2.1.2.1.2.1 将&#8220;the name of the timer to be cancelled&#8221; 放置到 CancelTimerAction对象的属性中<br>1.5.3.2.2.1.2.1.3 如果是 CreateTimerAction 元素<br>1.5.3.2.2.1.2.1.3.1 解析&#8220;the name of the timer&#8221;<br>1.5.3.2.2.1.2.1.3.2 解析该元素下单个的Action元素（可能是 Action或script）<br>1.5.3.2.2.1.2.1.3.3 解析&#8220;time period between the creation of the timer and the execution of the timer&#8221;<br>1.5.3.2.2.1.2.1.3.4 解析&#8220;duration between repeating timer executions until the node is left&#8221;<br>1.5.3.2.2.1.2.1.3.5 解析 &#8220;a transition-name to be taken when the timer executes&#8221;<br>1.5.3.2.2.1.2.1.4 如果是 Script 元素<br>1.5.3.2.2.1.2.1.4.1 如果将表达式直接放在了 script元素的 content中，则直接解析该content作为 script对象的expression属性<br>1.5.3.2.2.1.2.1.4.2 否则，解析变量定义；解析 expression子元素的内容，作为script对象的expression属性<br><br><br>1.5.3.3 解析 nodes<br>1.5.3.3.1 遍历所有root元素的子元素，对于那些元素名称表明其是 node 的（通过查询NodeTypes来判定，因为NodeTypes中记录了合法的node元素的名称），进行处理 <br>1.5.3.3.2 实例化 node 元素所对应的类，将流程定义对象 设置到 具体node对象的属性中。<br>1.5.3.3.3 解析node元素的公共部分<br>1.5.3.3.3.1 在ProcessDefinition 的notes属性中，追加本元素对应的node具体实现对象，如果本元素是StartState,则在ProcessDefinition中的startState属性为该元素的实现node<br>1.5.3.3.3.2 解析node 的子元素<br>1.5.3.3.3.2.1 解析子元素timer<br>1.5.3.3.3.2.1.1 解析给定node元素下的所有 Timer子元素<br>1.5.3.3.3.2.1.2 针对每个timer 子元素<br>1.5.3.3.3.2.1.2.1 新建 &#8220;创建timer&#8221;的action,将其加入node 的enter事件中<br>1.5.3.3.3.2.1.2.2 新建&#8220;取消timer&#8221;的action,将其加入 node 的leave事件中 <br>1.5.3.3.3.2.2 解析子元素 event<br>1.5.3.3.3.2.2.1 解析给定node元素下的所有 event 子元素<br>1.5.3.3.3.2.2.2 遍历所有event元素,创建对应的event ，增加到node中<br>1.5.3.3.3.2.2.3 遍历给定event元素下的所有action元素，创建对应的action,将action增加到 event中 <br>1.5.3.3.3.2.3 解析子元素 execptionHandler<br>1.5.3.3.3.2.3.1 遍历给定node元素下的所有 exception-handler 子元素<br>1.5.3.3.3.2.3.2 解析每个 exception-handler，设置该处理器所处理的违例的名称，在node 中，增加该违例处理器，解析违例处理器下的每个action. <br>1.5.3.3.3.2.4 将该node 保存在 尚未解析转移 的node 的列表中.在JpdlXmlReader的未确定转移unresolvedTransitionDestinations属性中，追加本node元素和本node元素对应的node 实现<br>1.5.3.3.4 解析node元素的特殊部分<br>1.5.3.3.4.1 如果是 node,则 解析 node 中唯一的 action元素<br>1.5.3.3.4.2 如果是 decision,则 解析 其 handler的delegation,解析引出 transition和transition的条件<br>1.5.3.3.4.3 如果是 EndState/Join/State,则 没有特殊部分需要解析。<br>1.5.3.3.4.4 如果是 fork ,则 解析其 script子元素<br>1.5.3.3.4.5 如果是 process-state,则<br>1.5.3.3.4.5.1 解析 sub-process元素，获得子流程名称和版本，然后从数据库中提取该流程的定义。<br>1.5.3.3.4.5.2 解析 variable元素，获得变量名字、访问级别、变量在子流程中映射的名称<br>1.5.3.3.4.6 如果是 StartState,则 在TaskMgmtDefinition找到 该元素的swimlane,如果有task子元素，则解析该task,并在TaskMgmtDefinition中设置startTask属性，在task对象中设置startState属性<br>1.5.3.3.4.7 如果是 superState,则 解析 该 superState中的所有node,执行方式同 1.5.3.3 <br>1.5.3.3.4.8 如果是 taskNode,则 <br>1.5.3.3.4.8.1 解析signal属性（决定多个任务中，哪个任务能继续传递本node的Token） ;<br>1.5.3.3.4.8.2 解析 createTasks属性，决定是否自动创建task;<br>1.5.3.3.4.8.3 解析taskNode中的每个task元素<br>1.5.3.3.4.8.3.1 获得 taskNode的每个task子元素，针对每个task元素进行解析 readTask<br>1.5.3.3.4.8.3.1.1 实例化task类，设置processDefinition对象到其属性中，设置task元素的name 属性到其name属性<br>1.5.3.3.4.8.3.1.2 taskMgmtDefinition中的tasks属性中，追加本task对象<br>1.5.3.3.4.8.3.1.3 解析每个timer子元素(readTaskTimers)<br>1.5.3.3.4.8.3.1.3.1 实例化 CreatTimerAction,解析 timer属性到 该对象中<br>1.5.3.3.4.8.3.1.3.1.1 解析 timer的name<br>1.5.3.3.4.8.3.1.3.1.2 解析 timer的action 子元素<br>1.5.3.3.4.8.3.1.3.1.3 解析 timer中的 dudate 属性（timer从创建到其执行的持续时间）<br>1.5.3.3.4.8.3.1.3.1.4 解析 timer中的 repeat 属性<br>1.5.3.3.4.8.3.1.3.1.5 解析 timer中的 transition 属性(到期后执行的转移)<br>1.5.3.3.4.8.3.1.3.2 在 该task 创建EVENTTYPE_TASK_CREATE 事件，在该事件中创建 上面的 CreateTimerAction<br>1.5.3.3.4.8.3.1.3.3 在该Timer元素中找到 &#8220;cancel-event&#8221; 属性，该属性指定 哪些事件中取消timer，可以指定多个事件<br>1.5.3.3.4.8.3.1.3.3 在task中 创建 可以取消 timer的事件，并在这些事件中指定 cancelTimer的Action<br>1.5.3.3.4.8.3.1.4 解析每个event子元素(readEvents),增加 event 以及 event对应的Action到Task中。<br>1.5.3.3.4.8.3.1.5 解析违例处理器： readExceptionHandlers。在Task中增加违例处理器，为例处理器中的属性指定了该违例处理器究竟处理哪个违例（或者所有违例），并且指定了发生违例时进行处理的Action<br>1.5.3.3.4.8.3.1.6 设置 Task的 "description"、"dueDate"、"priority"<br>1.5.3.3.4.8.3.1.7 在TaskNode对象 中 追加本 Task对象<br>1.5.3.3.4.8.3.1.8 设置Task 的 "blocking"属性，该属性指出，是否等待本Task完成时，本node 上的Token才能离开<br>1.5.3.3.4.8.3.1.9 处理参与者分配<br>1.5.3.3.4.8.3.1.9.1 解析 task的 swimlane属性和assignment子元素<br>1.5.3.3.4.8.3.1.9.2 如果设置了 swimlane，在taskMgmtDefinition中找到 已经解析过的swimlane的定义，并将其设置到Task<br>1.5.3.3.4.8.3.1.9.3 如果没有设置 swimlane，但设置了 "assignment" 子元素<br>1.5.3.3.4.8.3.1.9.3.1 解析 "assignment" 的委托类<br>1.5.3.3.4.8.3.1.9.3.1.1 如果 "assignment"元素 有"expression"属性，则 为委托类对象设置流程定义对象，设置表达式分配处理类名称，设置表达式<br>1.5.3.3.4.8.3.1.9.3.1.2 如果 "assignment"元素 没有"expression"属性，则请 委托类 解析 assignment的定义，包括：解析 class名称、config-type、以及 assignment的content<br>1.5.3.3.4.8.3.1.9.3.2 将 "assignment" 的委托类的对象 设置到Task的属性中<br>1.5.3.3.4.8.3.1.10 解析 &#8220;task controller&#8221;（等同于 应用形参）<br>1.5.3.3.4.8.3.1.10.0 实例化 TaskController 类<br>1.5.3.3.4.8.3.1.10.1 如果包含 class属性，则解析 出一个委托类，将其添加到taskController对象中<br>1.5.3.3.4.8.3.1.10.2 否则，解析变量访问的设置<br>1.5.3.3.4.8.3.1.10.2.1 解析每个变量子元素，获得变量名称、访问限制、在 委托类里的映射名称 <br>1.5.3.3.4.8.3.1.10.2.2 将所有变量的设置 添加到 taskController对象中 <br>1.5.3.3.4.8.3.1.11 将TaskController 放到 Task 对象属性中<br><br>1.5.3.4 解析 events，寻找根元素下的所有Event子元素，在ProcessDefinition中增加event,为event增加其对应的所有Action<br>1.5.3.5 解析 违例处理器，寻找根元素下的所有违例处理器子元素，解析其处理的违例，其采取的action,将违例处理器 追加到 ProcessDefinition的属性中<br>1.5.3.6 解析Task,寻找根元素下的所有task子元素，对其解析，并追加到 ProcessDefintion的taskMgmtDefintion的属性中<br>1.5.3.6 解析每个node元素的 引出转移， resolveTransitionDestinations<br>1.5.3.6.1 找到每个node 元素，以及node 类对象，针对每个node 元素<br>1.5.3.6.1.1 寻找每个 transition,针对每个Transition<br>1.5.3.6.1.1.1 实例化Transition,将 processDefintion 作为 transition 对象的一个属性 ,设置transiton 的name<br>1.5.3.6.1.1.2 在 node 的引出转移 属性中 增加该 transition,将该transition 的from属性 设置为该node<br>1.5.3.6.1.1.3 寻找 该转移的目标node 的名称，并在 当前node 的容器中(可能是processDefinition或 superState) 找到目标node.<br>1.5.3.6.1.1.4 在目标node 的引入转移属性中，则将该transition,并将该transition的to 属性设置为该目标node<br>1.5.3.6.1.1.5 在该转移中，增加类型为&#8220;EVENTTYPE_TRANSITIOND&#8221;的事件，并增加事件的所有Action<br>1.5.3.6.1.1.6 在该转移中，增加 违例处理器<br>1.5.3.7 解析 Action 的 Reference.找到每一个 设置了"ref-name"属性的action,在processDefinition中，找到 ref-name 的值为名称的action.并将该引用的action设置到原action中<br>1.5.3.8 校验swimlane和assignment,如果某个 swimlane的assignment委托类为空，并且它不是StartTask的swimlane，则发出警告<br>1.5.3.9 如果 解析中产生了 级别为Error的 problem，则抛出违例<br><br><br>2.持久化流程定义<br>graphSession.saveProcessDefinition(processDefinition);<br>3.实例化流程实例 processInstance = new ProcessInstance(processDefinition); <br><br>3.1 记录传进来的流程定义<br>3.2 生成rootToken<br>3.2.1 记录token开始时间<br>3.2.2 记录流程实例<br>3.2.3 记录该流程的StartState为该Token的node.<br>3.2.4 记录该流程是否设置为隐式终止 <br><br>3.3 记录流程开始时间<br>3.4 查找所有&#8220;可选模块&#8221;的定义，记录可选模块的实例。可选模块 定义在 jbpm.default.modules.properties 中。可选模块 构成了 JBPM的可插入式架构的机制。<br><br>3.5 使用配置好的 日志记录模块，记录流程创建事件。<br>3.6 如果当前上下文下 有用于持久化的session,则持久化 流程实例<br>3.7 生成 ExecutionContext<br>3.8 发布流程启动事件<br>3.8.1 在Log中记录流程启动事件 ，log.debug<br>3.8.2 在执行环境 executionContext 中 设置事件源<br>3.8.3 发布并传递事件<br>3.8.3.1 判断是否需要传递事件 如果事件源不是当前对象，则需要传递事件 <br>3.8.3.2 执行事件对应的静态Action,找到流程定义中定义的类型为流程启动的事件，并执行定义中 该事件的Action.<br>3.8.3.2.1 找到流程定义时设定的 本流程元素中的给定类型的事件<br>3.8.3.2.2 执行event对应的actions<br>3.8.3.2.2.1 遍历所有Action<br>3.8.3.2.2.2 如果 本action接受其他 流程元素传递来的事件，或者 这不是一个传递来的事件 ，则执行本action<br>3.8.3.2.2.3 创建Action log<br>3.8.3.2.2.4 增加ActionLog日志项到 LoggingInstance 中，同时声明 该日志项，是一个组合日志的第一项<br>3.8.3.2.2.5 打印action执行 的log, log.debug<br>3.8.3.2.2.6 执行action<br>3.8.3.2.2.6.1 实例化 actionHandler<br>3.8.3.2.2.6.2 调用 actionHandler的execute方法<br>3.8.3.2.2.7 如果action执行抛出了违例 <br>3.8.3.2.2.7.1 log.error<br>3.8.3.2.2.7.2 使用违例处理器来处理违例<br>3.8.3.2.2.7.2.1 在该流程元素中，找到应该处理 给定 违例 的违例处理器<br>3.8.3.2.2.7.2.1.1 遍历所有违例处理器，判断每个违例处理器是否应该处理一个违例<br>3.8.3.2.2.7.2.2 请求该违例处理器处理违例<br>3.8.3.2.2.7.2.2.1 执行该违例处理器的所有action<br>3.8.3.2.2.7.2.3 如果违例处理器 没有处理成功，则请求该流程元素的父元素处理该违例，如果没有父元素，则抛出一个缺省的委托类违例<br>3.8.3.2.2.8 执行Action后，必须要做下面的收尾工作<br>3.8.3.2.2.7.1 将executionContext中的Action属性置为空<br>3.8.3.2.2.7.2 标识 组合日志完成 <br><br>3.8.3.3 执行事件对应的动态Action,动态Action，为运行时增加到ProcessInstance中的，与某个事件对应。<br>3.8.3.4 如果本 图元素的父元素存在，则调用父元素的 发布并传递事件 方法（参见上面的 3.8.3）。<br>3.8.4 在执行环境中 清空事件源<br><br><br><br><br><br>4.持久化 流程实例<br>5.通过hibernate 从持久层 装载4个对象实例 <br>processDefinition = graphSession.loadProcessDefinition(processDefinition.getId());<br>processInstance = graphSession.loadProcessInstance(processInstance.getId());<br>contextInstance = processInstance.getContextInstance();<br>taskMgmtInstance = processInstance.getTaskMgmtInstance();<br><br>JBPM版本：3.0 beta1<br>作者：beehive.cn<br>版权所有：beehive.cn<br>查看更多JBPM源码追踪，请到 <a href="http://www.beehive.cn/modules/newbb/viewforum.php?forum=14" target=_blank><font color=#749b1a>http://www.beehive.cn/modules/newbb/viewforum.php?forum=14</font></a><br>
<img src ="http://www.blogjava.net/swboo/aggbug/129610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/swboo/" target="_blank">大博的BLOG</a> 2007-07-11 14:07 <a href="http://www.blogjava.net/swboo/articles/129610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBPM3.2初看</title><link>http://www.blogjava.net/swboo/articles/129154.html</link><dc:creator>大博的BLOG</dc:creator><author>大博的BLOG</author><pubDate>Mon, 09 Jul 2007 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/swboo/articles/129154.html</guid><wfw:comment>http://www.blogjava.net/swboo/comments/129154.html</wfw:comment><comments>http://www.blogjava.net/swboo/articles/129154.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/swboo/comments/commentRss/129154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/swboo/services/trackbacks/129154.html</trackback:ping><description><![CDATA[现在就看到了JBPM3.2中的新东西<br>
<div class=titlepage>
<div>
<div>
<h3 class=title><a name=assignment.element></a>18.4.26.&nbsp;assignment</h3>
</div>
</div>
<div></div>
</div>
<div class=table><a name=assignment.schema></a>
<p class=title><strong>Table&nbsp;18.25.&nbsp;</strong></p>
<table border=1>
    <colgroup>
    <col>
    <col>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th align=middle>Name</th>
            <th align=middle>Type</th>
            <th align=middle>Multiplicity</th>
            <th align=middle>Description</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>expression</td>
            <td>attribute</td>
            <td>optional</td>
            <td>For historical reasons, this attribute expression does <span class=bold><strong>not</strong></span> refer to <a title=18.3.&nbsp;Expressions href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#expressions"><u><font color=#800080>the jPDL expression</font></u></a>, but instead, it is an assignment expression for the jBPM identity component. For more information on how to write jBPM identity component expressions, see <a title="11.11.2.&nbsp;Assignment expressions" href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/taskmanagement.html#assignmentexpressions"><u><font color=#0000ff>Section&nbsp;11.11.2, &#8220;Assignment expressions&#8221;</font></u></a>. Note that this implementation has a dependency on the jbpm identity component. </td>
        </tr>
        <tr>
            <td>actor-id</td>
            <td>attribute</td>
            <td>optional</td>
            <td>An actorId. Can be used in conjunction with pooled-actors. The actor-id is resolved as <a title=18.3.&nbsp;Expressions href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#expressions"><u><font color=#800080>an expression</font></u></a>. So you can refer to a fixed actorId like this <tt class=literal>actor-id="bobthebuilder"</tt>. Or you can refer to a property or method that returns a String like this: <tt class=literal>actor-id="myVar.actorId"</tt>, which will invoke the getActorId method on the task instance variable "myVar". </td>
        </tr>
        <tr>
            <td>pooled-actors</td>
            <td>attribute</td>
            <td>optional</td>
            <td>A comma separated list of actorIds. Can be used in conjunction with actor-id. A fixed set of pooled actors can be specified like this: <tt class=literal>pooled-actors="chicagobulls, pointersisters"</tt>. The pooled-actors will be resolved as <a title=18.3.&nbsp;Expressions href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#expressions"><u><font color=#800080>an expression</font></u></a>. So you can also refer to a property or method that has to return, a String[], a Collection or a comma separated list of pooled actors. </td>
        </tr>
        <tr>
            <td>class</td>
            <td>attribute</td>
            <td>optional</td>
            <td>the fully qualified classname of an implementation of <tt class=literal>org.jbpm.taskmgmt.def.AssignmentHandler</tt></td>
        </tr>
        <tr>
            <td>config-type</td>
            <td>attribute</td>
            <td>optional</td>
            <td>{<a title="18.2.3.1.&nbsp;config-type field" href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#configtypefield"><u><font color=#800080>field</font></u></a>|<a title="18.2.3.2.&nbsp;config-type bean" href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#configtypebean"><u><font color=#800080>bean</font></u></a>|<a title="18.2.3.3.&nbsp;config-type constructor" href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#configtypeconstructor"><u><font color=#800080>constructor</font></u></a>|<a title="18.2.3.4.&nbsp;config-type configuration-property" href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#configtypeconfigurationproperty"><u><font color=#800080>configuration-property</font></u></a>}. Specifies how the assignment-handler-object should be constructed and how the content of this element should be used as configuration information for that assignment-handler-object. </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>{content}</td>
            <td>optional</td>
            <td>the content of the assignment-element can be used as configuration information for your AssignmentHandler implementations. This allows the creation of reusable delegation classes. for more about delegation configuration, see <a title="18.2.3.&nbsp;Configuration of delegations" href="file:///D:/Program%20Files/Java/eclipse/jbpm-jpdl-3.2.GA/doc/userguide/html/jpdl.html#configurationofdelegations"><u><font color=#800080>Section&nbsp;18.2.3, &#8220;Configuration of delegations&#8221;</font></u></a>. </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/swboo/aggbug/129154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/swboo/" target="_blank">大博的BLOG</a> 2007-07-09 22:14 <a href="http://www.blogjava.net/swboo/articles/129154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>