<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>daitzmba</title>
    <description></description>
    <link>http://daitzmba.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Jbpm并发子流程又一解决方案</title>
        <author>daitzmba</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daitzmba.javaeye.com">daitzmba</a>&nbsp;
          链接：<a href="http://daitzmba.javaeye.com/blog/104780" style="color:red;">http://daitzmba.javaeye.com/blog/104780</a>&nbsp;
          发表时间: 2007年07月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">并发子流程一直是困扰Jbpm爱好者的一大难题,JeffreyHsu 曾给出一个通过循环fork的解决方案(http://www.javaeye.com/article/29917),实际上jbpm也可以使用挂接action的方式生成子流程,所有生成的子流程都由同一个rootTooken下的childrenTooken来维护</font></p>
<p><font face="Arial">流程定义如下</font></p>
<div class="code_title">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">process-definition</span><span>&nbsp;&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;主流程&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">start-state</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;开始节点&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;fork&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;fork&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">start-state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">fork</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;fork&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;子流程分派&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;子流程分派节点&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">fork</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">state</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;子流程分派节点&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;结束所有子流程&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;结束所有子流程处理节点&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="tag"><span></span><span class="tag-name">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;子流程&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;子流程&quot;</span><span class="tag">&gt;</span>&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;增加子流程&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;子流程分派节点&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;创建子流程&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;createSubProcess&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">leavename</span><span class="tag">&gt;</span><span>子流程名称</span><span class="tag"><span class="tag-name">leavename</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">process-state</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;子流程&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">sub-process</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;子流程名称&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;join&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">process-state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;结束所有子流程处理节点&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">event</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;node-enter&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;结束所有子流程&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;killAllSubProcess&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">event</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;join&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">join</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;join&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;end&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">join</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">end-state</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;end&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">end-state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">process-definition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
</div>
<span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><span>
<p><font face="Arial">class killAllSubProcess implements ActionHandler {</font></p>
<p><font face="Arial">&nbsp; public void execute(ExecutionContext executionContext) throws Exception {<br />
&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp; Map m = executionContext.getProcessInstance().getRootToken().getActiveChildren();<br />
&nbsp;&nbsp; Iterator iter = m.values().iterator();<br />
&nbsp;&nbsp; while( iter.hasNext() ) {<br />
&nbsp;&nbsp;&nbsp; Token t = (Token)iter.next();<br />
&nbsp;&nbsp;&nbsp; if( t.getSubProcessInstance()!=null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; t.getSubProcessInstance().end();<br />
&nbsp;&nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp; } <br />
&nbsp; } }</font></p>
<p><font face="Arial">class createSubProcess implements ActionHandler {</font></p>
<p><font face="Arial">String leavename;<br />
&nbsp;<br />
&nbsp;public void execute(ExecutionContext executionContext) throws Exception {<br />
&nbsp; Token childToken = new Token( executionContext.getToken(), &quot;TK&quot; + ((new Random()).nextInt()) );<br />
&nbsp; ExecutionContext newctx = new ExecutionContext(childToken);<br />
&nbsp; executionContext.getTransitionSource().leave(newctx, leavename );<br />
&nbsp;}</font></p>
<p><font face="Arial">}</font></p>
<p><font face="Arial">&nbsp;</font></p>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://daitzmba.javaeye.com/blog/104780#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jul 2007 17:10:57 +0800</pubDate>
        <link>http://daitzmba.javaeye.com/blog/104780</link>
        <guid>http://daitzmba.javaeye.com/blog/104780</guid>
      </item>
  </channel>
</rss>