<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>fndcz</title>
    <description></description>
    <link>http://fndcz.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>jBPM学习（八）----liferay4.2.2下的jBPM开发 </title>
        <author>fndcz</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fndcz.javaeye.com">fndcz</a>&nbsp;
          链接：<a href="http://fndcz.javaeye.com/blog/114455" style="color:red;">http://fndcz.javaeye.com/blog/114455</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">八、</span><span style="COLOR: black">liferay4.2.2</span><span style="COLOR: black">下的</span><span style="COLOR: black">jBPM</span><span style="COLOR: black">开发</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">liferay4.2.2</span><span style="COLOR: black">中对</span><span style="COLOR: black">jBPM3.1.2</span><span style="COLOR: black">进行了集成，并且多</span><span style="COLOR: black">jpdl</span><span style="COLOR: black">语言做了扩展，主要表现在对表单数据类型的支持。表现形式为在原有变量表示的基础上为每个变量名加上前缀。下面我们通过一个稍微复杂的例子来具体讲解。</span><span style="COLOR: red">（这里</span><span style="COLOR: red">liferay</span><span style="COLOR: red">在</span><span style="COLOR: red">eclipse</span><span style="COLOR: red">下的工程名为</span><span style="COLOR: red">portal</span><span style="COLOR: red">，扩展工程名为</span><span style="COLOR: red">ext</span><span style="COLOR: red">）</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">数据库的迁移</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">数据库的生成这里不再赘述，请参考前面章节建立数据库。数据库建立之后，修改</span><span style="COLOR: blue">portal\jbpm-web\docroot\WEB-INF\classes\hibernate.cfg.xml</span><span style="COLOR: black">文件，此文件为</span><span style="COLOR: black">liferay</span><span style="COLOR: black">下的</span><span style="COLOR: black">jbpm</span><span style="COLOR: black">数据库配置文件，注释掉</span><span style="FONT-SIZE: 10pt; COLOR: #3f5fbf">&lt;!-- Hypersonic --&gt;</span><span style="FONT-SIZE: 10pt; COLOR: black">下的属性，根据数据库配置</span><span style="FONT-SIZE: 10pt; COLOR: #3f5fbf">&lt;!-- SQL Server --&gt;</span><span style="FONT-SIZE: 10pt; COLOR: black">下属性，我的配置如下：</span></div>
<div align="left">
<div><span style="FONT-SIZE: 10pt; COLOR: teal"></span></div>
<span style="COLOR: black">
<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">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernate.dialect&quot;</span><span class="tag">&gt;</span><span>org.hibernate.dialect.SQLServerDialect</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernate.connection.driver_class&quot;</span><span class="tag">&gt;</span><span>net.sourceforge.jtds.jdbc.Driver</span><span class="tag">&lt;/</span><span class="tag-name">property</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">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernate.connection.url&quot;</span><span class="tag">&gt;</span><span>jdbc:jtds:sqlserver://127.0.0.1:1433;</span><span class="attribute">DatabaseName</span><span>=</span><span class="attribute-value">lportal</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernate.connection.username&quot;</span><span class="tag">&gt;</span><span>liferay</span><span class="tag">&lt;/</span><span class="tag-name">property</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">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernate.connection.password&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
完成后保存文件。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">流程定义</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">在</span><span style="COLOR: blue">portal\jbpm-web\docroot\WEB-INF\definitions</span><span style="COLOR: black">下右键新建一个流程，命名为</span><span style="COLOR: black">MessageSend</span><span style="COLOR: black">。按照下图所示建立基本流程，具体过程参照前面。</span></div>
<div align="center"><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/7c4dd094eb3143b18fc42de3dff6171b.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义泳道</span></div>
<div><span style="COLOR: black">定义一个名为</span><span style="COLOR: black">user</span><span style="COLOR: black">的泳道：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/ab62c41532284e519d50112b0aaa9e72.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义任务</span></div>
<div><span style="COLOR: black">对照下图为各个节点创建任务，并将所有任务赋予泳道</span><span style="COLOR: black">user</span><span style="COLOR: black">。</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/e3afad2aaa9b41f09a68a6dbf72aac68.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">5.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义任务变量</span></div>
<div><span style="COLOR: black">下面分别介绍各个任务中的变量：</span></div>
<div><span style="COLOR: black">任务</span><span style="COLOR: black">comment</span><span style="COLOR: black">：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/1728d9f7e52043bf9aaf5142a038ca44.png" alt="" /></span></div>
<div><span style="COLOR: black">任务</span><span style="COLOR: black">input-name</span><span style="COLOR: black">：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/9ec0046c6ee84383b7dd9b7a1d9576cf.png" alt="" /></span></div>
<div><span style="COLOR: black">任务</span><span style="COLOR: black">input-message-one</span><span style="COLOR: black">：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/1709d4064cd94bd2b73727d4bdb8b5cb.png" alt="" /></span></div>
<div><span style="COLOR: black">任务</span><span style="COLOR: black">input-message-two</span><span style="COLOR: black">：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/1c613f566e264c6ea1b3e21319465e20.png" alt="" /></span></div>
<div><span style="COLOR: black">任务</span><span style="COLOR: black">show-message</span><span style="COLOR: black">：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/a746ff0094754efe9dda98a821d49ee4.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">这里说明一下：</span><span style="COLOR: black">liferay</span><span style="COLOR: black">的</span><span style="COLOR: black">workflow portlet</span><span style="COLOR: black">对</span><span style="COLOR: black">jbpm</span><span style="COLOR: black">的变量定义经行了扩展，可以看到每个变量的名字都由多部分组成其中用冒号分隔，</span><span style="COLOR: black">workflow portlet</span><span style="COLOR: black">会根据变量的前缀自动为该变量生成</span><span style="COLOR: black">html</span><span style="COLOR: black">中的表单。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: red">值得注意的是</span><span style="COLOR: red">jbpm</span><span style="COLOR: red">并不会区分前缀与变量名，而是将这个字符串作为该变量的名字。如：上图中</span><span style="COLOR: red">text:message name</span><span style="COLOR: red">，变量名就为&ldquo;</span><span style="COLOR: red">text:message name</span><span style="COLOR: red">&rdquo;。在程序中对该变量的引用也应使用&ldquo;</span><span style="COLOR: red">text:message name</span><span style="COLOR: red">&rdquo;。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">具体每种数据类型的表示方法如下表：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/77ff05bb7f304bb982eb5e523d714b36.png" alt="" /></span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/a3e00ccea9764be3a46b1a00d5bde0c4.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">6.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义</span><span style="COLOR: black">Handler</span><span style="COLOR: black">及</span><span style="COLOR: black">Action</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">在流程中我们有一个</span><span style="COLOR: black">decision</span><span style="COLOR: black">节点，这里需要自定义一个类来对</span><span style="COLOR: black">decision</span><span style="COLOR: black">逻辑进行处理。首先，我们切换到</span><span style="COLOR: black">source</span><span style="COLOR: black">视图，找到</span><span style="COLOR: black">decision</span><span style="COLOR: black">标签，在标签中添加一个</span><span style="COLOR: black">handler</span><span style="COLOR: black">标签，该标签用来指定处理逻辑的类，具体内容如下：</span></div>
<div align="left">
<div><span style="FONT-SIZE: 10pt; COLOR: teal"></span></div>
<span style="COLOR: black">
<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">decision</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;more&nbsp;message&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">handler</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.liferay.jbpm.handler.MessageSendDecision&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">handler</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;no&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;</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;yes&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;message-name-input&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">decision</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
从上面可以看出定义的类为：</span><span style="FONT-SIZE: 10pt; COLOR: #2a00ff">MessageSendDecision</span><span style="FONT-SIZE: 10pt; COLOR: black">，</span><span style="COLOR: black">此类的主要任务是通过判断用户的选项来决定将令牌具体传递给哪一个</span><span style="COLOR: black">transition</span><span style="COLOR: black">，下面我们实现这个类。</span></div>
<div><span style="COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black">我们在</span><span style="COLOR: black">portal</span><span style="COLOR: black">工程中新建一个</span><span style="COLOR: black">java</span><span style="COLOR: black">文件</span></div>
<div><span style="COLOR: blue">portal\jbpm-web\docroot\WEB-INF\src\com\liferay\jbpm\handler\MessageSendDecision.java</span><span style="COLOR: black">，内容如下：</span></div>
<div>
<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.liferay.jbpm.handler; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.jbpm.context.exe.ContextInstance; &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.node.DecisionHandler; &nbsp;&nbsp;</span></li>
    <li class=""><span>&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;MessageSendDecision&nbsp;</span><span class="keyword">implements</span><span>&nbsp;DecisionHandler&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;decide(ExecutionContext&nbsp;executionContext)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取当前令牌所处的上下文 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ContextInstance&nbsp;instance&nbsp;=&nbsp;executionContext.getContextInstance(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;decision&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;</span><span class="comment">//获取该上下文中的变量radio:more&nbsp;info:yes,no </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;response&nbsp;=&nbsp;(String)&nbsp;instance.getVariable(</span><span class="string">&quot;radio:more&nbsp;info:yes,no&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><span class="comment">//对该变量进行判断 </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><span class="keyword">if</span><span>&nbsp;(response.equalsIgnoreCase(</span><span class="string">&quot;yes&quot;</span><span>)&nbsp;||&nbsp;response.equalsIgnoreCase(</span><span class="string">&quot;no&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;&nbsp;decision&nbsp;=&nbsp;response; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</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;&nbsp;decision&nbsp;=&nbsp;</span><span class="string">&quot;no&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;System.out.println(decision); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//返回decision </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//返回的decision必须与定义的transition名相对应，否则执行默认transition </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;decision; &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>
&nbsp;</div>
<div><span style="COLOR: black">保存该文件，至此该流程的定义结束，我们可以看到</span><span style="COLOR: black">jbpm-web</span><span style="COLOR: black">目录下多了</span><span style="COLOR: black">4</span><span style="COLOR: black">个文件：</span></div>
<div><span style="COLOR: #3366ff"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/63c1414f687248b793ef27fa4f18af7f.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">7.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">部署流程</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">Jboss</span><span style="COLOR: black">提供的</span><span style="COLOR: black">IDE</span><span style="COLOR: black">没有支持在</span><span style="COLOR: black">liferay</span><span style="COLOR: black">下自动部署流程，因此通过</span><span style="COLOR: black">jbpm-web</span><span style="COLOR: black">下的</span><span style="COLOR: black">ant</span><span style="COLOR: black">命令进行部署。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">将</span><span style="COLOR: black">jbpm-web</span><span style="COLOR: black">下的</span><span style="COLOR: black">build.xml</span><span style="COLOR: black">文件拖入</span><span style="COLOR: black">ant</span><span style="COLOR: black">窗口，依次执行命令</span><span style="COLOR: black">compile</span><span style="COLOR: black">编译我们定义的</span><span style="COLOR: black"> java</span><span style="COLOR: black">类。之后执行</span><span style="COLOR: black">deploy</span><span style="COLOR: black">命令，将类和流程的定义部署到</span><span style="COLOR: black">web</span><span style="COLOR: black">应用中。打开</span><span style="COLOR: black">tomcat</span><span style="COLOR: black">下的</span><span style="COLOR: black">webapp/jbpm-web</span><span style="COLOR: black">，就可以找到新添加的相应文件。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">启动</span><span style="COLOR: black">tomcat</span><span style="COLOR: black">，登录</span><span style="COLOR: black">liferay</span><span style="COLOR: black">，添加</span><span style="COLOR: black">workflow portlet</span><span style="COLOR: black">，点击</span><span style="COLOR: black">definition</span><span style="COLOR: black">选项，点击</span><span style="COLOR: black">add</span><span style="COLOR: black">：</span></div>
<div><span style="COLOR: #3366ff"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/08ef4cfeec2949a9b34dd0e376d909be.png" alt="" /></span></div>
<div><span style="COLOR: black">将刚才定义的流程的</span><span style="COLOR: blue">processdenfinition.xml</span><span style="COLOR: black">中的内容全部拷贝到文本框中，点击</span><span style="COLOR: red">save new version</span><span style="COLOR: black">，如下：</span></div>
<div align="center"><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/ac92aa615c7444b7a4baaab66353a2c9.png" alt="" /></span></div>
<div><span style="COLOR: black">提交成功后，可以看到列表中多了一项：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/7093c58187114951a9a49935acd06a71.png" alt="" /></span></div>
<div><span style="COLOR: black">点击</span><span style="COLOR: black">add instance</span><span style="COLOR: black">，为该流程添加一个新实例，对该流程进行验证。</span></div>
          <br/>
          <span style="color:red;">
            <a href="http://fndcz.javaeye.com/blog/114455#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 20 Aug 2007 23:12:29 +0800</pubDate>
        <link>http://fndcz.javaeye.com/blog/114455</link>
        <guid>http://fndcz.javaeye.com/blog/114455</guid>
      </item>
      <item>
        <title>jBPM学习（七）----jBPM相关概念 </title>
        <author>fndcz</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fndcz.javaeye.com">fndcz</a>&nbsp;
          链接：<a href="http://fndcz.javaeye.com/blog/114451" style="color:red;">http://fndcz.javaeye.com/blog/114451</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="COLOR: black">七、</span><span style="COLOR: black">jBPM</span><span style="COLOR: black">相关概念</span></p>
<div style="LAYOUT-GRID:  15.6pt none">
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">JPDL</span><span style="COLOR: black">的流程定义元素</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">第一层：</span><span style="COLOR: black">GraphElement</span></div>
<div style="TEXT-INDENT: 10.5pt"><span style="COLOR: black">这个容易理解</span><span style="COLOR: black">,</span><span style="COLOR: black">因为在画流程定义时</span><span style="COLOR: black">,</span><span style="COLOR: black">每个拖拉的对象都是一个</span><span style="COLOR: black">graph</span><span style="COLOR: black">的元素。</span><span style="COLOR: black">GraphElement</span><span style="COLOR: black">有四个属性：</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(1)processDefine </span><span style="COLOR: black">表示当前元素属于哪个流程定义</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(2)events </span><span style="COLOR: black">表示可以接收哪些</span><span style="COLOR: black">event </span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(3)name </span><span style="COLOR: black">名字</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(4)exceptionHandlers </span><span style="COLOR: black">异常处理类集合</span><span style="COLOR: black">(List)</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">第二层：</span><span style="COLOR: black">node</span><span style="COLOR: black">、</span><span style="COLOR: black">processDefinition</span><span style="COLOR: black">、</span><span style="COLOR: black">Transition</span><span style="COLOR: black">、</span><span style="COLOR: black">Task</span></div>
<div style="TEXT-INDENT: 10.5pt"><span style="COLOR: black">它们都继承自</span><span style="COLOR: black">GraphElement</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(1)processDefinition</span><span style="COLOR: black">表示流程定义</span><span style="COLOR: black">(implements NodeCollection),</span><span style="COLOR: black">它有下面的属性</span><span style="COLOR: black">:name</span><span style="COLOR: black">、</span><span style="COLOR: black">version</span><span style="COLOR: black">、</span><span style="COLOR: black">nodes</span><span style="COLOR: black">、</span><span style="COLOR: black">startState</span><span style="COLOR: black">。</span><span style="COLOR: black">nodes</span><span style="COLOR: black">表示流程中所有的</span><span style="COLOR: black">node</span><span style="COLOR: black">，</span><span style="COLOR: black">startState</span><span style="COLOR: black">用于启动流程时找到首节点。</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(2)Transition</span><span style="COLOR: black">表示转移，它有三个属性：</span><span style="COLOR: black">from(Node)</span><span style="COLOR: black">，</span><span style="COLOR: black">to(Node)</span><span style="COLOR: black">，</span><span style="COLOR: black">supportedEventTypes</span><span style="COLOR: black">表示支持的</span><span style="COLOR: black">event</span><span style="COLOR: black">类型</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(3)node</span><span style="COLOR: black">表示节点，它有四个属性：</span><span style="COLOR: black">leaving transitions</span><span style="COLOR: black">、</span><span style="COLOR: black">arriving transitions</span><span style="COLOR: black">、</span><span style="COLOR: black">action</span><span style="COLOR: black">、</span><span style="COLOR: black">superState</span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">(4)Task </span><span style="COLOR: black">定义任务</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">第三层：各种不同的</span><span style="COLOR: black">node</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">它们都继承自</span><span style="COLOR: black">node</span><span style="COLOR: black">。</span><span style="COLOR: black"> Decision</span><span style="COLOR: black">、</span><span style="COLOR: black">EndState</span><span style="COLOR: black">、</span><span style="COLOR: black">Fork</span><span style="COLOR: black">、</span><span style="COLOR: black">Join</span><span style="COLOR: black">、</span><span style="COLOR: black">Merge</span><span style="COLOR: black">、</span><span style="COLOR: black">Milestone</span><span style="COLOR: black">、</span><span style="COLOR: black"> InterleaveEnd</span><span style="COLOR: black">、</span><span style="COLOR: black">InterleaveStart</span><span style="COLOR: black">、</span><span style="COLOR: black">ProcessState</span><span style="COLOR: black">、</span><span style="COLOR: black">State</span><span style="COLOR: black">。</span></div>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">jBPM</span><span style="COLOR: black">的</span><span style="COLOR: black">token</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">jbpm</span><span style="COLOR: black">中最重要的概念，应该是令牌</span><span style="COLOR: black">(Token)</span><span style="COLOR: black">和信令</span><span style="COLOR: black">(Signal)</span><span style="COLOR: black">。在整个流程实例运行过程中，我们可以迅速的利用</span><span style="COLOR: black">token</span><span style="COLOR: black">得到其当前的</span><span style="COLOR: black">current state</span><span style="COLOR: black">。在解决&ldquo;并行&rdquo;等（比如</span><span style="COLOR: black">Fork</span><span style="COLOR: black">）问题时，</span><span style="COLOR: black">jBpm</span><span style="COLOR: black">让</span><span style="COLOR: black">Token</span><span style="COLOR: black">对象维护了父子关系，这种关系在涉及到</span><span style="COLOR: black">Fork</span><span style="COLOR: black">的时候会产生。</span><span style="COLOR: black"> jBpm</span><span style="COLOR: black">让</span><span style="COLOR: black">Token</span><span style="COLOR: black">这个对象身兼了多种使命：</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">（</span><span style="COLOR: black">1</span><span style="COLOR: black">）快速定位</span><span style="COLOR: black">current state </span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">（</span><span style="COLOR: black">2</span><span style="COLOR: black">）用于</span><span style="COLOR: black">fork</span><span style="COLOR: black">，</span><span style="COLOR: black">join</span><span style="COLOR: black">算法</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">（</span><span style="COLOR: black">3</span><span style="COLOR: black">）用于告知任务执行者的任务索引。</span></div>
<div><span style="COLOR: black">如下代码</span><span style="COLOR: black">: <br />
</span><span style="COLOR: #339966">//pd</span><span style="COLOR: #339966">是</span><span style="COLOR: #339966">process definition,pi</span><span style="COLOR: #339966">是</span><span style="COLOR: #339966">process instance ProcessInstance <br />
pi = new ProcessInstance( pd ); <br />
//</span><span style="COLOR: #339966">得到根令牌</span><span style="COLOR: #339966"> <br />
Token token = pi.getRootToken(); <br />
//</span><span style="COLOR: #339966">发信令</span><span style="COLOR: #339966"> <br />
token.signal(); <br />
</span><span style="COLOR: black">Token</span><span style="COLOR: black">的</span><span style="COLOR: black">signal</span><span style="COLOR: black">方法也可以传入</span><span style="COLOR: black">transition</span><span style="COLOR: black">参数</span><span style="COLOR: black">,</span><span style="COLOR: black">这个方法把信令发送给</span><span style="COLOR: black">Token,</span><span style="COLOR: black">这样</span><span style="COLOR: black">,</span><span style="COLOR: black">令牌将被激活</span><span style="COLOR: black">,</span><span style="COLOR: black">并沿指定的</span><span style="COLOR: black">transition</span><span style="COLOR: black">离开当前的状态</span><span style="COLOR: black">(</span><span style="COLOR: black">如果没有指定</span><span style="COLOR: black">transition,</span><span style="COLOR: black">将沿缺省的</span><span style="COLOR: black">transition </span><span style="COLOR: black">离开当前状态</span><span style="COLOR: black">)</span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 10.5pt"><span style="COLOR: black">jbpm</span><span style="COLOR: black">是怎么实现的呢</span><span style="COLOR: black">?</span><span style="COLOR: black">其实很简单</span><span style="COLOR: black">: <br />
1)Token</span><span style="COLOR: black">记录了当前的状态（</span><span style="COLOR: black">current state</span><span style="COLOR: black">）</span><span style="COLOR: black">,</span><span style="COLOR: black">只有当前的状态</span><span style="COLOR: black">(</span><span style="COLOR: black">或称节点</span><span style="COLOR: black">)</span><span style="COLOR: black">拥有该令牌</span><span style="COLOR: black"> <br />
2)</span><span style="COLOR: black">向</span><span style="COLOR: black">TOKEN</span><span style="COLOR: black">发</span><span style="COLOR: black">signal</span><span style="COLOR: black">后</span><span style="COLOR: black">,</span><span style="COLOR: black">当前状态收到该</span><span style="COLOR: black">signal <br />
3)</span><span style="COLOR: black">当前状态把令牌传给</span><span style="COLOR: black">signal</span><span style="COLOR: black">中指定的</span><span style="COLOR: black">transition <br />
4)transition</span><span style="COLOR: black">收到令牌后</span><span style="COLOR: black">,</span><span style="COLOR: black">不强占</span><span style="COLOR: black">,</span><span style="COLOR: black">马上把令牌传给下个状态</span><span style="COLOR: black">. <br />
5)</span><span style="COLOR: black">根据令牌的位置</span><span style="COLOR: black">,</span><span style="COLOR: black">流程的状态已经发生改变</span><span style="COLOR: black">.</span></div>
<div style="MARGIN-LEFT: 10.5pt">&nbsp;</div>
<div style="MARGIN-LEFT: 10.5pt">&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">process definition </span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个</span><span style="COLOR: black">process definition</span><span style="COLOR: black">代表了一个正式的业务流程，它以一个流程图为基础。这个流程图由</span><span style="COLOR: black">许多</span><span style="COLOR: black">node</span><span style="COLOR: black">和</span><span style="COLOR: black">transition</span><span style="COLOR: black">组成。每个</span><span style="COLOR: black">node</span><span style="COLOR: black">在这个流程图里都有着各自特殊的类型，这些不同的类型决定了</span><span style="COLOR: black">node</span><span style="COLOR: black">在运行时的不同行为。一个</span><span style="COLOR: black">process definition</span><span style="COLOR: black">只有一个</span><span style="COLOR: black">start state </span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">token </span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个</span><span style="COLOR: black">token</span><span style="COLOR: black">代表了一条执行路径，它包含了这条执行路径的当前的执行状态（</span><span style="COLOR: black">current state</span><span style="COLOR: black">）。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">5.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">process instance </span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个</span><span style="COLOR: black">process instance</span><span style="COLOR: black">（流程实例）即一个</span><span style="COLOR: black">process definition</span><span style="COLOR: black">（流程定义）的流程执行实例。一个</span><span style="COLOR: black">process definition</span><span style="COLOR: black">可以对应多个</span><span style="COLOR: black">process instance</span><span style="COLOR: black">。当一个</span><span style="COLOR: black">process instance</span><span style="COLOR: black">被创建的时候，一个主执行路径</span><span style="COLOR: black">token</span><span style="COLOR: black">同时被创建，这个</span><span style="COLOR: black">token</span><span style="COLOR: black">叫做</span><span style="COLOR: black">root token</span><span style="COLOR: black">，它指向流程定义的</span><span style="COLOR: black">start state</span><span style="COLOR: black">（</span><span style="COLOR: black">processDefinition.getStartState()==token.getNode()</span><span style="COLOR: black">）。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">6.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">signal </span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个</span><span style="COLOR: black">signal </span><span style="COLOR: black">发送给</span><span style="COLOR: black">token</span><span style="COLOR: black">通知</span><span style="COLOR: black">token </span><span style="COLOR: black">继续流程的执行。如果</span><span style="COLOR: black">signal </span><span style="COLOR: black">没有指定</span><span style="COLOR: black">transition</span><span style="COLOR: black">，</span><span style="COLOR: black">token</span><span style="COLOR: black">将沿缺省的</span><span style="COLOR: black">transition</span><span style="COLOR: black">离开当前状态</span><span style="COLOR: black">,</span><span style="COLOR: black">如果</span><span style="COLOR: black">signal </span><span style="COLOR: black">指定</span><span style="COLOR: black">transition</span><span style="COLOR: black">，</span><span style="COLOR: black">token</span><span style="COLOR: black">将沿指定的</span><span style="COLOR: black">transition</span><span style="COLOR: black">离开当前的状态。看源代码可以看到发给</span><span style="COLOR: black">process instance</span><span style="COLOR: black">的</span><span style="COLOR: black">signal </span><span style="COLOR: black">其实都是发送给了</span><span style="COLOR: black">root token</span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">7.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">Actions </span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">jbpm</span><span style="COLOR: black">提供了灵活的</span><span style="COLOR: black">action </span><span style="COLOR: black">，当流程执行，</span><span style="COLOR: black">token </span><span style="COLOR: black">进入</span><span style="COLOR: black">node</span><span style="COLOR: black">和</span><span style="COLOR: black">transition</span><span style="COLOR: black">时，会触发相应的一些</span><span style="COLOR: black">event</span><span style="COLOR: black">（事件）。在这些</span><span style="COLOR: black">event</span><span style="COLOR: black">上附上我们自己写的</span><span style="COLOR: black">action</span><span style="COLOR: black">，就会带动</span><span style="COLOR: black">action </span><span style="COLOR: black">的执行。</span><span style="COLOR: black">action</span><span style="COLOR: black">里是我们自己的相关</span><span style="COLOR: black">java</span><span style="COLOR: black">操作代码，非常方便。注意的是</span><span style="COLOR: black">event</span><span style="COLOR: black">（事件）是内置的，无法扩展。另外，</span><span style="COLOR: black">action</span><span style="COLOR: black">也可以直接挂在</span><span style="COLOR: black">node</span><span style="COLOR: black">上，而不依赖于</span><span style="COLOR: black">event</span><span style="COLOR: black">（事件）的触发，这个很重要。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">8.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">node</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个流程图由许多</span><span style="COLOR: black">node</span><span style="COLOR: black">和</span><span style="COLOR: black">transition</span><span style="COLOR: black">组成。每个</span><span style="COLOR: black">node</span><span style="COLOR: black">都有一种类型，这个类型决定了当流程执行到这个</span><span style="COLOR: black">node</span><span style="COLOR: black">时的不同行为。</span><span style="COLOR: black">jbpm</span><span style="COLOR: black">有一组</span><span style="COLOR: black">node type</span><span style="COLOR: black">可以供你选择，当然你可以定制自己</span><span style="COLOR: black">node </span><span style="COLOR: black">。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">node</span><span style="COLOR: black">的作用</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">node</span><span style="COLOR: black">有两个主要的作用：</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">1</span><span style="COLOR: black">）执行</span><span style="COLOR: black">java</span><span style="COLOR: black">代码，比如说创建</span><span style="COLOR: black">task instance</span><span style="COLOR: black">（任务实例）、发出通知、更新数据库等等。很典型的就是在</span><span style="COLOR: black">node </span><span style="COLOR: black">上挂上我们的</span><span style="COLOR: black">action</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">2) </span><span style="COLOR: black">控制流程的执行：</span></div>
<div style="MARGIN-LEFT: 10.5pt; TEXT-INDENT: 21pt"><span style="COLOR: black">A</span><span style="COLOR: black">、等待状态：流程进入到这个</span><span style="COLOR: black">node</span><span style="COLOR: black">时将处于等待状态，直到一个</span><span style="COLOR: black">signal </span><span style="COLOR: black">的发出</span></div>
<div style="MARGIN-LEFT: 10.5pt; TEXT-INDENT: 21pt"><span style="COLOR: black">B</span><span style="COLOR: black">、流程将沿着一个</span><span style="COLOR: black">leaving transition</span><span style="COLOR: black">越过这个</span><span style="COLOR: black">node</span><span style="COLOR: black">，这种情况特殊一点，需要有个</span><span style="COLOR: black">action</span><span style="COLOR: black">挂在这个</span><span style="COLOR: black">node</span><span style="COLOR: black">上（注意这个</span><span style="COLOR: black">action</span><span style="COLOR: black">不是</span><span style="COLOR: black">event</span><span style="COLOR: black">触发的！），</span><span style="COLOR: black">action</span><span style="COLOR: black">中将会调用到</span><span style="COLOR: black">API</span><span style="COLOR: black">里</span><span style="COLOR: black"> executionContext.leaveNode(String transitionName)</span><span style="COLOR: black">，</span><span style="COLOR: black">transitionName</span><span style="COLOR: black">即这里的</span><span style="COLOR: black">leaving transition</span><span style="COLOR: black">名字。</span></div>
<div style="MARGIN-LEFT: 10.5pt; TEXT-INDENT: 21pt"><span style="COLOR: black">C</span><span style="COLOR: black">、创建新的执行路径：</span></div>
<div style="MARGIN-LEFT: 10.5pt; TEXT-INDENT: 21pt"><span style="COLOR: black">很典型的就是</span><span style="COLOR: black">fork node</span><span style="COLOR: black">。流程在这里会分叉，产生新的执行路径。这样就创建了新的</span><span style="COLOR: black">token</span><span style="COLOR: black">，每个新的</span><span style="COLOR: black">token</span><span style="COLOR: black">代表一个新的执行路径。注意的是，这些新的</span><span style="COLOR: black">token</span><span style="COLOR: black">和产生前的</span><span style="COLOR: black">token</span><span style="COLOR: black">是父子关系！</span></div>
<div style="MARGIN-LEFT: 10.5pt; TEXT-INDENT: 21pt"><span style="COLOR: black">D</span><span style="COLOR: black">、结束执行路径：一个</span><span style="COLOR: black">node</span><span style="COLOR: black">可以结束一条执行路径，这同样意味着相应的</span><span style="COLOR: black">token</span><span style="COLOR: black">的结束和流程的结束。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">9.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">流程图中的</span><span style="COLOR: black">node type</span></div>
<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><span style="COLOR: black">1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">task-node </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="COLOR: black">一个</span><span style="COLOR: black">task-node</span><span style="COLOR: black">可以包含一个或多个</span><span style="COLOR: black">task</span><span style="COLOR: black">，这些</span><span style="COLOR: black">task</span><span style="COLOR: black">分配给特定的</span><span style="COLOR: black">user</span><span style="COLOR: black">。当流程执行到</span><span style="COLOR: black">task-node</span><span style="COLOR: black">时，</span><span style="COLOR: black">task instance</span><span style="COLOR: black">将会被创建，一个</span><span style="COLOR: black">task</span><span style="COLOR: black">对应一个</span><span style="COLOR: black">task instance</span><span style="COLOR: black">。</span><span style="COLOR: black">task instances </span><span style="COLOR: black">创建后，</span><span style="COLOR: black">task-node</span><span style="COLOR: black">就处于等待状态。当所有的</span><span style="COLOR: black">task instances</span><span style="COLOR: black">被特定的</span><span style="COLOR: black">user</span><span style="COLOR: black">执行完毕后，将会发出一个新的</span><span style="COLOR: black">signal </span><span style="COLOR: black">到</span><span style="COLOR: black">token</span><span style="COLOR: black">，即流程继续执行。</span></div>
<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><span style="COLOR: black">2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">state </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="COLOR: black">state</span><span style="COLOR: black">是一个纯粹的</span><span style="COLOR: black">wait state(</span><span style="COLOR: black">等待状态）。它和</span><span style="COLOR: black">task-node</span><span style="COLOR: black">的区别就是它不会创建</span><span style="COLOR: black">task instances</span><span style="COLOR: black">。很典型的用法是，当进入这个节点时（通过绑定一个</span><span style="COLOR: black">action</span><span style="COLOR: black">到</span><span style="COLOR: black">node-enter event</span><span style="COLOR: black">），发送一条消息到外部的系统，然后流程就处于等待状态。外部系统完成一些操作后返回一条消息，这个消息触发一个</span><span style="COLOR: black">signal </span><span style="COLOR: black">到</span><span style="COLOR: black">token</span><span style="COLOR: black">，然后流程继续执行。（不常用）</span></div>
<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><span style="COLOR: black">3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">decision </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="COLOR: black">当需要在流程中根据不同条件来判断执行不同路径时，就可以用</span><span style="COLOR: black">decision</span><span style="COLOR: black">节点。两种方法：最简单的是在</span><span style="COLOR: black">transitions</span><span style="COLOR: black">里增加</span><span style="COLOR: black">condition elements</span><span style="COLOR: black">（条件），</span><span style="COLOR: black">condition</span><span style="COLOR: black">是</span><span style="COLOR: black">beanshell script</span><span style="COLOR: black">写的，它返回一个</span><span style="COLOR: black">boolean</span><span style="COLOR: black">。当运行的时候，</span><span style="COLOR: black">decision</span><span style="COLOR: black">节点将会在它的</span><span style="COLOR: black"> leaving transitions</span><span style="COLOR: black">里循环，同时比较</span><span style="COLOR: black"> leaving transitions</span><span style="COLOR: black">里的</span><span style="COLOR: black">condition</span><span style="COLOR: black">，最先返回</span><span style="COLOR: black">'true'</span><span style="COLOR: black">的</span><span style="COLOR: black">condition</span><span style="COLOR: black">，那个</span><span style="COLOR: black">leaving transitions</span><span style="COLOR: black">将会被执行；作为选择，你可以实现</span><span style="COLOR: black">DecisionHandler</span><span style="COLOR: black">接口，它有一个</span><span style="COLOR: black">decide()</span><span style="COLOR: black">方法，该方法返回一个</span><span style="COLOR: black">String(leaving transition</span><span style="COLOR: black">的名字）。</span></div>
<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><span style="COLOR: black">4)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">fork </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="COLOR: black">fork</span><span style="COLOR: black">节点把一条执行路径分离成多条同时进行（并发）的执行路径，每条离开</span><span style="COLOR: black">fork</span><span style="COLOR: black">节点的路径产生一个子</span><span style="COLOR: black">token</span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><span style="COLOR: black">5)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">join </span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="COLOR: black">默认情况下，</span><span style="COLOR: black">join</span><span style="COLOR: black">节点会认为所有到达该节点的</span><span style="COLOR: black">token</span><span style="COLOR: black">都有着相同的父</span><span style="COLOR: black">token</span><span style="COLOR: black">。</span><span style="COLOR: black">join </span><span style="COLOR: black">节点会结束每一个到达该节点的</span><span style="COLOR: black">token,</span><span style="COLOR: black">当所有的子</span><span style="COLOR: black">token</span><span style="COLOR: black">都到达该节点后，父</span><span style="COLOR: black">token</span><span style="COLOR: black">会激活。当仍然有子</span><span style="COLOR: black">token</span><span style="COLOR: black">处于活动状态时，</span><span style="COLOR: black">join </span><span style="COLOR: black">节点是</span><span style="COLOR: black">wait state(</span><span style="COLOR: black">等待状态）。</span></div>
<div style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><span style="COLOR: black">6)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">node</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><span style="COLOR: black">node</span><span style="COLOR: black">节点就是让你挂自己的</span><span style="COLOR: black">action</span><span style="COLOR: black">用的（注意：不是</span><span style="COLOR: black">event</span><span style="COLOR: black">触发！），当流程到达该节点时，</span><span style="COLOR: black">action</span><span style="COLOR: black">会被执行。你的</span><span style="COLOR: black">action</span><span style="COLOR: black">要实现</span><span style="COLOR: black">ActionHandler</span><span style="COLOR: black">接口。同样，在你的</span><span style="COLOR: black">action</span><span style="COLOR: black">里要控制流程。</span></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">10.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">Actions</span><span style="COLOR: black">的说明</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">存在两种</span><span style="COLOR: black">action</span><span style="COLOR: black">，一种是</span><span style="COLOR: black"> event</span><span style="COLOR: black">触发的</span><span style="COLOR: black">action</span><span style="COLOR: black">，一种是挂在</span><span style="COLOR: black">node </span><span style="COLOR: black">节点的</span><span style="COLOR: black">action</span><span style="COLOR: black">。要注意它们的区别，</span><span style="COLOR: black">event</span><span style="COLOR: black">触发的</span><span style="COLOR: black">action</span><span style="COLOR: black">无法控制流程，也就是说它无法决定流程经过这个节点后下一步将到哪一个</span><span style="COLOR: black">leaving transition</span><span style="COLOR: black">；而挂在</span><span style="COLOR: black">node </span><span style="COLOR: black">节点的</span><span style="COLOR: black">action</span><span style="COLOR: black">就不同，它可以控制流程。不管是哪一种</span><span style="COLOR: black">action</span><span style="COLOR: black">都要实现</span><span style="COLOR: black">ActionHandler</span><span style="COLOR: black">接口。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">11.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">Task</span><span style="COLOR: black">（任务）</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">jbpm</span><span style="COLOR: black">一个相当重要的功能就是对任务进行管理。</span><span style="COLOR: black">Task</span><span style="COLOR: black">（任务）是流程定义里的一部分，它决定了</span><span style="COLOR: black">task instance</span><span style="COLOR: black">的创建和分配。</span><span style="COLOR: black">Task</span><span style="COLOR: black">（任务）可以在</span><span style="COLOR: black">task-node</span><span style="COLOR: black">节点下定义，也可以挂在</span><span style="COLOR: black">process-definition</span><span style="COLOR: black">节点下。最普遍的方式是在</span><span style="COLOR: black">task-node</span><span style="COLOR: black">节点下定义一个或多个任务。默认情况下，流程在</span><span style="COLOR: black">task-node</span><span style="COLOR: black">节点会处于等待状态，直到所有的任务被执行完毕。任务的名称在整个流程中必须是唯一的。一个</span><span style="COLOR: black">TaskNode</span><span style="COLOR: black">对应多个</span><span style="COLOR: black">Task</span><span style="COLOR: black">。</span></div>
<div><span style="COLOR: black">对于这样的流程定义：</span><span style="COLOR: #339966"> <br />
<task-node name="a"></task-node>
<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">'a'</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></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">'laundry'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></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">'dishes'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></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">'change&nbsp;nappy'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">'b'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</span><span style="COLOR: black">只有当节点中的三个任务都完成后，流程才进入后面的节点</span><span style="COLOR: black"> <br />
<br />
</span><span style="COLOR: black">对于这样的流程定义：</span><span style="COLOR: #339966">
<div class="code_title">xml 代码</div>
<transition to="b">
</transition>
<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">'a'</span><span>&nbsp;</span><span class="attribute">signal</span><span>=</span><span class="attribute-value">'first'</span><span class="tag">&gt;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></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">'laundry'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></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">'dishes'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></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">'change&nbsp;nappy'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">'b'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</span><span style="COLOR: black">当第一个任务完成后，</span><span style="COLOR: black">token</span><span style="COLOR: black">就指向后面的节点</span><span style="COLOR: black"> <br />
<br />
</span><span style="COLOR: black">对于这样的流程定义：</span><span style="COLOR: #339966"><br />
<task-node name="a" signal="never"></task-node>
<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">'a'</span><span>&nbsp;</span><span class="attribute">signal</span><span>=</span><span class="attribute-value">'never'</span><span class="tag">&gt;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></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">'laundry'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></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">'dishes'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></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">'change&nbsp;nappy'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">'b'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</span><span style="COLOR: black">三个任务都完成后，</span><span style="COLOR: black">token</span><span style="COLOR: black">仍然不会指向后面的节点；需要自己手动调用</span><span style="COLOR: black">processInstance.signal()</span><span style="COLOR: black">才会驱动流程到下面的节点</span><span style="COLOR: #339966">。</span></div>
<div><span style="COLOR: #339966"><br />
</span><span style="COLOR: black">对于这样的流程定义：</span><span style="COLOR: black"> <br />
</span><span style="COLOR: #339966"><task-node name="a" signal="unsynchronized"></task-node>
<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">'a'</span><span>&nbsp;</span><span class="attribute">signal</span><span>=</span><span class="attribute-value">'unsynchronized'</span><span class="tag">&gt;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></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">'laundry'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></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">'dishes'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></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">'change&nbsp;nappy'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">transition</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">'b'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">task-node</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</span><span style="COLOR: black">token</span><span style="COLOR: black">不会在本节点停留，而是直接到后面的节点</span></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">12.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">jbpm</span><span style="COLOR: black">的任务管理实现</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个</span><span style="COLOR: black">Task instance</span><span style="COLOR: black">（任务实例）可以被分配给一个</span><span style="COLOR: black">actorId (java.lang.String)</span><span style="COLOR: black">。所有的</span><span style="COLOR: black">Task instance</span><span style="COLOR: black">都被保存在数据库中的表</span><span style="COLOR: black">jbpm_taskinstance</span><span style="COLOR: black">里。当你想得到特定用户的任务清单时，你就可以通过一个与用户关联的</span><span style="COLOR: black">actorId</span><span style="COLOR: black">来查询这张表。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个流程定义有一个</span><span style="COLOR: black">TaskMgmtDefinition</span><span style="COLOR: black">；一个</span><span style="COLOR: black">TaskMgmtDefinition</span><span style="COLOR: black">对应多个</span><span style="COLOR: black">swimlane,</span><span style="COLOR: black">同时对应多个</span><span style="COLOR: black">task;</span><span style="COLOR: black">一个</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">有多个</span><span style="COLOR: black">task,</span><span style="COLOR: black">可以从</span><span style="COLOR: black">TaskMgmtDefinition</span><span style="COLOR: black">中通过</span><span style="COLOR: black">task</span><span style="COLOR: black">的名称直接获取相应的</span><span style="COLOR: black">task;</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">swimlane</span><span style="COLOR: black">对象有四个属性，分别是</span><span style="COLOR: black">name</span><span style="COLOR: black">（名字）、</span><span style="COLOR: black">assignmentDelegation</span><span style="COLOR: black">（分配代理类）、</span><span style="COLOR: black">taskMgmtDefinition</span><span style="COLOR: black">、</span><span style="COLOR: black">tasks</span><span style="COLOR: black">（</span><span style="COLOR: black">Set </span><span style="COLOR: black">对应多个</span><span style="COLOR: black">task),</span><span style="COLOR: black">可以增加</span><span style="COLOR: black">task</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">task</span><span style="COLOR: black">对象主要的属性：</span><span style="COLOR: black">taskMgmtDefinition</span><span style="COLOR: black">、</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">、</span><span style="COLOR: black">assignmentDelegation</span><span style="COLOR: black">、</span><span style="COLOR: black">taskNode</span><span style="COLOR: black">，需要注意的是</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">和</span><span style="COLOR: black">assignmentDelegation</span><span style="COLOR: black">中间只是可以一个属性有值，因为它们都和任务的分配有关系。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个流程实例有一个</span><span style="COLOR: black">TaskMgmtInstance</span><span style="COLOR: black">；一个</span><span style="COLOR: black">TaskMgmtInstance</span><span style="COLOR: black">对应多个</span><span style="COLOR: black">swimlaneInstance,</span><span style="COLOR: black">同时对应多个</span><span style="COLOR: black">taskInstance;</span><span style="COLOR: black">一个</span><span style="COLOR: black">swimlaneInstance</span><span style="COLOR: black">有多个</span><span style="COLOR: black">taskInstance,</span><span style="COLOR: black">可以从</span><span style="COLOR: black">TaskMgmtInstance</span><span style="COLOR: black">中直接获取相应的</span><span style="COLOR: black">taskInstance;</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">swimlaneInstance</span><span style="COLOR: black">对象主要有五个属性，分别是</span><span style="COLOR: black">name</span><span style="COLOR: black">、</span><span style="COLOR: black">actorId</span><span style="COLOR: black">、</span><span style="COLOR: black">pooledActors</span><span style="COLOR: black">（</span><span style="COLOR: black">Set</span><span style="COLOR: black">）、</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">、</span><span style="COLOR: black">taskMgmtInstance</span><span style="COLOR: black">。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">taskInstance</span><span style="COLOR: black">对象的主要属性：</span><span style="COLOR: black">name</span><span style="COLOR: black">、</span><span style="COLOR: black">actorId</span><span style="COLOR: black">、</span><span style="COLOR: black">task</span><span style="COLOR: black">、</span><span style="COLOR: black">swimlaneInstance</span><span style="COLOR: black">、</span><span style="COLOR: black">taskMgmtInstance</span><span style="COLOR: black">、</span><span style="COLOR: black">pooledActors</span><span style="COLOR: black">。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">当对任务进行分配时，一般需要实现</span><span style="COLOR: black">AssignmentHandler</span><span style="COLOR: black">这个接口，这个接口的方法只有一个：</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">一个典型的实现（把名字是</span><span style="COLOR: black">'change nappy'</span><span style="COLOR: black">的任务交给</span><span style="COLOR: black">NappyAssignmentHandler</span><span style="COLOR: black">这个类来分配）</span></div>
<div><span style="COLOR: green">
<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>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">'change&nbsp;nappy'</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></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">'org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler'</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">task</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span> </span><span style="COLOR: black">NappyAssignmentHandler</span><span style="COLOR: black">类：</span><span style="COLOR: black"><br />
    </span><span style="COLOR: black">
    <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">void</span><span>&nbsp;assign(Assignable&nbsp;assignable,&nbsp;ExecutionContext&nbsp;executionContext)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span> </li>
        <li class=""><span>assignable.setActorId(</span><span class="string">&quot;papa&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
        <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    </ol>
    </div>
    同样，</span><span style="COLOR: black">Assignable</span><span style="COLOR: black">只是一个接口，它有两个方法：</span><span style="COLOR: black">setActorId()</span><span style="COLOR: black">和</span><span style="COLOR: black">setPooledActors()</span><span style="COLOR: black">，</span><span style="COLOR: black">Assignable</span><span style="COLOR: black">的具体实现类也是两个：</span><span style="COLOR: black">swimlaneInstancehe</span><span style="COLOR: black">和</span><span style="COLOR: black">taskInstance</span><span style="COLOR: black">。这样就不不难理解整个任务分配流程了：</span></li>
</ol>
</div>
<br />
</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">1</span><span style="COLOR: black">、流程进入</span><span style="COLOR: black">TaskNode</span><span style="COLOR: black">节点，执行</span><span style="COLOR: black">TaskNode</span><span style="COLOR: black">类的</span><span style="COLOR: black">execute()</span><span style="COLOR: black">方法，该方法首先获得</span><span style="COLOR: black">TaskMgmtInstance</span><span style="COLOR: black">实例，然后通过它来创建</span><span style="COLOR: black">TaskInstance</span><span style="COLOR: black">。</span><span style="COLOR: black">taskMgmtInstance.createTaskInstance(task, executionContext);</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">2</span><span style="COLOR: black">、在上面的</span><span style="COLOR: black">createTaskInstance(task, executionContext)</span><span style="COLOR: black">里，该方法调用了</span><span style="COLOR: black">taskInstance.assign(executionContext)</span><span style="COLOR: black">对</span><span style="COLOR: black">taskInstance</span><span style="COLOR: black">进行分配。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">3</span><span style="COLOR: black">、在</span><span style="COLOR: black">assign(executionContext)</span><span style="COLOR: black">方法里，首先会判断</span><span style="COLOR: black">task</span><span style="COLOR: black">属性里是否存在</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">，如果有的话，这个</span><span style="COLOR: black">taskInstance</span><span style="COLOR: black">就会分配给</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">指定的</span><span style="COLOR: black">ActorId</span><span style="COLOR: black">或</span><span style="COLOR: black"> PooledActors</span><span style="COLOR: black">；如果不存在，再去找</span><span style="COLOR: black">task</span><span style="COLOR: black">属性里</span><span style="COLOR: black"> assignmentDelegation</span><span style="COLOR: black">（分配代理类）通过代理类（即我们自己写的实现</span><span style="COLOR: black">AssignmentHandler</span><span style="COLOR: black">这个接口的类）指定</span><span style="COLOR: black">ActorId</span><span style="COLOR: black">或</span><span style="COLOR: black"> PooledActors</span><span style="COLOR: black">。</span></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">13.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">jbpm</span><span style="COLOR: black">的用户角色管理</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">jbpm</span><span style="COLOR: black">在用户角色管理上共设计了四个类：</span><span style="COLOR: black">Entity</span><span style="COLOR: black">、</span><span style="COLOR: black">Membership</span><span style="COLOR: black">、</span><span style="COLOR: black">Group</span><span style="COLOR: black">、</span><span style="COLOR: black">User</span><span style="COLOR: black">。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">Entity</span><span style="COLOR: black">类是其他三个类的父类，它包含了两个属性：</span><span style="COLOR: black">name(String)</span><span style="COLOR: black">、</span><span style="COLOR: black">permissions(Set)</span><span style="COLOR: black">；</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">User</span><span style="COLOR: black">类继承</span><span style="COLOR: black">Entity</span><span style="COLOR: black">类，包含三个属性：</span><span style="COLOR: black">password(String)</span><span style="COLOR: black">、</span><span style="COLOR: black">email(String)</span><span style="COLOR: black">、</span><span style="COLOR: black">memberships(Set)</span><span style="COLOR: black">；</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">Group</span><span style="COLOR: black">类继承</span><span style="COLOR: black">Entity</span><span style="COLOR: black">类，包含四个属性</span><span style="COLOR: black">: type(String)</span><span style="COLOR: black">、</span><span style="COLOR: black">parent(Group)</span><span style="COLOR: black">、</span><span style="COLOR: black">children(Set)</span><span style="COLOR: black">、</span><span style="COLOR: black">memberships(Set)</span><span style="COLOR: black">；</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">Membership</span><span style="COLOR: black">类继承</span><span style="COLOR: black">Entity</span><span style="COLOR: black">类，包含三个属性</span><span style="COLOR: black">:role(String)</span><span style="COLOR: black">、</span><span style="COLOR: black">user(User)</span><span style="COLOR: black">、</span><span style="COLOR: black">group(Group)</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">很明显，一个</span><span style="COLOR: black">user</span><span style="COLOR: black">对应一个用户，一个</span><span style="COLOR: black">group</span><span style="COLOR: black">对应一个用户组，它们之间通过</span><span style="COLOR: black">membership</span><span style="COLOR: black">关联，并且一个</span><span style="COLOR: black">user</span><span style="COLOR: black">可以属于多个不同类型（</span><span style="COLOR: black">type)</span><span style="COLOR: black">的</span><span style="COLOR: black">group</span><span style="COLOR: black">，</span><span style="COLOR: black">user</span><span style="COLOR: black">和</span><span style="COLOR: black"> group</span><span style="COLOR: black">之间是多对多的关系。</span><span style="COLOR: black">Membership</span><span style="COLOR: black">类的</span><span style="COLOR: black">role</span><span style="COLOR: black">属性个人感觉用途不大，反倒是</span><span style="COLOR: black">name</span><span style="COLOR: black">属性代表了</span><span style="COLOR: black">user</span><span style="COLOR: black">在</span><span style="COLOR: black">group</span><span style="COLOR: black">里的</span><span style="COLOR: black">role</span><span style="COLOR: black">（角色）。</span></div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://fndcz.javaeye.com/blog/114451#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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>Mon, 20 Aug 2007 23:08:50 +0800</pubDate>
        <link>http://fndcz.javaeye.com/blog/114451</link>
        <guid>http://fndcz.javaeye.com/blog/114451</guid>
      </item>
      <item>
        <title>jBPM学习（六）----Hello World </title>
        <author>fndcz</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fndcz.javaeye.com">fndcz</a>&nbsp;
          链接：<a href="http://fndcz.javaeye.com/blog/114450" style="color:red;">http://fndcz.javaeye.com/blog/114450</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>六、</span>开发自己的工作流（Hello World）</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>eclipse插件安装</div>
<div style="TEXT-INDENT: 21pt">jbpm提供了在eclipse下的一个可视化插件，通过它我们可以方便的定义工作流，打开jbpm-starters-kit-3.1.4\jbpm-designer\jbpm-gpd-feature目录，我们可以看到下面有一个eclipse文件夹，这里我们通过link的方式为eclipse添加该插件。</div>
<div style="TEXT-INDENT: 21pt">在{eclipse_home}/link文件夹下新建jbpm-designer.link文件，用记事本打开该文件加入如下一行：</div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: blue">path=D:\\jbpm-starters-kit-3.1.4\\jbpm-designer\\jbpm-gpd-feature</span></div>
<div><span style="COLOR: black">后面的路径即为该插件的存放路径，根据个人情况修改。注意，这里的分隔符使用双斜杠</span><span style="COLOR: black">\\</span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">新建</span><span style="COLOR: black">jbpm</span><span style="COLOR: black">项目</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">主菜单&ldquo;文件－＞新建－＞项目&rdquo;，在弹出的对话框里，有&ldquo;</span><span style="COLOR: black"> Process Project </span><span style="COLOR: black">&rdquo;项，如下图所示：</span></div>
<div><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/3947cadf3b90433c9a82ec64449fc529.jpg" alt="" /></div>
<div><span style="COLOR: black">选上，单击&ldquo;下一步&rdquo;，工程起名&ldquo;</span><span style="COLOR: black">myjbpm</span><span style="COLOR: black">&rdquo;，点击下一步为此工程指定一个</span><span style="COLOR: black">jbpm location</span><span style="COLOR: black">，如果时第一次运行该插件，系统会提示你设置一个</span><span style="COLOR: black">jbpm location</span><span style="COLOR: black">。这里我们将</span><span style="COLOR: black">location</span><span style="COLOR: black">设置为</span><span style="COLOR: blue">D:\jbpm-starters-kit-3.1.4\jbpm.3</span><span style="COLOR: black">。然后就可以单击&ldquo;完成&rdquo;了。然后就生成了如下图所示的一个项目结构：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/d39dba84568644dea8ad9ccde5d5eb7d.png" alt="" /></span></div>
<div><span style="COLOR: black">这个项目和通常</span><span style="COLOR: black">Eclipse</span><span style="COLOR: black">的项目结构有点不同，不过这是一个现在非常流行的项目结构，</span><span style="COLOR: black">src/main/java</span><span style="COLOR: black">存放源文件，</span><span style="COLOR: black">src/test/java</span><span style="COLOR: black">存放相应的</span><span style="COLOR: black">JUnit</span><span style="COLOR: black">单元测试代码，</span><span style="COLOR: black">src/main/jpdl</span><span style="COLOR: black">存放我们定义的工作流文件。</span></div>
<div><span style="COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black">项目创建起了，介绍一下里面的文件吧：</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">MessageActionHandler</span><span style="COLOR: black">，自动生成的一个</span><span style="COLOR: black"> ActionHandler</span><span style="COLOR: black">。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">hibernate.cfg.xml </span><span style="COLOR: black">　</span><span style="COLOR: black">jBPM</span><span style="COLOR: black">是用</span><span style="COLOR: black">Hibernate</span><span style="COLOR: black">进行工作流的数据存储的，这个就是</span><span style="COLOR: black">Hibernate </span><span style="COLOR: black">的配置文件。后面我们将讲到如何配置这个文件。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">jbpm.cfg.xml </span><span style="COLOR: black">　</span><span style="COLOR: black"> jbpm</span><span style="COLOR: black">本身的配置文件。现在是空的，它用的是缺省配置，你想知道有哪些配置就去看这个文件</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: #3366ff">D:\jbpm-starters-kit- 3.1.4\jbpm.3\src\java.jbpm\org\jbpm\default.jbpm.cfg.xml</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">log4j.properties </span><span style="COLOR: black">　这个是日志</span><span style="COLOR: black"> API </span><span style="COLOR: black">包</span><span style="COLOR: black"> log4j </span><span style="COLOR: black">的配置文件，用过</span><span style="COLOR: black"> log4j </span><span style="COLOR: black">的都知道。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">SimpleProcessTest.java </span><span style="COLOR: black">　这个是对最重要的流程配置文件的</span><span style="COLOR: black">processdefinition.xml</span><span style="COLOR: black">单元测试代码。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">gpd.xml </span><span style="COLOR: black">　用于生成流程图的定义文件。都是一些方框的坐标和长宽</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">processdefinition.xml </span><span style="COLOR: black">　这个是对最重要的流程配置文件，以后写流程要经常和它打交道。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">processimage.jpg </span><span style="COLOR: black">　一个流程图</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">简单工作流定义</span></div>
<div style="MARGIN-LEFT: 21pt"><span style="COLOR: black">展开</span><span style="COLOR: black">myjbpm</span><span style="COLOR: black">工程，选中</span><span style="COLOR: black">src/main/jpdl</span><span style="COLOR: black">包，单击鼠标右键，</span><span style="COLOR: black">new-&gt;other</span><span style="COLOR: black">，如下图：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/fd610e7659444a3cbe186942dab4e8e7.png" alt="" /></span></div>
<div><span style="COLOR: black">新建一个</span><span style="COLOR: black">Process Definition</span><span style="COLOR: black">，</span><span style="COLOR: black">process</span><span style="COLOR: black">命名为</span><span style="COLOR: black">HelloWorld</span><span style="COLOR: black">，单击</span><span style="COLOR: black">finish</span><span style="COLOR: black">，结果如下图：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/bd62005d070149398bd195d1500e2d5d.png" alt="" /></span></div>
<div><span style="COLOR: black">右面的窗口为工作流定义的可视化窗口。选中该窗口单击</span><span style="COLOR: black">eclipse</span><span style="COLOR: black">菜单栏</span><span style="COLOR: black">view-&gt;show Grid</span><span style="COLOR: black">为该窗口添加网格，方便后面开发。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义基本流程</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">分别向编辑区拖入，</span><span style="COLOR: black">start</span><span style="COLOR: black">、</span><span style="COLOR: black">task node</span><span style="COLOR: black">、</span><span style="COLOR: black">end</span><span style="COLOR: black">节点，用</span><span style="COLOR: black">transition</span><span style="COLOR: black">将他们依次连起来，并分别修改</span><span style="COLOR: black">task node</span><span style="COLOR: black">名为</span><span style="COLOR: black">show message</span><span style="COLOR: black">，</span><span style="COLOR: black">end</span><span style="COLOR: black">节点名为</span><span style="COLOR: black">end</span><span style="COLOR: black">，两个</span><span style="COLOR: black">transition</span><span style="COLOR: black">分别命名为</span><span style="COLOR: black">send</span><span style="COLOR: black">和</span><span style="COLOR: black">ok</span><span style="COLOR: black">，得到如下所示结果：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/54ba856c77ff4e8eb3e67fc4f02632b8.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义泳道</span><span style="COLOR: black">(swimlane)</span></div>
<div><span style="COLOR: black">我们为该流程定义一个名为</span><span style="COLOR: black">user</span><span style="COLOR: black">的泳道</span><span style="COLOR: black">(swimlane)</span><span style="COLOR: black">，点击编辑窗口左下角的</span><span style="COLOR: black">swimlanes</span><span style="COLOR: black">按钮，得到添加泳道界面，单击</span><span style="COLOR: black">add</span><span style="COLOR: black">按钮，按照下图配置相关信息，这样我们就将用户</span><span style="COLOR: black">grover</span><span style="COLOR: black">加入到了泳道</span><span style="COLOR: black">user</span><span style="COLOR: black">中：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/c5052d58eadf4134ad4f092551d41e4e.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">定义节点任务</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">打开</span><span style="COLOR: black">eclipse</span><span style="COLOR: black">中的</span><span style="COLOR: black">outline</span><span style="COLOR: black">视图，我们可以看到一个名为</span><span style="COLOR: black">HelloWorld</span><span style="COLOR: black">的</span><span style="COLOR: black">process</span><span style="COLOR: black">节点，展开该节点，如下图：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/6d1b32fa6c114f5592ce42f50fc7f426.png" alt="" /></span></div>
<div><span style="COLOR: black">右击</span><span style="COLOR: black">start</span><span style="COLOR: black">节点，选择</span><span style="COLOR: black">add task</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/c574d67b58fc4a25a92818f4f5d4c28e.png" alt="" /></span></div>
<div><span style="COLOR: black">我们看到</span><span style="COLOR: black">start</span><span style="COLOR: black">节点下多出了一个名为</span><span style="COLOR: black">task</span><span style="COLOR: black">的</span><span style="COLOR: black">task</span><span style="COLOR: black">节点：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/88717cb0a5044e6fbfb5c88efc601af7.png" alt="" /></span></div>
<div><span style="COLOR: black">双击该节点，打开节点编辑窗口，将该</span><span style="COLOR: black">task</span><span style="COLOR: black">改名为</span><span style="COLOR: black">input message</span><span style="COLOR: black">，如下：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/d6dee414c34e462ba5c5b95cc25b96b0.png" alt="" /></span></div>
<div><span style="COLOR: black">选择左边的</span><span style="COLOR: black">controller</span><span style="COLOR: black">我们为该流程定义一个名为</span><span style="COLOR: black">message</span><span style="COLOR: black">的变量，这个变量就是我们后面要传递的信息，照下图配置该变量：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/34efaa301c1342de9e10a0b4dce41e25.png" alt="" /></span></div>
<div><span style="COLOR: black">点击</span><span style="COLOR: black">ok</span><span style="COLOR: black">，完成</span><span style="COLOR: black">start</span><span style="COLOR: black">节点下的任务定义。</span></div>
<div><span style="COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black">按照以上步骤，我们再为</span><span style="COLOR: black">message show</span><span style="COLOR: black">节点定义一个名为</span><span style="COLOR: black">show message</span><span style="COLOR: black">的任务，这里的变量名也为</span><span style="COLOR: black">message</span><span style="COLOR: black">，但是属性只有</span><span style="COLOR: black">read</span><span style="COLOR: black">，我们通过这个任务读取前面所输入的</span><span style="COLOR: black">message</span><span style="COLOR: black">信息。注意两个任务的变量名要相对应，如下图：</span></div>
<div><span style="COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/ad78c96bbe4849ca83fce16416d31e09.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">下来点击</span><span style="COLOR: black">assignment</span><span style="COLOR: black">菜单，配置该任务的分配方式，如下图所示，将该任务分配给名为</span><span style="COLOR: black">user</span><span style="COLOR: black">的</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">，此</span><span style="COLOR: black">swimlane</span><span style="COLOR: black">包含了</span><span style="COLOR: black">grover</span><span style="COLOR: black">用户。结果如下图：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/b6add095f82e4036a4ab6409b5db59e8.png" alt="" /></span></div>
<div><span style="COLOR: black">单击</span><span style="COLOR: black">ok</span><span style="COLOR: black">，我们就完成了该流程的任务定义。这里我们看到多出了两个</span><span style="COLOR: black">task</span><span style="COLOR: black">，如图：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/4d2af2f968214178aba1f7f22e64548c.png" alt="" /></span></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">4)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">保存流程定义</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">单击保存按钮，我们保存该流程定义。保存成功后我们可以看到，在流程定义的包中多出了一个名为</span><span style="COLOR: black">processimage.jpg</span><span style="COLOR: black">的图像文件，该文件为我们定义流程的流程图，如下：</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/dc9719811aed4266b6e5881d91680a28.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">点击编辑窗口下的</span><span style="COLOR: black">source</span><span style="COLOR: black">按钮，我们可以查看通过图形编辑界面自动生成的该流程的</span><span style="COLOR: black">xml</span><span style="COLOR: black">定义，即</span><span style="COLOR: black">processdefinition.xml</span><span style="COLOR: black">中的内容。如下：</span></div>
<span style="COLOR: black">
<div class="code_title" style="TEXT-INDENT: 21pt">xml 代码</div>
<div style="TEXT-INDENT: 21pt">
<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></span><span class="tag">&lt;</span><span class="tag-name">process-definition</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><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;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;HelloWorld&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">swimlane</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">assignment</span><span>&nbsp;</span><span class="attribute">expression</span><span>=</span><span class="attribute-value">&quot;user(grover)&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">assignment</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">swimlane</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">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=""><span>&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;input&nbsp;message&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">controller</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">variable</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;message&quot;</span><span>&nbsp;</span><span class="attribute">access</span><span>=</span><span class="attribute-value">&quot;read,write,required&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">variable</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">controller</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</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;send&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;message&nbsp;show&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;</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;&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;message&nbsp;show&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">task</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;show&nbsp;message&quot;</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;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">controller</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">variable</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;message&quot;</span><span>&nbsp;</span><span class="attribute">access</span><span>=</span><span class="attribute-value">&quot;read&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">variable</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">controller</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">task</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;OK&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;</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;</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=""><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>
</div>
<div style="TEXT-INDENT: 21pt">
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">对照刚才的流程定义，我们很容易可以看出各个</span><span style="COLOR: black">xml</span><span style="COLOR: black">标签所对应的意义。具体细节我们将在后面介绍。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">5)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">部署流程定义</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">首先我们要启动</span><span style="COLOR: black">jboss</span><span style="COLOR: black">服务，待服务启动成功后单击编辑窗口下的</span><span style="COLOR: black">deployment</span><span style="COLOR: black">按钮，按照下图配相应参数，然后点击</span><span style="COLOR: black">test connection</span><span style="COLOR: black">，如果弹出成功窗口，说明服务器连接正常，否则请检查你的参数设置。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/d10171d24a84475fbe68c55431ee0279.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">测试连接成功后，我们点击下面的</span><span style="COLOR: black">deploy process archive</span><span style="COLOR: black">按钮，如果得到成功信息，恭喜你，说明我们定义的工作流已经成功的部署到了</span><span style="COLOR: black">jboss</span><span style="COLOR: black">上，如下图：</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/03a5bd5caa6047b8acb2e98a1914b2ae.png" alt="" /></span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">6)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">使用工作流</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">打开</span><span style="COLOR: black">IE</span><span style="COLOR: black">浏览器，在地址栏中输入</span><span style="COLOR: black"><a href="http://localhost:8080/jbpm">http://localhost:8080/jbpm</a></span><span style="COLOR: black">，以</span><span style="COLOR: black">cookie monster</span><span style="COLOR: black">身份登陆系统。我们看到</span><span style="COLOR: black">Start New Process Execution</span><span style="COLOR: black">里面多了一项</span><span style="COLOR: black">Hello World</span><span style="COLOR: black">，这就是我们刚才部署过的工作流。</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/6de2b4a150774fdfb6aeccc1ad42c981.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">点击</span><span style="COLOR: black">input message</span><span style="COLOR: black">我们会看到以下画面：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/6326c7ade5104bceaab2984d8a6f6c8b.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">注意到左面有个一名为</span><span style="COLOR: black">message</span><span style="COLOR: black">的文本框，这个文本框就是我们在流程定义里定义的变量</span><span style="COLOR: black">message</span><span style="COLOR: black">。右面是本流程的流程图，红色的框代表该流程现在运行到哪一步。我们在文本框内输入</span><span style="COLOR: black">Hello!Congratulations!</span><span style="COLOR: black">。然后点击</span><span style="COLOR: black">save and close task</span><span style="COLOR: black">按钮，提交该内容。之后页面跳转，我们会在上面看到这样一行提示信息：</span><span style="COLOR: #3366ff">A new task has been assigned to &lsquo;grover&rsquo;</span><span style="COLOR: black">。说明第一步流程已完成，将下一步任务委派给泳道</span><span style="COLOR: black">user</span><span style="COLOR: black">中的</span><span style="COLOR: black">grover</span><span style="COLOR: black">。我们点击屏幕左上角的</span><span style="COLOR: black">login as another user</span><span style="COLOR: black">。如图所示：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/3893b48210b74138b86f1dca834b6dae.png" alt="" /></span></div>
<div><span style="COLOR: black">以</span><span style="COLOR: black">grover</span><span style="COLOR: black">身份登陆系统，我们可以看到在</span><span style="COLOR: black">grover</span><span style="COLOR: black">的主界面下的</span><span style="COLOR: black">tasklist</span><span style="COLOR: black">里多出了一项：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/d85715bbeabd464388c71a3c547f1cdd.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">单击该任务，我们可以看到同样有一个名为</span><span style="COLOR: black">message</span><span style="COLOR: black">的文本框，但是他的内容是不可编辑的，这和我们定义工作流变量时的设置有关，并且里面的内容正是上一步中</span><span style="COLOR: black">cookie monster</span><span style="COLOR: black">用户所输入的内容。我们还可以注意到，右面流程图中标明该流程已经进入第二步。</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/668c6f59023a4e1c9ee0812ad4d75cd8.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">继续点击</span><span style="COLOR: black">save and close task</span><span style="COLOR: black">按钮，页面跳转，得到信息：</span><span style="COLOR: #3366ff">The process has finished</span><span style="COLOR: #3366ff">。</span><span style="COLOR: black">并且</span><span style="COLOR: black">tasklist</span><span style="COLOR: black">中刚才的任务项也不存在了。至此，整个工作流程执行完毕。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">7)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: black">工作流管理</span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">Jbpm</span><span style="COLOR: black">为我们提供了简单的工作流管理，单击左面菜单栏的</span><span style="COLOR: black">monitoring</span><span style="COLOR: black">进入</span><span style="COLOR: black">monitoring</span><span style="COLOR: black">界面，点击链接</span><span style="COLOR: black">Process Definitions list</span><span style="COLOR: black">，如下：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/9e1a5a97deb6465b9db30cacb32ff436.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">得到如下界面，这里我们可以看到目前为止所有的工作流定义以及他们所拥有的实例数。通过该图可以得知</span><span style="COLOR: black">Hello World</span><span style="COLOR: black">目前只有一个实例，即我们刚才执行过的那个实例。</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/309ea325ab1d4640a33f5e51d660d923.png" alt="" /></span></div>
<div><span style="COLOR: black">我们点击实例数</span><span style="COLOR: black">1</span><span style="COLOR: black">，得到</span><span style="COLOR: black">Hello World</span><span style="COLOR: black">下所有的实例列表，如下图：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/f3cd65713e554b0893ed54c5350959fe.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">我们只初始化过一个实例，因此这里只有一项，</span><span style="COLOR: black">start</span><span style="COLOR: black">和</span><span style="COLOR: black">end</span><span style="COLOR: black">分别表示该实例开始和结束的时间，我们点击前面的</span><span style="COLOR: black">Id</span><span style="COLOR: black">号，查看该实例的详细信息：</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/1be3dc02b3a947ef906cc097655e02c8.png" alt="" /></span></div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: black">其中，</span><span style="COLOR: black">task</span><span style="COLOR: black">列表列出了该实例所有的</span><span style="COLOR: black">task</span><span style="COLOR: black">，其中</span><span style="COLOR: black">name</span><span style="COLOR: black">表示</span><span style="COLOR: black">task</span><span style="COLOR: black">的名字，</span><span style="COLOR: black">actorId</span><span style="COLOR: black">表示由谁执行该</span><span style="COLOR: black">task</span><span style="COLOR: black">，</span><span style="COLOR: black">date</span><span style="COLOR: black">表示该</span><span style="COLOR: black">task</span><span style="COLOR: black">结束的时间。</span><span style="COLOR: black">Variables</span><span style="COLOR: black">列表列出了该</span><span style="COLOR: black">task</span><span style="COLOR: black">中所有的变量及其值。我们在流程定义里只定义了一项变量，因此这里只有</span><span style="COLOR: black">message</span><span style="COLOR: black">，它的值即为刚才输入的内容。我们还可以通过</span><span style="COLOR: black">update</span><span style="COLOR: black">按钮向列表中添加修改变量。</span></div>
<div><span style="COLOR: black"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/126201fb08ef4a53a071659681ed46c6.png" alt="" /></span></div>
<div><span style="COLOR: black">下面的图，即为该流程的流程图。红色的框标明此实例已经结束。</span></div>
<div><span style="COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black">至此，一个简单的工作流就完成了，相信大家从中可以大致的了解</span><span style="COLOR: black">jbpm</span><span style="COLOR: black">定义工组流的基本过程，在后面的章节我们将进一步介绍更多的内容。</span></div>
</div>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://fndcz.javaeye.com/blog/114450#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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>Mon, 20 Aug 2007 23:06:36 +0800</pubDate>
        <link>http://fndcz.javaeye.com/blog/114450</link>
        <guid>http://fndcz.javaeye.com/blog/114450</guid>
      </item>
      <item>
        <title>jBPM学习（五）----面向图的程序设计 </title>
        <author>fndcz</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fndcz.javaeye.com">fndcz</a>&nbsp;
          链接：<a href="http://fndcz.javaeye.com/blog/114447" style="color:red;">http://fndcz.javaeye.com/blog/114447</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>五、</span>面向图的程序设计</div>
<div style="TEXT-INDENT: 21pt">Jbpm的流程设计语言是面向图的，下面介绍一些面向图程序设计的概念。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>图的结构</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>1)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Node和transition</div>
<div style="TEXT-INDENT: 21pt">首先，图的结构由node和transition组成。每个transition都是有向的，所以node可以有一个leaving transition或者arriving transition。每个node是可以看成一项任务，每个node都有execute方法。Node的子类必须重载这个方法来为该类型的node实现特定的任务。</div>
<div style="TEXT-INDENT: 21pt"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/dd894afa91394feaaf075d59292cd642.png" alt="" /></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>2)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Execution</div>
<div style="TEXT-INDENT: 21pt">在图结构中定义的execution模型和有限自动机还有uml状态图相似。一个execution（也可称为token，下面我们称其为<span style="COLOR: red">令牌）具有对当前</span>node的一个引用。</div>
<div>&nbsp;</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/c2febd7f077e4c5496125ffc4addd2a4.png" alt="" /></div>
<div style="TEXT-INDENT: 21pt">Transition通过take方法可以将一个令牌(token)从源node传递到目标node。</div>
<div>&nbsp;</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/a748584292fc413c913f6de8b148c485.png" alt="" /></div>
<div style="TEXT-INDENT: 21pt">当一个令牌到达一个node的时候，这个node就被执行（通过execute方法）。Node的execute方法也可以经行繁殖。繁殖在这里的意思是一个node可以将到达的令牌通过该node中的一个transition传向下一个node。</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/72dbfc54ac1549ce9cb3448076ce0c5a.png" alt="" /></div>
<div>当一个node的execute方法没有传递令牌的时候，它就处于等待(wait)状态。同样的，当一个令牌在开始节点创建的时候，它就处于等待状态，等待一些事件(event)。令牌的一个事件可以触发令牌进行传递。如果事件是指向当前节点的一个leaving transition的话，那么令牌将沿着这个transition传递。令牌将不断的传递，知道遇到下个状态为wait的节点。</div>
<div><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/fd9d15213cf24f018d7d673f6c67068d.png" alt="" /></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>3)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>流程定义语言</div>
<div style="TEXT-INDENT: 21pt">在wait状态下，一个令牌指向图中的一个node。此时，流程图和令牌都可以进行持久话，例如通过hibernate将其存入数据库。流程定义语言就是一个Node-implementation的集合。每个Node-implementation对应一个流程结构。</div>
<div style="TEXT-INDENT: 21pt">这里我们给出一个例子，该流程语言由4个process组成：一个start state，一个decision，一个task和一个end state。</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/1099d10f7e3148fcb4ba459f157ec2b7.png" alt="" /></div>
<div style="TEXT-INDENT: 21pt">我们可以通过上面定义的语言来具体描述一个流程，其中冒号前为该节点的描述，冒号后为该节点的具体类型：</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/ef24d1475d2a4febb1f847daf2f1e5a7.png" alt="" /></div>
<div>当为该流程创建一个新的实例的时候，我们通过将令牌放入该过程的开始节点(start node)。当令牌没有接收到一个事件的时候，这个令牌将一直留在次节点中。</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/4c7d0aec6cef479e8c5903235fff31a8.png" alt="" /></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>现在我们来看看当一个事件发生(事件<span style="COLOR: red">点燃</span>)时，会出现什么情况。在初始情况下，我们通过调用令牌的event方法来点燃一个默认事件，它和默认transition相对应。Event方法可以找到默认的leaving transition，然后通过调用transition的take方法将令牌沿着该tranistion传递。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>这个transition将令牌传递到decision节点并且调用该节点的execute方法。我们假设decision的execute方法通过计算后向令牌传递了一个yes事件。这将使令牌继续沿着&rsquo;yes&rsquo; transition进行传递，之后令牌将到达doublieCheck节点。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>我们假设doubleCheck任务节点的execute方法向checker的任务列表中添加一个实体，然后等待checher的输入，而并不将令牌继续传递。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>现在令牌将在doubleCheck节点停留。</div>
<div><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/809ea70189c84d30983a4a29d319a8f9.png" alt="" /></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>4)<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Action</div>
<div style="TEXT-INDENT: 21pt">一个Acition同样也有一个execute方法。Action可以和event相联系。在节点被执行的时候有两个基本的事件被触发：node leave和node enter。</div>
<div align="center"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/fndcz/0ff5c683a5c845a6ba767aa4ff45b78f.png" alt="" /></div>
<div>每一个event都可以和一系列action相联系，当事件被触发的时候，这些action也将被执行。</div>
          <br/>
          <span style="color:red;">
            <a href="http://fndcz.javaeye.com/blog/114447#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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>Mon, 20 Aug 2007 23:04:02 +0800</pubDate>
        <link>http://fndcz.javaeye.com/blog/114447</link>
        <guid>http://fndcz.javaeye.com/blog/114447</guid>
      </item>
      <item>
        <title>jBPM学习（四）----体验jbpm </title>
        <author>fndcz</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fndcz.javaeye.com">fndcz</a>&nbsp;
          链接：<a href="http://fndcz.javaeye.com/blog/114445" style="color:red;">http://fndcz.javaeye.com/blog/114445</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>四、</span>体验jbpm</p>
<div style="TEXT-INDENT: 21pt">进入jbpm主页面后，以 cookie monster 用户登录，在右面我们可以清楚的看到整个定货业务的流程。选择&ldquo; create new web sale order &rdquo;可以创建一个定单。如下图所示，在图左边是填写的定单情况，右边一整个定货流程的示意图，红色框表示流程进行到哪一步了。填写好定单好，选择&ldquo; Save and Close Task &rdquo;，完成定单提交。</div>
<div style="TEXT-INDENT: 21pt"><img src="http://p.blog.csdn.net/images/p