<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>wuxufeng8080</title>
    <description></description>
    <link>http://wuxufeng8080.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>会签（二）--二次会签</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/139021" style="color:red;">http://wuxufeng8080.javaeye.com/blog/139021</a>&nbsp;
          发表时间: 2007年11月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>需求描述：用户可以在任意环节开启会签，用以征求意见。意见征求完毕，主流程继续运行。</p>
<p>方案描述：重新开启一个流程，这个流程只有会签，却只用作征求意见，只有提交按钮。</p>
<p>难点就是怎样显示一个便于用户查看的签核日志，所以我们在jbpm外层加了一个日志系统，用以记录流程签核日志。</p>
<p>待续。。。。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/139021#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Nov 2007 09:58:40 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/139021</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/139021</guid>
      </item>
      <item>
        <title>会签方案（一）</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/138981" style="color:red;">http://wuxufeng8080.javaeye.com/blog/138981</a>&nbsp;
          发表时间: 2007年11月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>需求描述： 用户提出会签之后，需要等所有的会签任务完成之后，再根据用户意见来判断是同意还是拒绝，所以，原来的那种方式还是无法实现这个需求。就在原来方案上做了部门修改，于这个星期一终于完成了会签。</p>
<p>下面就跟大家分享一下我的实现方法。</p>
<p>流程配置</p>
<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">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;060-Cosigning&quot;</span><span>&nbsp;</span><span class="attribute">create-tasks</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">signal</span><span>=</span><span class="attribute-value">&quot;never&quot;</span><span>&nbsp;</span><span class="attribute">end-tasks</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;cosigner&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&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=""><span>&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;createInstance&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.bpm.action.CreateCosignTaskAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">event</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&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;submit&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;980-Finished&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>signal=&ldquo;never&rdquo;，这样在这个task node下所有的任务都完成之后，token不会移到下一个node，这个时候就可以根据用户提交的意见情况来进行判断，然后根据判断结果再将token移到相应的node。</p>
<p>下面是逻辑判断</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//&nbsp;cosign&nbsp;transition </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>cosignFlag&nbsp;=&nbsp;(String)objTaskInstance.getVariable(</span><span class="string">&quot;CosignFlag&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;cosignFlag&nbsp;!=</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;cosignFlag.equals(</span><span class="string">&quot;true&quot;</span><span>)&nbsp;&amp;&amp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objTaskMgmtInstance.getUnfinishedTasks(&nbsp;objTaskInstance.getToken()&nbsp;).size()&nbsp;==&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objProcessInstance&nbsp;=&nbsp;objTaskInstance.getTaskMgmtInstance().getProcessInstance(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cosignTransition&nbsp;=&nbsp;(String)objTaskInstance.getVariable(</span><span class="string">&quot;CosignTransition&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;cosignTransition!=</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;cosignTransition.equals(</span><span class="string">&quot;reject&quot;</span><span>)&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objProcessInstance.signal(&nbsp;</span><span class="string">&quot;reject&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;objProcessInstance.signal(&nbsp;</span><span class="string">&quot;submit&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>首先判断是否进入会签node，在进入会签node之前，会把设置一个会签标记；然后在判断会签任务是否全部结束，如果全部结束，就根据会签意见（CosignTransition）来做迁移。在never时，需要用processInstance.signal来移动token。</p>
<p>这样就完成了以上的需求。</p>
<p>剩下还有一个更复杂的，就是二次会签，主要是签核日志有点复杂，哈哈哈，继续努力ing</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/138981#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Thu, 08 Nov 2007 09:48:32 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/138981</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/138981</guid>
      </item>
      <item>
        <title>新版代理人解决方案</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/138959" style="color:red;">http://wuxufeng8080.javaeye.com/blog/138959</a>&nbsp;
          发表时间: 2007年11月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>上次讲到代理人的解决方案，但是在使用的过程中出了很多的问题，在发现问题后，废除了原有的解决方案，重新设计了代理人方案。在jbpm外层，增加代理人信息，当代理人提交任务时，真正的处理人还是那个被代理人，这样不会导致混乱。</p>
<p>1、代理人机制是建立在人事的请假基础上的，当请假是就会设置代理人。</p>
<p>2、当流程提交到一个已经请假的人时，就会返回代理人，增加代理人资料。这样，两个人都能操作这个任务。</p>
<p>3、当代理人操作任务时，是被代理人的名义去完成这个任务的。</p>
<p>4、最后就是显示签核日志的问题，如果是代理人，就在代理人的后面显示一个&rdquo;代理&ldquo;字样。</p>
<p>从整体上来讲，这次的方案是比较合理的，而且效果也不错，没有出现其他的一些毛病。关键是从整体上跟jbpm分离，不会对流程配置产生影响。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/138959#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Nov 2007 09:35:49 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/138959</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/138959</guid>
      </item>
      <item>
        <title>动态增加PooledActor</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/130540" style="color:red;">http://wuxufeng8080.javaeye.com/blog/130540</a>&nbsp;
          发表时间: 2007年10月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>请看代码</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>taskInstance&nbsp;=&nbsp;taskMgmtSession.loadTaskInstance(taskInstanceId); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>Set
    <pooledactor></pooledactor>
    &nbsp;actorSet&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashSet
    <pooledactor></pooledactor>
    (); &nbsp;&nbsp;</span> </li>
    <li class=""><span>PooledActor&nbsp;objPooledActor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PooledActor(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>objPooledActor.setActorId(</span><span class="string">&quot;C0512001&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>objPooledActor.setSwimlaneInstance(taskInstance.getSwimlaneInstance()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>actorSet.add(objPooledActor); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>objPooledActor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PooledActor(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>objPooledActor1.setActorId(</span><span class="string">&quot;C0512002&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>objPooledActor1.setSwimlaneInstance(taskInstance.getSwimlaneInstance()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>actorSet.add(objPooledActor1); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>taskInstance.setPooledActors(actorSet);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>这段是代码的节选，主要的问题在于setPooledActors的这个set里面的元素是PooledActor，以前我以为是string，导致出错，后来查了一下，原来是这个回事，然后我的代理人问题就解决了。</p>
<p>通过程序根据查询得到的代理人，然后把原来的处理人及代理人都添加到PooledActors，这个步骤可以在swimlane中实现，也可以通过程序在这个任务创建完成后实现。</p>
<p>注： 记得要把actorId赋值为null，否则PooledActors不会生效。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/130540#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 10 Oct 2007 10:17:51 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/130540</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/130540</guid>
      </item>
      <item>
        <title>有关会签的讨论</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/130515" style="color:red;">http://wuxufeng8080.javaeye.com/blog/130515</a>&nbsp;
          发表时间: 2007年10月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这里仅讨论通过action动态创建task来实现的方式。</p>
<p>决定会签的方式主要是通过task-node的signal属性来决定的。</p>
<ol>
    <li>会签中，一个人reject，则结束会签，退回起草人；全部通过，则流到下一个node。</li>
    <li>会签中，等待所有的人完成会签任务，然后根据会签人的意见（即所选的transition），来决定流程流向哪个node。</li>
</ol>
<p>第一种情况，signal=&quot;last-wait&quot;，只要一个人拒绝，则系统需要将其他没有完成的任务完成掉，在完成时需要以拒绝的那个transition来做end，具体可以参考 <font face="Arial"><a href="http://tomkoo.javaeye.com/blog/24690">http://tomkoo.javaeye.com/blog/24690</a>&nbsp; ，里面有很清楚的代码及解释。</font></p>
<p>第二种情况， signal=&quot;never&quot;，这种情况正是我现在需要解决的。以前一直没有空来测试。今天看了一下signal的说面，突然来了灵感，以前也问过别人，好像也这么说的。因为使用never后，流程不会往下执行，需要通过processInstance.signal(&quot;xx&quot;)来确定流程流程哪个节点。</p>
<p>请看下面我的实现。</p>
<p>第一步一样，进入节点（node-enter）需要动态创建会签任务实例。</p>
<div class="code_title">xml 代码</div>
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><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></span></li>
    <li class=""><span>&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;createInstance&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.bpm.action.DynamicCreateTaskAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">event</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DynamicCreateTaskAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BaseAction&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;serialVersionUID&nbsp;=&nbsp;1L;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;execute(ExecutionContext&nbsp;executionContext)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Token&nbsp;token&nbsp;=&nbsp;executionContext.getToken();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TaskMgmtInstance&nbsp;tmi&nbsp;=&nbsp;executionContext.getTaskMgmtInstance();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TaskNode&nbsp;taskNode&nbsp;=&nbsp;(TaskNode)&nbsp;executionContext.getNode();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task&nbsp;task&nbsp;=&nbsp;(Task)taskNode.getTasks().iterator().next();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmi.createTaskInstance(task,&nbsp;token).setActorId(&nbsp;</span><span class="string">&quot;T0512001&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmi.createTaskInstance(task,&nbsp;token).setActorId(&nbsp;</span><span class="string">&quot;T0512002&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>为了方便，随便指定了两个参与者。在实际情况中，这些参与者应该是在客户端指定的。然后通过流程变量的方式传入jbpm中。</p>
<p>第二步是关键，在结束任务（<font face="Arial">task-end</font>）事件中，判断用户到底选择了哪个transition，然后再判断任务有无全部结束，如果已经全部结束，则通过processInstance.signal(transition)驱动流程流程指定的node。经过测试，在task-end事件中，无法再调用signal方法，两个方法冲突，本身task-end就在signal方法中。只能在task-end完成之后，通过另外的session来驱动流程的流向。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/130515#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 10 Oct 2007 10:10:01 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/130515</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/130515</guid>
      </item>
      <item>
        <title>任务处理人设置的几种方式</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/130312" style="color:red;">http://wuxufeng8080.javaeye.com/blog/130312</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>就目前了解</p>
<p>有那么几种方式</p>
<ol>
    <li>swimlane： 在我的流程中，使用最多的是这种情况，因为我的参与者都是从HR数据库中直接查询获得的。 </li>
    <li>identity： 这种方式只在我刚开始测试的时候使用，直接将任务分派给一个滴定的人或者部门角色等等。 </li>
    <li>action： 有时候需要动态的创建任务，这个时候就需要通过这种方式。 </li>
    <li>流程变量： 这种方式是我刚刚开别人的blog发现的，可以直接调用流程变量来给这个任务分派参与者，原来的做法是通过swimlane先获取流程变量，然后再分派参与者，这样方式可以减少很多不必要的swimlane。&nbsp;&nbsp;&nbsp; <assignment actor-id="#{actor}"></assignment>确定任务参与者。
    <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">&lt;</span><span class="tag-name">task</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">actor-id</span><span>=</span><span class="attribute-value">&quot;#{requisitioner_FK}&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">assignment</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    注：在使用流程变量指定actor时，不能同swimlane同时使用，否则，task会先使用swimlane来指定actor，而不使用流程变量来指定actor。 </li>
    <li>AssignHandler： <assignment class="com.sky.plugin.jbpm.def.ActorsHandel"></assignment>通过AssignHandler动态的对流程实例定义Actor。<br />
    </li>
</ol>
<p>最后一种还没有经过实践，不知道效果怎么样。还有一个问题就是，这个流程变量需要在什么时候初始化，按照现有的经验，应该只需要在这个任务创建之前初始化这个变量就可以。这个星期就做实验，验证一下。</p>
<p>最后还有一个比较棘手的事情就是会签，正在研究别人的blog，争取明天搞定。加油</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/130312#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 09 Oct 2007 20:40:24 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/130312</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/130312</guid>
      </item>
      <item>
        <title>jbpm应用实例（Struts2+Spring2+iBatis2.3+WebService）</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/102008" style="color:red;">http://wuxufeng8080.javaeye.com/blog/102008</a>&nbsp;
          发表时间: 2007年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;晕，保存了一下原来写的东西没了，哭啊~~~~~~~（下次再补上，大家自己看源码吧，写的不怎么样，请见谅）</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/102008#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jul 2007 16:30:00 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/102008</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/102008</guid>
      </item>
      <item>
        <title>相同功能的循环节点（jbpm应用）</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/99870" style="color:red;">http://wuxufeng8080.javaeye.com/blog/99870</a>&nbsp;
          发表时间: 2007年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在企业应用中，会有很多这样的情况，一个人起草之后，会需要他的上级一级一级的签，直到签到符合要求的那个主管等级，然后结束。这种情况，有不过不固定，因为每个人的上级不一样，所以如果要把这个图都画出来的话及其复杂，这样就有了以下的构思。通过同一个node的循环，来实现这种需要上级签合的情况。</p>
<p>下面是一个我们公司的资讯申请单流程</p>
<p><img src="d:\ir.bmp" height="479" alt="" width="700" /></p>
<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">&lt;?</span><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></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;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;urn:jbpm.org:jpdl-3.1&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;IT_InformationRequisition&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;userHandler&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.swinlane.UserSwimlane&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">swimlane</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;handler&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.swinlane.HandlerSwimlane&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">swimlane</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;handlerClose&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.swinlane.HandlerCloseSwimlane&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">swimlane</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;leader&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.swinlane.DomainLeaderSwimlane&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">swimlane</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;userManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.swinlane.UserManagerSwimlane&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">swimlane</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&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;start&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;draft&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;Drafting&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;HandlerAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">start-state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&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">&lt;/</span><span class="tag-name">end-state</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;HandlerAcceptance&quot;</span><span>&nbsp;&nbsp;</span><span class="attribute">create-tasks</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;HandlerAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&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;createInstance&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.action.DynamicTaskAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &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">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">event</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;LeaderConfirmation&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;LeaderConfirmation&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;leader&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;HandlerClose&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;reject&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;Drafting&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;Drafting&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;userHandler&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;HandlerAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;delete&quot;</span><span>&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">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;HandlerClose&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;handler&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;UserAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;UserAcceptance&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;userHandler&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;UserDeptAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&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;reject&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;HandlerClose&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;UserDeptAcceptance&quot;</span><span>&nbsp;</span><span class="attribute">create-tasks</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;deptAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&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;createInstance&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.engine.wf.action.UserManagerAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &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">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">event</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;loop&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;UserDeptAcceptance&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;DomainLeaderClose&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;reject&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;HandlerClose&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task-node</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;DomainLeaderClose&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">swimlane</span><span>=</span><span class="attribute-value">&quot;leader&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&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;accept&quot;</span><span>&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">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&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;reject&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;HandlerClose&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">transition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">process-definition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这里应用到循环节点的是UserDeptAcceptance，需要签上级，直到处级主管。</p>
<p>通过UserManagerAction，来动态创建taskInstance，jbpm好像有一个特性，一个node的task第一次创建之后，如果重新回到这个node，这个taskInstance的actorId还是原来的那个，所以我就用动态创建taskInstance，这样可以在每次进入这个node的时候给这个赋予不同的actorId。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.ivo.engine.wf.action; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.graph.def.ActionHandler; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.graph.exe.ExecutionContext; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.graph.exe.Token; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.graph.node.TaskNode; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.taskmgmt.def.Task; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.taskmgmt.exe.TaskMgmtInstance; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;com.ivo.engine.dao.HRDao; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;com.ivo.engine.model.Employee; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;UserManagerAction&nbsp;</span><span class="keyword">implements</span><span>&nbsp;ActionHandler&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;serialVersionUID&nbsp;=&nbsp;1L;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;execute(ExecutionContext&nbsp;executionContext)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;actorId&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;currDeptLevel&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;loopActorId&nbsp;=&nbsp;(String)executionContext.getVariable(</span><span class="string">&quot;LoopActorId&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;startActorId&nbsp;=&nbsp;(String)executionContext.getVariable(</span><span class="string">&quot;StartActorId&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;emp&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Employee&nbsp;manager&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;loopActorId&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp&nbsp;=&nbsp;startActorId; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp&nbsp;=&nbsp;loopActorId; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manager&nbsp;=&nbsp;HRDao.getManager(emp); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actorId&nbsp;=&nbsp;manager.getDeptManager_FK(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currDeptLevel&nbsp;=&nbsp;manager.getDeptLevel(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;variables </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executionContext.setVariable(</span><span class="string">&quot;LoopActorId&quot;</span><span>,&nbsp;actorId.trim()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executionContext.setVariable(</span><span class="string">&quot;CurrDeptLevel&quot;</span><span>,&nbsp;currDeptLevel); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executionContext.setVariable(</span><span class="string">&quot;LoopTag&quot;</span><span>,&nbsp;</span><span class="string">&quot;loop&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;create&nbsp;task </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Token&nbsp;token&nbsp;=&nbsp;executionContext.getToken();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TaskMgmtInstance&nbsp;tmi&nbsp;=&nbsp;executionContext.getTaskMgmtInstance();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TaskNode&nbsp;taskNode&nbsp;=&nbsp;(TaskNode)&nbsp;executionContext.getNode();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task&nbsp;task&nbsp;=&nbsp;(Task)taskNode.getTasks().iterator().next();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmi.createTaskInstance(task,&nbsp;token).setActorId(actorId.trim());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>通过两个variable，来控制这个loop是否继续。</p>
<p>在taskInstance end的时候判断两个variable。</p>
<p>下面是end的方法实现。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>ContextInstance&nbsp;contextInstance&nbsp;=&nbsp;taskInstance.getTaskMgmtInstance().getProcessInstance().getContextInstance(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;loopTag&nbsp;=&nbsp;(String)contextInstance.getVariable(</span><span class="string">&quot;LoopTag&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(loopTag&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;loopTag.equals(</span><span class="string">&quot;loop&quot;</span><span>))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;deptLevel&nbsp;=&nbsp;Integer.valueOf((String)contextInstance.getVariable(</span><span class="string">&quot;DeptLevel&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;deptLevel&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkflowException(</span><span class="string">&quot;in&nbsp;loop&nbsp;node&nbsp;,&nbsp;variable(DeptLevel)&nbsp;&nbsp;is&nbsp;null,&nbsp;pls&nbsp;set&nbsp;at&nbsp;start&nbsp;node&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;currDeptLevel&nbsp;=&nbsp;Integer.valueOf((String)contextInstance.getVariable(</span><span class="string">&quot;CurrDeptLevel&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;currDeptLevel&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkflowException(</span><span class="string">&quot;in&nbsp;loop&nbsp;node&nbsp;,&nbsp;variable(CurrDeptLevel)&nbsp;&nbsp;is&nbsp;null,&nbsp;pls&nbsp;set&nbsp;at&nbsp;swimlane&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(currDeptLevel&nbsp;&lt;=deptLevel)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskInstance.end(</span><span class="string">&quot;accept&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextInstance.setVariable(</span><span class="string">&quot;LoopTag&quot;</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;taskInstance.end(</span><span class="string">&quot;loop&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskInstance.end(</span><span class="string">&quot;accept&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jbpmContext.save(taskInstance);&nbsp;&nbsp;</span></li>
</ol>
</div>
对比DeptLevel和CurrDeptLevel两个变量，就可以判断是继续loop，还是从accept结束这个loop。
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/99870#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 10 Jul 2007 20:38:25 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/99870</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/99870</guid>
      </item>
      <item>
        <title>实际应用中的两个通用化实现（struts2）</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/99495" style="color:red;">http://wuxufeng8080.javaeye.com/blog/99495</a>&nbsp;
          发表时间: 2007年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>现在手头的工作流页面端用的是struts2，由于以前没有用过webwork，所以现在用起来基本上是摸着石头过河，感觉蛮辛苦的，不过很有挑战性。</p>
<p>在经过一个早上的努力之后，实现了针对工作流页面的转发action，用于将不同的ProcessDefinition转发到相应的action。这里听取了同事的意见，直接把页面action的名字和流程定义名默认一样，这样就可以少一张table来维护，何乐不为。所以这个DispatchAction最后变成很简单的，就实现了一个可以动态转发action的动作。参考apache上面的文章，很快完成了这一部分的操作。</p>
<div class="code_title">xml 代码 (struts2配置文件)</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><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;FlowDispatch&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ivo.wfl.action.FlowDispatchAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span class="tag"><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<div class="code_title"></div>
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">global-results</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">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;forwardAction&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;chain&quot;</span><span class="tag">&gt;</span><span>${forwardAction}</span><span class="tag"><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span class="tag"><span class="tag-name">global-results</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
java 代码 (DispatchAction)</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.ivo.common.BaseAction; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;FlowDispatchAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BaseAction&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;forwardAction; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;FlowDispatchAction()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;workflow_ID&nbsp;=&nbsp;request.getParameter(</span><span class="string">&quot;Workflow_ID&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forwardAction&nbsp;=&nbsp;workflow_ID; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;forwardAction&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getForwardAction()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;forwardAction; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setForwardAction(String&nbsp;forwardAction)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.forwardAction&nbsp;=&nbsp;forwardAction; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>以上的实现基本上参考apache上的说明文档，设置一个全局result，type为chain，这样在每一个package中都可以调用，并能保存request范围的数据。在repuest中会把ProcessDefinition带过来，这样通过约定的方式，直接转发到对应的action。</p>
<p>&nbsp;</p>
<p>然后就是页面端button的部分，每一个环节都有不同的按钮，所以这里也用约定的方式，transition名字就作为button的名字，然后action里面的方法也要与transition相同，这样，在调用相应的button时，就默认去执行这个transition对应的方法。这样的实现比较简单。</p>
<div class="code_title">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ButtonTag&nbsp;</span><span class="keyword">extends</span><span>&nbsp;TagSupport{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;taskName; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Long&nbsp;taskId; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;workflowId; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;doEndTag()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JspException&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request&nbsp;objRequest&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Request(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response&nbsp;objResponse&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;acceptButton&nbsp;=&nbsp;</span><span class="string">&quot;accept&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;saveButton&nbsp;=&nbsp;</span><span class="string">&quot;save&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;out&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(taskId&nbsp;==&nbsp;</span><span class="number">0</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;+=&nbsp;</span><span class="string">&quot;&lt; input&nbsp;type=\&quot;submit\&quot;&nbsp;id=\&quot;&nbsp;&quot;</span><span>&nbsp;+&nbsp;workflowId&nbsp;+&nbsp;</span><span class="string">&quot;_0\&quot;&nbsp;&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;name=\&quot;action:&quot;</span><span>&nbsp;+&nbsp;acceptButton&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.workflowId&nbsp;+&nbsp;</span><span class="string">&quot;\&quot;&nbsp;value=\&quot;&quot;</span><span>&nbsp;+&nbsp;acceptButton&nbsp;+&nbsp;</span><span class="string">&quot;\&quot;&nbsp;&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;onclick=\&quot;form.onsubmit=null\&quot;/&gt;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;+=&nbsp;</span><span class="string">&quot;&lt; input&nbsp;type=\&quot;submit\&quot;&nbsp;id=\&quot;&nbsp;&quot;</span><span>&nbsp;+&nbsp;workflowId&nbsp;+&nbsp;</span><span class="string">&quot;_0\&quot;&nbsp;&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;name=\&quot;action:&quot;</span><span>&nbsp;+&nbsp;saveButton&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.workflowId&nbsp;+&nbsp;</span><span class="string">&quot;\&quot;&nbsp;value=\&quot;&quot;</span><span>&nbsp;+&nbsp;saveButton&nbsp;+&nbsp;</span><span class="string">&quot;\&quot;&nbsp;&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;onclick=\&quot;form.onsubmit=null\&quot;/&gt;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objRequest.setTaskId(</span><span class="keyword">this</span><span>.taskId); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objResponse&nbsp;=&nbsp;objRequest.call(</span><span class="string">&quot;Transition&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(&nbsp;String&nbsp;transition&nbsp;:&nbsp;objResponse.getTransitions())&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(transition.equals(</span><span class="string">&quot;loop&quot;</span><span>))&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;+=&nbsp;</span><span class="string">&quot;&lt; input&nbsp;type=\&quot;submit\&quot;&nbsp;id=\&quot;&nbsp;&quot;</span><span>&nbsp;+&nbsp;workflowId&nbsp;+&nbsp;</span><span class="string">&quot;_0\&quot;&nbsp;&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span> </li>
    <li class=""><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;</span><span class="string">&quot;name=\&quot;action:&quot;</span><span>+transition&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.workflowId&nbsp;+&nbsp;</span><span class="string">&quot;\&quot;&nbsp;value=\&quot;&quot;</span><span>&nbsp;+&nbsp;transition&nbsp;+&nbsp;</span><span class="string">&quot;\&quot;&nbsp;&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span> </li>
    <li class="alt"><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;</span><span class="string">&quot;onclick=\&quot;form.onsubmit=null\&quot;/&gt;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageContext.getOut().print(out); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SKIP_BODY; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<span class="string"><span class="string"><span class="string">
<p>这种方法跟下面那种其实很类似，只需要把onclick部分的代码替换为自定义的js方法即可objRequest这个对象是用来调用web service。通过web service返回了这个taskInstance的transtion，然后根据这个transition名字来循环创建button。</p>
<p>&nbsp;</p>
<p>最后就是button端怎么调用action中的方法，刚开始我用struts2默认的格式，使用string将这一段代码拼出来。后来因为客户端验证的问题，因为页面上有很多必选或者其他非业务数据的验证，所以最好能在页面端就验证，这样能减少server的压力。所以出了几个通用的js方法，来调用相应的action。因为流程中transition的名字也不会很多，就那么几个，所以很少会出现添加js方法的时候，最多就再添加一两个。</p>
<p>到下午，把上面的程序都调通，这样，我的第一个表单到目前为止改善的差不多了。</p>
<p>继续努力。</p>
</span></span></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/99495#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Mon, 09 Jul 2007 20:18:54 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/99495</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/99495</guid>
      </item>
      <item>
        <title>Swimlane的理解</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/97757" style="color:red;">http://wuxufeng8080.javaeye.com/blog/97757</a>&nbsp;
          发表时间: 2007年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>刚开始的时候，对这个概念超先不懂，什么叫泳道啊（主要是UML自己也没有学好）。然后看别人的文章看完之后就更惨了，彻底什么都搞不清楚了。</p>
<p>现在看来，这个就是一个流程角色，而且可以当成一个人来看，而不需要指定到什么role，等等其他概念上了，这样就能很清楚了。而且还起到一个解藕的作用，使task和actor之间有了一个中间桥梁，这样当actor变化的时候只需要修改swimlane就好了，如果写成一个动态类，那么，只要修改后台数据库数据就可以了。</p>
<p>想当初为了解决公司组织结构和流程衔接的问题，简直想破的脑袋。现在就针对每一个swimlane，作一个class，然后通过这个class去组织结构数据库抓相应的数据即可，很动态，哈哈。非常的满意这个设计，当初也不知道怎么回事，就是想不通。</p>
<p>应该这是最简单的一种actor应用了。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/97757#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jul 2007 13:04:56 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/97757</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/97757</guid>
      </item>
      <item>
        <title>流程控制的实现类</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/97395" style="color:red;">http://wuxufeng8080.javaeye.com/blog/97395</a>&nbsp;
          发表时间: 2007年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这是第一个版本，写的可能比较龊，还请大家见谅</p>
<div class="code_title">java 代码 （创建StartTask）</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;createTask(String&nbsp;strProcessName,&nbsp;String&nbsp;strRequisitioner,&nbsp;Map&nbsp;taskVariables,&nbsp;String&nbsp;transition)&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">&quot;Process&nbsp;Info&nbsp;--&gt;&nbsp;Create&nbsp;new&nbsp;Process&nbsp;Start,&nbsp;creator:&nbsp;&quot;</span><span>+&nbsp;strRequisitioner); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//create&nbsp;new&nbsp;process&nbsp;instance </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessDefinition&nbsp;processDefinition&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessInstance&nbsp;processInstance&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processDefinition&nbsp;=&nbsp;graphSession.findLatestProcessDefinition(strProcessName); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processInstance&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProcessInstance(processDefinition); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">catch</span><span>&nbsp;(JbpmException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProcessDefinitionNotFindException( &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;Process&nbsp;definition&nbsp;not&nbsp;find&nbsp;by&nbsp;process&nbsp;name&nbsp;&quot;</span><span>&nbsp;+&nbsp;strProcessName); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//if&nbsp;(processDefinition&nbsp;==&nbsp;null)&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">&quot;Process&nbsp;Info&nbsp;--&gt;&nbsp;New&nbsp;process&nbsp;created,&nbsp;PID:&nbsp;&quot;</span><span>+processInstance.getId()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;actorid&nbsp;and&nbsp;create&nbsp;start&nbsp;task&nbsp;instance </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jbpmContext.setActorId(strRequisitioner); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskInstance&nbsp;=&nbsp;processInstance.getTaskMgmtInstance().createStartTaskInstance(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//taskInstance.start(); </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;add&nbsp;process&nbsp;Variables </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskVariables.put(</span><span class="string">&quot;StartActorId&quot;</span><span>,&nbsp;strRequisitioner); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskInstance.addVariables(taskVariables); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//end&nbsp;&nbsp;save&nbsp;task&nbsp;and&nbsp;close&nbsp;jbpmContext&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskInstance.end(transition); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jbpmContext.save(taskInstance); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//commit(); </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;processInstance.getId(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;这个存了一个variable （StartActorId），用来保存起草人，不知道jbpm有没有直接的API，来获得流程的起草人的。</p>
<div class="code_title">java 代码（返回代办事项）</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;List<task></task>&nbsp;findToDoTask(String&nbsp;strRequisitioner)&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<taskinstance></taskinstance>&nbsp;tasks&nbsp;=&nbsp;taskMgmtSession.findTaskInstances(strRequisitioner); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<taskinstance></taskinstance>&nbsp;pooledTasks&nbsp;=&nbsp;taskMgmtSession.findPooledTaskInstances(strRequisitioner); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tasks.addAll(pooledTasks); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<task></task>&nbsp;resultTaskList&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList<task></task>(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(TaskInstance&nbsp;item&nbsp;:&nbsp;tasks)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessInstance&nbsp;processInstance&nbsp;=&nbsp;item.getTaskMgmtInstance().getProcessInstance(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContextInstance&nbsp;contextInstance&nbsp;=&nbsp;processInstance.getContextInstance(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task&nbsp;task&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Task(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.setTaskId(item.getId()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.setTaskName(item.getName()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.setProcessId(processInstance.getId()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.setWorkflowId(item.getTaskMgmtInstance().getProcessInstance().getProcessDefinition().getName()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.setRequisitionerFK((String)contextInstance.getVariable(</span><span class="string">&quot;StartActorId&quot;</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultTaskList.add(task); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//commit(); </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span class="string">&quot;Process&nbsp;Info&nbsp;--&gt;&nbsp;User&nbsp;(&quot;</span><span>+&nbsp;strRequisitioner&nbsp;+</span><span class="string">&quot;)&nbsp;find&nbsp;tasks,&nbsp;size:&quot;</span><span>+&nbsp;tasks.size()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;resultTaskList; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<div class="code_title">java 代码（结束任务并转移到指定的transition）</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">private</span><span>&nbsp;String&nbsp;taskEnd(</span><span class="keyword">long</span><span>&nbsp;nTaskID,&nbsp;String&nbsp;strRequisitioner,&nbsp;String&nbsp;comment,&nbsp;String&nbsp;transition,&nbsp;Map&nbsp;variables)&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskInstance&nbsp;=&nbsp;loadAndEndTaskInstance(nTaskID,&nbsp;strRequisitioner,&nbsp;transition,&nbsp;variables); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//taskInstance.start(); </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//if&nbsp;(taskInstance.getActorId()&nbsp;==&nbsp;null)&nbsp;taskInstance.setActorId(strRequisitioner); </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//add&nbsp;comment&nbsp;to&nbsp;this&nbsp;task&nbsp;instance </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(comment&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;!comment.equals(</span><span class="string">&quot;&quot;</span><span>))&nbsp;taskInstance.addComment(comment); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;=&nbsp;getAssignLog(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//commit(); </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">catch</span><span>(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkflowException(</span><span class="string">&quot;can't&nbsp;end&nbsp;task&nbsp;id:&nbsp;&quot;</span><span>+nTaskID+&nbsp;</span><span class="string">&quot;(&quot;</span><span>+e.getMessage()+</span><span class="string">&quot;)&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;msg; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>其他就没什么了，大体上就是这样，这个是我这个流程处理类的主要方法。然后在这个基础上做了一次web service的封装。感觉这个封装还是蛮不错的，主要是我老大的意见，哈哈哈。感觉在做简单流程的时候，使用jbpm感觉超级简单，基本上不需要手工写什么东西，拖拖拉拉就弄好了 ，然后给相应的transition命名，这样在task end的时候指定相应的名字，流程也就过去了，非常的简单。在使用会签的时候应该说也是很简单的，哈哈哈。一个字，很爽。当初就看着jbpm 的demo，参考里面的代码，一点一点读懂整理出来了。现在回头看看，好辛苦啊，不过好简单啊。最烦的还是页面，这是我今天完成第一个流程之后的唯一感觉。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/97395#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jul 2007 19:01:01 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/97395</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/97395</guid>
      </item>
      <item>
        <title>终于一个流程整合完成了</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/97394" style="color:red;">http://wuxufeng8080.javaeye.com/blog/97394</a>&nbsp;
          发表时间: 2007年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在经历了2个星期的学习，及两个星期的开发之后，我们公司第一个用jbpm作为流程引擎的工作流完成了。虽然是一个不算很复杂的流程，但是还是折腾了两个多星期，今天刚刚收尾完毕，不过经用户确认之后还要小改一下。</p>
<p>总结的结果就是，流程不是问题，其实最难的是页面，准确来说繁琐，特别是对页面的读写控制，简直让人发疯。</p>
<p>这个项目使用 struts2 + spring2.0 + ibatis，基于通用及跨平台的考虑，jbpm部分我们用web service封装，好像也能称之为SOA，哈哈哈。刚开始的时候本来打算用hibernate的，虽然不熟，但是还是有那么点经验的。而且流程之间的model相对比较独立，不会像ERP那种变态系统那样，关系复杂。但是才开始用就出了很多莫名的问题，自己也不知道怎么解，后来就回到老路上来了（主要是为了赶进度，上头催的紧，我这个leader才刚上任呢）。</p>
<p>万事开头难，还有很多很多问题没有解决，不过在完成第一个之后，下面心里就有底了。java的开发，最麻烦的还是页面的开发，简直整死人不偿命，要是流程再复杂一点，然后配上流程的读写控制，亲娘诶，不活了。</p>
<p>下面的任务就是把原有的代码再整理一下，整出一个比较好的，干净的框架来，这样同伴开发起来也比较简单。也不会看的太乱。现在的代码确实太乱了。</p>
<p>不过一切都会好的。待我整理完之后让大家再帮忙看下我的代码，看看哪里还需要改进的地方，切磋一下，互相增加。</p>
<p>&nbsp;</p>
<p>整理一下开发中遗留的问题</p>
<ol>
    <li>会签人员选择页面要在什么时候出现，这个问题比较头疼，在一个页面内好像不是很好实现，暂时没有主意？</li>
    <li>主从表，主要是没怎么接触，心里没底，好像不是很复杂。</li>
    <li>代理人设置，根据我前面 的理解，应该还好</li>
</ol>
<p>暂时这么几个问题，接着下一个流程都会碰到这几个问题，到时候还请大侠们帮忙啊。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/97394#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jul 2007 18:44:37 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/97394</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/97394</guid>
      </item>
      <item>
        <title>jBPM实际应用中的一些问题及思考</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/92335" style="color:red;">http://wuxufeng8080.javaeye.com/blog/92335</a>&nbsp;
          发表时间: 2007年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、一个node中的task，在创建之后，如果重新回退到这个node，则，不会重新指定actor，就算actor是通过swimlane类动态指定的。也按原来这个task的actor重新创建这个taskInstance。不清楚jBPM是不是系统就是这么设计的。通过自己的测试，感觉是这样样子的。</p>
<p>2、为了能在同一个node，循环创建taskInstance，这里要用动态创建taskInstance方式来创建，并指定actor，这样可以创建出同样的task不同的actor。主要是为了循环利用一个相同的node。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/92335#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Jun 2007 10:29:54 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/92335</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/92335</guid>
      </item>
      <item>
        <title>流程情景应用--用户与代理人之间的任务分派</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/90047" style="color:red;">http://wuxufeng8080.javaeye.com/blog/90047</a>&nbsp;
          发表时间: 2007年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>公司对于代理人在流程中有这样的应用：</p>
<ol>
    <li>当用户设置了代理人之后的任务，用户和代理人都要能看到这个任务； </li>
    <li>当用户设置代理人时，已有的任务需要添加代理人，并通知代理人处理； </li>
    <li>当用户取消代理人设置后，原来代理人未完成的任务，需要重新回到用户的任务中。 </li>
</ol>
<p>经过昨天对ActorId和PooledActors的研究，想出这样一个解决方案，基本上完成了上面所需要的功能。</p>
<p>对于第一个要求，只需要设置TaskInstance的PooledActors这个属性给用户及代理人，这样用户及代理人都能看到这个任务。在代理人或用户确定要处理这个任务后，会进行check out的动作，把这个任务的ActorId设置为自己的id。</p>
<p>第二、寻找此用户的所有未完成的任务，然后设置PooledActors，并把ActorId设置为null，再通过邮件通知代理人有新的 代理任务。</p>
<p>第三、取消的时候，还是遍历所有未完成的任务，再把已经共享出去的任务，重新收回，即设置ActorId为用户ID。但是那些已经被check out的任务，就需要另外处理。</p>
<p>&nbsp;</p>
<p>以上就是在ActorId和PooledActors两个属性的基础上做的一个小小应用。</p>
<p>经过这几天对jBPM的深入研究，对jBPM有了很大的了解。比以前了解的更加深入。在对类结构和表结构做了一次对照分析之后，对各个对象之间的关系，及所存数据表有了深一层的任务。：）</p>
<p>补充：</p>
<p>通过taskInstance.getSwimlaneInstance.setPooledActors()，可以重新设置共享任务的候选参与者。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/90047#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Thu, 14 Jun 2007 09:38:40 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/90047</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/90047</guid>
      </item>
      <item>
        <title>ActorID &amp; PooledActors</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/89873" style="color:red;">http://wuxufeng8080.javaeye.com/blog/89873</a>&nbsp;
          发表时间: 2007年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>jBPM有两种分配任务的模式，推模式和拉模式。</p>
<p>推模式：系统主动分配任务给actorID。推模式只有一个人能参与这个任务。通过actorId指定用户</p>
<p>拉模式：actorId去申请这个任务。拉模式的任务可以是多个人参与的，但是只能有其中的一个人能结束。通过PooledActors指定用户群。</p>
<p>当同时指定了这两个属性的时候，actorId才是真正被指定的参与者。只有这个参与者才能完成这个任务，其他的在PooledActors里面的用户，是无法得到这个任务的，所以也没有办法处理这个任务。</p>
<p><strong>设置用户</strong></p>
<p>推模式：<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Assignable.setActorID(String actorId)</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span></p>
<p>拉模式：<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Assignable.setPooledActors(String[] actorIds)</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span></p>
<p><strong>得到用户任务列表</strong></p>
<p>推模式：<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">TaskMgmtSession.findTaskInstances(String actorId)</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">拉模式：<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">TaskMgmtSesion.findPooledTaskInstances(String actorId)</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp; TaskMgmtSession.findPooledTaskInstances(List actorIds)</span></span></p>
<p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></span></span></p>
<p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">到今天才真正了解了为什么有些人把pooledActors翻译成候选参与者，因为当有真正的参与者的时候，候选参与者是没有权利查看并完成任务的。</span></span></p>
<p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">又或者只设置了pooledActors的那个taskInstance称之为共享任务。只要在pooledActors数组里面的用户都可以查看并完成这个任务。所以防止冲突，需要把执行任务的这个候选参与者升格为参与者，即把这个用户设置到actorID里面，如果需要重新把这个任务作为共享任务，只需要把actorId这个属性设置为null.</span></span></p>
<p><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">以上是今天研究用户权限的一些体会。经过这几天的研究，发现jBPM没有想象中的负责，不过还有很多的地方没有没有搞清楚，继续努力......</span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://wuxufeng8080.javaeye.com/blog/89873#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Wed, 13 Jun 2007 16:58:07 +0800</pubDate>
        <link>http://wuxufeng8080.javaeye.com/blog/89873</link>
        <guid>http://wuxufeng8080.javaeye.com/blog/89873</guid>
      </item>
      <item>
        <title>jBPM流程发布</title>
        <author>wuxufeng8080</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuxufeng8080.javaeye.com">wuxufeng8080</a>&nbsp;
          链接：<a href="http://wuxufeng8080.javaeye.com/blog/82502" style="color:red;">http://wuxufeng8080.javaeye.com/blog/82502</a>&nbsp;
          发表时间: 2007年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近在研究jBPM，碰到了一大堆问题，这个郁闷的了。不过到今天为止，终于小有成果，可喜可贺啊，：）</p>
<p>下面主要讲一下最近碰到的一些问题，疑问以及解决方案</p>
<p>1、流程的测试</p>
<p>刚开始不知道怎么用插件，流程代码都是手写的，结果等我好不容易写完之后发布，发现无法编译这个流程文件，这个郁闷啊。肯定是我哪里写错了。然后去找有没有dtd文件，结果好不容易找到了，但是好像没有起作用，我很奇怪，怎么这么好的东西，会没有dtd文件呢。最后还是决定用插件，因为找到了一篇怎么用插件的文章，原来所有的东西都可以做的，哈哈哈。真是不错。</p>
<p>还有一个比较郁闷的地方就是jBPM的api doc，这个简直就不是doc，里面基本上没有说明文字，晕倒。这就是所谓jboss出品，真想扁他们。结果每次出了问题都要到网上乱搜一汽，运气好还能找到一点有用的东西。以上纯属牢骚。</p>
<p>下面说一下测试。</p>
<p>我是用编程的方式发布我的流程的</p>
<p>代码如下，自己写的一个发布类</p>
<p>&nbsp;</p>
<p>但是这个发布类有一个问题，无法发布jpg文件到数据库，不过似乎在测试阶段也不需要图片。正式发布的时候，可以通过插件直接上传到服务器。</p>
<p><font color="#ff0000">还有一个疑问，user guide 里说Process archives can also be deployed programmatically with the class <tt class="literal">org.jbpm.jpdl.par.ProcessArchiveDeployer</tt> ，但是这个类在3.1.2里面根本没有，不知道怎么回事</font></p>
<p>然后编写unit test ，在单元测试里面，针对每个流程路径进行测试。</p>
<p>2、流程发布</p>
<p>在完成单元测试之后，就可以通过插件直接上传到服务器了，不过事先你的服务器要有上传发布的功能。我的是直接从websale修改过来了。让这个demo跑起来，花了好大的劲。主要是版本问题。最大的一个问题在JbpmContext的创建上面。</p>
<p><font face="Arial">原来的是这个样子：JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();</font></p>
<p>但是这个方法在新