﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-风人园-随笔分类-jBPM</title><link>http://www.blogjava.net/wuxufeng8080/category/19317.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 18 Mar 2008 11:37:44 GMT</lastBuildDate><pubDate>Tue, 18 Mar 2008 11:37:44 GMT</pubDate><ttl>60</ttl><item><title>springmodule整合spring jbpm配置</title><link>http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185107.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 10 Mar 2008 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185107.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/185107.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/185107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/185107.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN&nbsp;2.0//EN"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://www.springframework.org/dtd/spring-beans-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Hibernate&nbsp;SessionFactory&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="configLocation"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">classpath:hibernate.cfg.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Transaction&nbsp;manager&nbsp;for&nbsp;a&nbsp;single&nbsp;Hibernate&nbsp;SessionFactory&nbsp;(alternative&nbsp;to&nbsp;JTA)&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.HibernateTransactionManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;jBPM&nbsp;configuration</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">bean&nbsp;id="hibernateConfiguration"&nbsp;factory-bean="sessionFactory"&nbsp;factory-method="getConfiguration"/</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="jbpmConfiguration"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="configuration"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">classpath:jbpm.cfg.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;jBPM&nbsp;template&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="jbpmTemplate"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springmodules.workflow.jbpm31.JbpmTemplate"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">constructor-arg&nbsp;</span><span style="color: #ff0000">index</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="jbpmConfiguration"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="testSetUp"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.ivo.jpbm.test.TestSetUp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jbpmTemplate"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="jbpmTemplate"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
这个是spring的配置，hibernate的配置可以直接使用原来的那个。<br />
<br />
然后这里可能会出现一个错误，说找不到default.jbpm.context，需要修改jbpm.cfg.xml<br />
<br />
这里最简单的方法就是完全复制org/jbpm/default.jbpm.cfg.xml 内容，然后把hibernate部分的东西注释掉就可以了。</p>
<p><br />
<br />
然后编写一个test类，用于测试。<br />
<br />
整合的步骤如上，下面就是在jbpmTemplate的基础上，将常用的方法重新封装一下。 </p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/185107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2008-03-10 16:22 <a href="http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springmodule jbpm 3.1</title><link>http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185104.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Mon, 10 Mar 2008 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185104.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/185104.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/185104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/185104.html</trackback:ping><description><![CDATA[<div class="chapter" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="jbpm31"></a>Chapter&nbsp;9.&nbsp;jBPM 3.1.x</h2>
</div>
</div>
<div></div>
</div>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in">
<table summary="Note" border="0">
    <tbody>
        <tr>
            <td valign="top" align="center" width="25" rowspan="2"><img alt="[Note]" src="file:///E:/IVO/Library/spring-modules-0.8/docs/reference/html_single/images/admons/note.png" /></td>
            <th align="left">Note</th>
        </tr>
        <tr>
            <td valign="top" align="left" colspan="2">
            <p>The following documentation can be used as reference documentation for Spring Modules jBPM 3.0.x support as well.</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e4991"></a>9.1.&nbsp;Introduction</h2>
</div>
</div>
<div></div>
</div>
<p>jBPM module offers integration between the <a href="http://www.springframework.org/" target="_top">Spring</a> and <a href="http://www.jboss.com/products/jbpm/" target="_top">jBPM</a> allowing for reuse of Spring's <a href="http://www.hibernate.org/" target="_top">Hibernate</a> support along with the IoC container. The module allows jBPM's underlying Hibernate sessionFactory to be configured through Spring and jBPM actions to access Spring's context.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e5005"></a>9.2.&nbsp;Configuration</h2>
</div>
</div>
<div></div>
</div>
<p>Users familiar with Spring will see that the jBPM module structure resembles with the orm package from the main Spring distribution. The module offers a central template class for working with jBPM, a callback to access the native JbpmContext and a local factory bean for configuration and creating a jBPM instance.</p>
<pre class="programlisting">&lt;beans&gt;
&lt;!-- DataSource definition --&gt;
&lt;bean id="dataSource" class="..."&gt;
...
&lt;/bean&gt;
&lt;!-- Hibernate SessionFactory definition --&gt;
&lt;bean id="hibernateSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;
...
&lt;/bean&gt;
&lt;!-- helper for reading jBPM process definitions --&gt;
&lt;bean id="simpleWorkflow"
class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean"&gt;
&lt;property name="definitionLocation"
value="classpath:org/springmodules/workflow/jbpm31/simpleWorkflow.xml"/&gt;
&lt;/bean&gt;
&lt;!-- jBPM configuration --&gt;
&lt;bean id="jbpmConfiguration"
class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean"&gt;
&lt;property name="sessionFactory" ref="hibernateSessionFactory"/&gt;
&lt;property name="configuration" value="classpath:jbpm.cfg.xml"/&gt;
&lt;property name="processDefinitions"&gt;
&lt;list&gt;
&lt;ref local="simpleWorkflow"/&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;property name="createSchema" value="true"/&gt;
&lt;property name="processDefinitionsResources"&gt;
&lt;list&gt;
&lt;value&gt;classpath:/org/springmodules/workflow/jbpm31/someOtherWorkflow.xml&lt;/value&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;!-- jBPM template --&gt;
&lt;bean id="jbpmTemplate" class="org.springmodules.workflow.jbpm31.JbpmTemplate"&gt;
&lt;constructor-arg index="0" ref="jbpmConfiguration"/&gt;
&lt;constructor-arg index="1" ref="simpleWorkflow"/&gt;
&lt;/bean&gt;
set
&lt;/beans&gt;</pre>
<p>The example above shows how (existing) Spring-managed Hibernate SessionFactories and transaction management can be reused with jBPM.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e5014"></a>9.2.1.&nbsp;LocalJbpmConfigurationFactoryBean</h3>
</div>
</div>
<div></div>
</div>
<p>The main element is <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> which should be familiar to users acustomed to Spring. Based on the jbpm configuration file and the given SessionFactory, it will create a jBPM configuration which can be used for working with the given process definitions. It is possible to replace jBPM xml configuration with jBPM 3.1.x newly added ObjectFactory - note that if both are present the xml configuration is preffered. <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> allows the creation of the underlying schema based on the process definitions loaded automatically at startup.</p>
<p>Note that the sessionFactory property is not mandatory - Hibernate SessionFactory can be reused with jBPM or jBPM can work by itself without any integration with the existing infrastructure. However, in most scenarios, using <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> allows one to take advantage of Spring <a href="http://static.springframework.org/spring/docs/2.0.x/reference/transaction.html" target="_top">transaction management infrastructure</a> so it's possible without any code change to use jBPM, Hibernate and jdbc-based code inside the same transactional context, be it managed locally or globally (JTA). Moreover, it is possible to use <a href="http://static.springframework.org/spring/docs/2.0.x/reference/orm.html#orm-hibernate" target="_top">thread-bound</a> session or OpenSessionInView patterns with jBPM.</p>
<p><span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> is also aware of the enclosing applicationContext lifecycle - jBPM will be initialized once the context is started (usually application startup) and will be closed properly when the context is destroyed (application is shutdown).</p>
<p>Note that <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> can be configured programatically and can be used standalone only to build an jBPM context which can be used independently of Spring Modules jBPM support.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e5045"></a>9.2.2.&nbsp;Inversion of Control: JbpmTemplate and JbpmCallback</h3>
</div>
</div>
<div></div>
</div>
<p>Another important feature of Spring Modules jBPM support is <span class="emphasis"><em>JbpmTemplate</em></span>. The template offers very convient ways of working directly with process definitions as well as jBPM API taking care of handling exceptions (be it jBPM or Hibernate based) in respect to the ongoing transaction (if it's present), the underlying Hibernate session (if pesistent services are used) and the jBPM context. jBPM exceptions (and the underlying Hibernate information) are translated into Spring's DAO exception hierarchy. Everything happens in a transparent and consistent manner.This is possible, as with every Spring-style template,even when direct access to the native JbpmContext is desired, through the <span class="emphasis"><em>JbpmCallback</em></span>:</p>
<pre class="programlisting">public ProcessInstance findProcessInstance(final Long processInstanceId) {
return (ProcessInstance) execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) {
// do something
...
return context.getGraphSession().loadProcessInstance(processInstanceId.longValue());
}
});
}</pre>
<p>As well, as <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span>, the <span class="emphasis"><em>JbpmTemplate</em></span> can be configured programatically and can be used standalone on a pre-existing jbpmContext (configured through <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> or not) and can be used independently of Spring Modules jBPM support.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e5069"></a>9.2.3.&nbsp;ProcessDefinitionFactoryBean</h3>
</div>
</div>
<div></div>
</div>
<p><span class="emphasis"><em>ProcessDefinitionFactoryBean</em></span> is a simple reader that loads jBPM process definition using Spring's <a href="http://static.springframework.org/spring/docs/2.0.x/reference/resources.html#d0e4913" target="_top">ResourceLoader</a>s. Thus, the xml files can be load using the classpath, relative or absolute file path or even from the Servlet Context. See the official <a href="http://static.springframework.org/spring/docs/2.0.x/reference/resources.html" target="_top">documentation</a> for more information.</p>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in">
<table summary="Note" border="0">
    <tbody>
        <tr>
            <td valign="top" align="center" width="25" rowspan="2"><img alt="[Note]" src="file:///E:/IVO/Library/spring-modules-0.8/docs/reference/html_single/images/admons/note.png" /></td>
            <th align="left">Note</th>
        </tr>
        <tr>
            <td valign="top" align="left" colspan="2">
            <p>As <a href="http://forum.springframework.org/showpost.php?p=64025&amp;postcount=26" target="_top">reported</a> on the <a href="http://forum.springframework.org/forumdisplay.php?f=37" target="_top">forums</a>, using ProcessDefinitionFactoryBean jBPM 3.1.1will trigger a new process definition to be persisted(through <tt class="literal">deployProcessDefinition</tt>) at each startup. While this is useful in development when the database is created on application startup and destroyed on closing, for cases where the definition doesn't change, the process should not be declared inside Spring XML files.</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in">
<table summary="Note" border="0">
    <tbody>
        <tr>
            <td valign="top" align="center" width="25" rowspan="2"><img alt="[Note]" src="file:///E:/IVO/Library/spring-modules-0.8/docs/reference/html_single/images/admons/note.png" /></td>
            <th align="left">Note</th>
        </tr>
        <tr>
            <td valign="top" align="left" colspan="2">
            <p>As reported <a href="http://opensource.atlassian.com/projects/spring/browse/MOD-193" target="_top">here</a>, due to the static nature of jBPM, process definitions which include sub processes are not loaded properly if a JbpmContext does not exist at the time of the loading (no exception is thrown whatsoever). As a workaround consider using the LocalJbpmConfigurationFactoryBean's processDefinitionsResources property.</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e5100"></a>9.2.4.&nbsp;Outside Spring container</h3>
</div>
</div>
<div></div>
</div>
<p>It is important to note that while our example showed LocalJbpmConfigurationFactoryBean and JbpmTemplate template inside a Spring xml, these classes do not depend on each other or on Spring application context. They can be just as well configured programatically and can</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e5105"></a>9.3.&nbsp;Accessing Spring beans from jBPM actions</h2>
</div>
</div>
<div></div>
</div>
<p>Another important feature of Spring Modules jBPM integration is allowing Spring configured beans to be reused inside jBPM actions. This allows one to leverage Spring container capabilities (bean lifecycles, scoping, injection, proxying just to name a few) in a transparent way with jBPM. Consider the following Spring application context:</p>
<pre class="programlisting">&lt;beans&gt;
&lt;!-- Spring bean visible inside jBPM processed --&gt;
&lt;bean id="jbpmAction" class="org.MyJbpmActionHandler" singleton="true"&gt;
&lt;property name="someProp" ref="anotherBean"/&gt;
...
&lt;/bean&gt;
..
&lt;/beans&gt;</pre>
<p>and jBPM process definition:</p>
<pre class="programlisting">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;process-definition name="simpleWorkflow"&gt;
&lt;start-state&gt;
&lt;transition to="myState"&gt;
&lt;/transition&gt;
&lt;/start-state&gt;
&lt;state name="myState"&gt;
&lt;transition to="end"&gt;
&lt;action name="myAction" config-type="bean"
class="org.springmodules.workflow.jbpm31.JbpmHandlerProxy"&gt;
&lt;targetBean&gt;jbpmAction&lt;/targetBean&gt;
&lt;factoryKey&gt;jbpmConfiguration&lt;/factoryKey&gt;
&lt;/action&gt;
&lt;/transition&gt;
&lt;/state&gt;
&lt;end-state name="end"/&gt;
&lt;/process-definition&gt;</pre>
<p><span class="emphasis"><em>JbpmHandlerProxy</em></span> transparently locates Spring applicationContext and searches the bean identified by the <span class="emphasis"><em>targetBean</em></span> parameter (in this case jbpmAction) and delegate all calls to the jBPM action. This way, one is not limited only to the injection offered by jBPM container and can integrate and communicate in a very easy manner with other Spring managed beans. Moreover, your action lifecycle can be sigleton (one shared instance) or prototype (every call gets a new instance) or in Spring 2.0 scoped to a certain application component (like one instance per http session).</p>
<p>The optional <span class="emphasis"><em>factoryKey</em></span> parameter specified in this example should be used when one is dealing with more then one jBPM configuration inside the same classloader (not common in practice). The <span class="emphasis"><em>factoryKey</em></span> should be the same as the bean name of the <span class="emphasis"><em>LocalJbpmConfigurationFactoryBean</em></span> to be used (in our case jbpmConfiguration).</p>
</div>
</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/185104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2008-03-10 16:16 <a href="http://www.blogjava.net/wuxufeng8080/archive/2008/03/10/185104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jbpm--springmoudle</title><link>http://www.blogjava.net/wuxufeng8080/archive/2008/02/29/182825.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 29 Feb 2008 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2008/02/29/182825.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/182825.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2008/02/29/182825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/182825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/182825.html</trackback:ping><description><![CDATA[在使用了一段时间的jbpm之后，现在因新项目，想把原来没有整合的地方，现在整合一下，这样对于事务能更好的处理。<br />
<br />
framewor ： springmvc + spring + hibernate + jbpm<br />
<br />
目的： HR的签核流程（加班、请假、教育训练等）
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/182825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2008-02-29 09:12 <a href="http://www.blogjava.net/wuxufeng8080/archive/2008/02/29/182825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM--Node Type</title><link>http://www.blogjava.net/wuxufeng8080/archive/2007/01/25/95843.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 25 Jan 2007 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2007/01/25/95843.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/95843.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2007/01/25/95843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/95843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/95843.html</trackback:ping><description><![CDATA[Nodetype task-node 
<div></div><p>A task node represents one or more tasks that are to be performed by humans. So when execution arrives in a task node, task instances will be created in the task lists of the workflow participants. After that, the node will behave as a wait state. So when the users perform their task, the task completion will trigger the resuming of the execution. In other words, that leads to a new signal being called on the token.<br />任务节点：一个或多个可以人为执行的任务。所以当执行到任务节点，任务实例将由工作流参与者的任务列表创建。之后，这个节点会表现为等待状态。当用户执行他们的任务，任务完成将会触发执行继续。还句话说，在token上会调用一个新的signal<br /><br />Nodetype state</p><div></div><p>A state is a bare-bones wait state. The difference with a task node is that no task instances will be created in any task list. This can be usefull if the process should wait for an external system. E.g. upon entry of the node (via an action on the node-enter event), a message could be sent to the external system. After that, the process will go into a wait state. When the external system send a response message, this can lead to a token.signal(), which triggers resuming of the process execution.<br /><br />Nodetype decision</p><div></div><p>Actually there are 2 ways to model a decision. The distinction between the two is based on *who* is making the decision. Should the decision made by the process (read: specified in the process definition). Or should an external entity provide the result of the decision.</p><p>When the decision is to be taken by the process, a decision node should be used. There are basically 2 ways to specify the decision criteria. Simplest is by adding condition elements on the transitions. Conditions are beanshell script expressions that return a boolean. At runtime the decision node will loop over its leaving transitions (in the order as specified in the xml), and evaluate each condition. The first transition for which the conditions resolves to 'true' will be taken. Alternatively, an implementation of the DecisionHandler can be specified. Then the decision is calculated in a java class and the selected leaving transition is returned by the decide-method of the DecisionHandler implementation.</p><p>When the decision is taken by an external party (meaning: not part of the process definition), you should use multiple transitions leaving a state or wait state node. Then the leaving transition can be provided in the external trigger that resumes execution after the wait state is finished. E.g. <tt class="literal">Token.signal(String transitionName)</tt> and <tt class="literal">TaskInstance.end(String transitionName)</tt>. <br /><br />Nodetype fork</p><div></div><p>A fork splits one path of execution into multiple concurrent paths of execution. The default fork behaviour is to create a child token for each transition that leaves the fork, creating a parent-child relation between the token that arrives in the fork.<br /><br />Nodetype join</p><div></div><p>The default join assumes that all tokens that arrive in the join are children of the same parent. This situation is created when using the fork as mentioned above and when all tokens created by a fork arrive in the same join. A join will end every token that enters the join. Then the join will examine the parent-child relation of the token that enters the join. When all sibling tokens have arrived in the join, the parent token will be propagated over the (unique!) leaving transition. When there are still sibling tokens active, the join will behave as a wait state.<br /><br />Nodetype node</p><div></div><p>The type node serves the situation where you want to write your own code in a node. The nodetype node expects one subelement action. The action is executed when the execution arrives in the node. The code you write in the actionhandler can do anything you want but it is also <a title="9.3.1. Node responsibilities" href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/userguide/en/html_single/index.html#noderesponsibilities"><font color="#002c99">responsible for propagating the execution</font></a>. </p><p>This node can be used if you want to use a JavaAPI to implement some functional logic that is important for the business analyst. By using a node, the node is visible in the graphical representation of the process. For comparison, actions --covered next-- will allow you to add code that is invisible in the graphical representation of the process, in case that logic is not important for the business analyst. </p><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/95843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-25 09:32 <a href="http://www.blogjava.net/wuxufeng8080/archive/2007/01/25/95843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM之名词解释</title><link>http://www.blogjava.net/wuxufeng8080/archive/2007/01/19/94904.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 19 Jan 2007 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2007/01/19/94904.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/94904.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2007/01/19/94904.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/94904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/94904.html</trackback:ping><description><![CDATA[
		<strong>JbpmConfiguration</strong>：configuration of one jBPM instance. <br /><strong>JbpmContext</strong>：is used to surround persistent operations to processes. <br /><strong>ProcessDefinition</strong>：<br /><strong>ProcessInstance</strong>：is one execution of a <a title="class in org.jbpm.graph.def" href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/graph/def/ProcessDefinition.html"><code><font color="#002c99">ProcessDefinition</font></code></a>. To create a new process execution of a process definition, just use the <a href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/graph/exe/ProcessInstance.html#ProcessInstance(org.jbpm.graph.def.ProcessDefinition)"><code><font color="#002c99">ProcessInstance(ProcessDefinition)</font></code></a>. <br /><strong>ContextInstance</strong>：maintains all the key-variable pairs for a process instance<br /><strong>TaskMgmtSession:<br />                                 </strong><a href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/db/TaskMgmtSession.html#findTaskInstances(java.lang.String)"><font face="Courier New" color="#002c99"><strong>findTaskInstances</strong></font></a><font face="Courier New">(java.lang.String actorId)</font> <br />                                  get the tasllist for a given actor.（根据角色得到此角色的任务列表）<br />                                 <a href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/db/TaskMgmtSession.html#loadTaskInstance(long)"><strong><font face="Courier New" color="#002c99">loadTaskInstance</font></strong></a><font face="Courier New">(long taskInstanceId)</font> <br />                                  get the task instance for a given task instance-id.（根据实例ID获得任务实例）<br /><strong>TaskInstance:   <br />                                 </strong><a href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/taskmgmt/exe/TaskInstance.html#end()"><font face="Courier New" color="#002c99"><strong>end</strong></font></a><font face="Courier New">()</font> marks this task as done.<br />                                 <a href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/taskmgmt/exe/TaskInstance.html#end(java.lang.String)"><strong><font face="Courier New" color="#002c99">end</font></strong></a><font face="Courier New">(java.lang.String transitionName)</font> <br />                                  marks this task as done and specifies the name of a transition leaving the task-node for the case that the completion of this task instances triggers a signal on the token.<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/94904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-19 12:47 <a href="http://www.blogjava.net/wuxufeng8080/archive/2007/01/19/94904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM之Custom node behaviour</title><link>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94623.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 18 Jan 2007 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94623.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/94623.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/94623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/94623.html</trackback:ping><description><![CDATA[在流程中会涉及到很多的分支结构，下面就用代码说明<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_51_565_Open_Image" onclick="this.style.display='none'; Codehighlighter1_51_565_Open_Text.style.display='none'; Codehighlighter1_51_565_Closed_Image.style.display='inline'; Codehighlighter1_51_565_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_51_565_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_565_Closed_Text.style.display='none'; Codehighlighter1_51_565_Open_Image.style.display='inline'; Codehighlighter1_51_565_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> AmountUpdate </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> ActionHandler </span><span id="Codehighlighter1_51_565_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_51_565_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_114_563_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_563_Open_Text.style.display='none'; Codehighlighter1_114_563_Closed_Image.style.display='inline'; Codehighlighter1_114_563_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_114_563_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_563_Closed_Text.style.display='none'; Codehighlighter1_114_563_Open_Image.style.display='inline'; Codehighlighter1_114_563_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> execute(ExecutionContext ctx) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_114_563_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_114_563_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> business logic</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    Float erpAmount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <img src="http://www.blogjava.net/images/dot.gif" />get amount from erp</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">system<img src="http://www.blogjava.net/images/dot.gif" />;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Float processAmount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Float) ctx.getContextInstance().getVariable(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">amount</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> erpAmount.floatValue() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> processAmount.floatValue();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" />update erp</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">system with the result<img src="http://www.blogjava.net/images/dot.gif" />;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> graph execution propagation</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_456_503_Open_Image" onclick="this.style.display='none'; Codehighlighter1_456_503_Open_Text.style.display='none'; Codehighlighter1_456_503_Closed_Image.style.display='inline'; Codehighlighter1_456_503_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_456_503_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_456_503_Closed_Text.style.display='none'; Codehighlighter1_456_503_Open_Image.style.display='inline'; Codehighlighter1_456_503_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (result </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_456_503_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_456_503_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      ctx.leaveNode(ctx, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">big amounts</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img id="Codehighlighter1_510_559_Open_Image" onclick="this.style.display='none'; Codehighlighter1_510_559_Open_Text.style.display='none'; Codehighlighter1_510_559_Closed_Image.style.display='inline'; Codehighlighter1_510_559_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_510_559_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_510_559_Closed_Text.style.display='none'; Codehighlighter1_510_559_Open_Image.style.display='inline'; Codehighlighter1_510_559_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_510_559_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_510_559_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      ctx.leaveNode(ctx, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">small amounts</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><a href="file:///E:/IVO/Library/jbpm-starters-kit-3.1.2/jbpm/doc/javadoc.jbpm/org/jbpm/graph/exe/ExecutionContext.html#leaveNode(java.lang.String)"><strong><font face="Courier New">leaveNode</font></strong></a><font face="Courier New">(java.lang.String transitionName)</font><br />          leave this node over the given transition.<br />通过ctx的 leaveNode方法，来确定下一个node，这样就可以通过代码动态控制流程。<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/94623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-18 14:18 <a href="http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM之swimlane </title><link>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94602.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 18 Jan 2007 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94602.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/94602.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/94602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/94602.html</trackback:ping><description><![CDATA[
		<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
				<h2> </h2>
		</div>
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<p>swimlane一般是为了task准备的，任务总是要分配到某个人头上的。如果在流程定义文件中任务没有指定对应的泳道如：<task name="bank" />，那么就需要在程序代码中分配相关的处理人taskInstance.setActorId("jeffen")。如果程序都是这样来搞那其实是很麻烦的，而且分配代码分散到各个地方，很容易出错。于是引进了泳道，我们可以在流程定义文件中统一指定swimlane和处理人的关系、task和swimlane的关系，只需要维护这一个文件就好了，（有点像struts的配置文件）如下：</p>
												<div>
														<div>
																<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
																<span>&lt;</span>
																<span>swimlane name</span>
																<span>=</span>
																<span>"</span>
																<span>banker</span>
																<span>"</span>
																<span>&gt;</span>
																<span>
																		<br />
																		<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />        </span>
																<span>&lt;</span>
																<span>assignment expression</span>
																<span>=</span>
																<span>"</span>
																<span>user(jeffen)</span>
																<span>"</span>
																<span>/&gt;</span>
																<span>
																		<br />
																		<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
																</span>
																<span>&lt;/</span>
																<span>swimlane</span>
																<span>&gt;</span>
																<span>
																		<br />
																		<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />......<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
																<span>&lt;</span>
																<span>task name</span>
																<span>=</span>
																<span>"</span>
																<span>bank</span>
																<span>"</span>
																<span>  swimlane</span>
																<span>=</span>
																<span>"</span>
																<span>banker</span>
																<span>"</span>
																<span>&gt;</span>
														</div>
												</div>
												<p>这样就将任务实例和处理人松耦合了，对于多任务对应相同的处理人，这种方式的好处显而易见。</p>
												<p>当然还可以在程序中动态指定处理人，如上taskInstance.setActorId("jeffen")，也可以通过泳道实例swimlaneInstance.setActorId("jeffen")指定。</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/94602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-18 11:56 <a href="http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM之JbpmContext</title><link>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94598.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 18 Jan 2007 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94598.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/94598.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/94598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/94598.html</trackback:ping><description><![CDATA[
		<p>The three most common persistence operations are: </p>
		<div class="itemizedlist">
				<ul type="disc">
						<li>Deploying a process 
</li>
						<li>Starting a new execution of a process 
</li>
						<li>Continuing an execution </li>
				</ul>
		</div>
		<p>
		</p>
		<p>First deploying a process definition. Typically, this will be done directly from the graphical process designer or from the deployprocess ant task. But here you can see how this is done programmatically: </p>
		<pre class="programlisting">JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  ProcessDefinition processDefinition = ...;
  jbpmContext.deployProcessDefinition(processDefinition);
} finally {
  jbpmContext.close();
}</pre>
		<p>For the creation of a new process execution, we need to specify of which process definition this execution will be an instance. The most common way to specify this is to refer to the name of the process and let jBPM find the latest version of that process in the database: </p>
		<pre class="programlisting">JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  String processName = ...;
  ProcessInstance processInstance = 
      jbpmContext.newProcessInstance(processName);
} finally {
  jbpmContext.close();
}</pre>
		<p>For continuing a process execution, we need to fetch the process instance, the token or the taskInstance from the database, invoke some methods on the POJO jBPM objects and afterwards save the updates made to the processInstance into the database again. </p>
		<pre class="programlisting">JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  long processInstanceId = ...;
  ProcessInstance processInstance = 
      jbpmContext.loadProcessInstance(processInstanceId);
  processInstance.signal();
  jbpmContext.save(processInstance);
} finally {
  jbpmContext.close();
}</pre>
		<p>Note that if you use the xxx<span class="bold"><b>ForUpdate</b></span> methods in the JbpmContext, an explicit invocation of the jbpmContext.save is not necessary any more because it will then occur automatically during the close of the jbpmContext. E.g. suppose we want to inform jBPM about a taskInstance that has been completed. Note that task instance completion can trigger execution to continue so the processInstance related to the taskInstance must be saved. The most convenient way to do this is to use the loadTaskInstanceForUpdate method: </p>
		<pre class="programlisting">JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  long taskInstanceId = ...;
  TaskInstance taskInstance = 
      jbpmContext.loadTaskInstanceForUpdate(taskInstanceId);
  taskInstance.end();
} finally {
  jbpmContext.close();
}</pre>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/94598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-18 11:39 <a href="http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM之hello world</title><link>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94586.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 18 Jan 2007 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94586.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/94586.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/94586.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/94586.html</trackback:ping><description><![CDATA[参考<br /><a href="/chengang/archive/2006/07/13/57986.html">http://www.blogjava.net/chengang/archive/2006/07/13/57986.html</a><br /><br />下面是根据官方开发向导及自己的经验写的<br /><br />开发向导上提供的helloworld例子，这个流程是单向的，没有任何的分支，且没有自定义actionHandler，使用的是默认的handler<br /><pre class="programlisting">public void testHelloWorldProcess() {
  <span class="bold"><b>// This method shows a process definition and one execution</b></span><span class="bold"><b>// of the process definition.  The process definition has </b></span><span class="bold"><b>// 3 nodes: an unnamed start-state, a state 's' and an </b></span><span class="bold"><b>// end-state named 'end'.</b></span><span class="bold"><b>// The next line parses a piece of xml text into a</b></span><span class="bold"><b>// ProcessDefinition.  A ProcessDefinition is the formal </b></span><span class="bold"><b>// description of a process represented as a java object.</b></span>
  ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
    "<span class="bold"><b>&lt;process-definition&gt;</b></span>" +
    "<span class="bold"><b>  &lt;start-state&gt;</b></span>" +
    "<span class="bold"><b>    &lt;transition to='s' /&gt;</b></span>" +
    "<span class="bold"><b>  &lt;/start-state&gt;</b></span>" +
    "<span class="bold"><b>  &lt;state name='s'&gt;</b></span>" +
    "<span class="bold"><b>    &lt;transition to='end' /&gt;</b></span>" +
    "<span class="bold"><b>  &lt;/state&gt;</b></span>" +
    "<span class="bold"><b>  &lt;end-state name='end' /&gt;</b></span>" +
    "<span class="bold"><b>&lt;/process-definition&gt;</b></span>"
  );
  
  <span class="bold"><b>// The next line creates one execution of the process definition.</b></span><span class="bold"><b>// After construction, the process execution has one main path</b></span><span class="bold"><b>// of execution (=the root token) that is positioned in the</b></span><span class="bold"><b>// start-state.</b></span>
  ProcessInstance processInstance = 
      new ProcessInstance(processDefinition);
  
  <span class="bold"><b>// After construction, the process execution has one main path</b></span><span class="bold"><b>// of execution (=the root token).</b></span>
  Token token = processInstance.getRootToken();
  
  <span class="bold"><b>// Also after construction, the main path of execution is positioned</b></span><span class="bold"><b>// in the start-state of the process definition.</b></span>
  assertSame(processDefinition.getStartState(), token.getNode());
  
  <span class="bold"><b>// Let's start the process execution, leaving the start-state </b></span><span class="bold"><b>// over its default transition.</b></span>
  token.signal();
  <span class="bold"><b>// The signal method will block until the process execution </b></span><span class="bold"><b>// enters a wait state.</b></span><span class="bold"><b>// The process execution will have entered the first wait state</b></span><span class="bold"><b>// in state 's'. So the main path of execution is now </b></span><span class="bold"><b>// positioned in state 's'</b></span>
  assertSame(processDefinition.getNode("s"), token.getNode());

  <span class="bold"><b>// Let's send another signal.  This will resume execution by </b></span><span class="bold"><b>// leaving the state 's' over its default transition.</b></span>
  token.signal();
  <span class="bold"><b>// Now the signal method returned because the process instance </b></span><span class="bold"><b>// has arrived in the end-state.</b></span>
  
  assertSame(processDefinition.getNode("end"), token.getNode());
}<br /><br />更详细的例子可以看参考，里面有很详细的操作说明。<br /><br /><br /><br /><br />下面是根据参考例子测试时出现的一些问题及说明。<br />一、关于数据库，首先要修改数据库连接，然后创建数据库，里面的表格jBPM提供相应的API去创建。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 99.9%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 306px; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_71_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_743_Open_Text.style.display='none'; Codehighlighter1_71_743_Closed_Image.style.display='inline'; Codehighlighter1_71_743_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_71_743_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_743_Closed_Text.style.display='none'; Codehighlighter1_71_743_Open_Image.style.display='inline'; Codehighlighter1_71_743_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> testDeployProcessDefinition() </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> FileNotFoundException </span><span id="Codehighlighter1_71_743_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_71_743_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从 jbpm.cfg.xml 取得 jbpm 的配置 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        JbpmConfiguration config </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> JbpmConfiguration.getInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        config.dropSchema();//删除数据表结构<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        config.createSchema();//创建数据表结构<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建一个 jbpm 容器 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        JbpmContext jbpmContext </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> config.createJbpmContext(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 由 processdefinition.xml 生成相对应的流程定义类 ProcessDefinition </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        InputStream is </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileInputStream(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">processes/simple/processdefinition.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ProcessDefinition processDefinition </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ProcessDefinition.parseXmlInputStream(is); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 利用容器的方法将流程定义数据部署到数据库上 </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        jbpmContext.deployProcessDefinition(processDefinition); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 关闭 jbpmContext </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        jbpmContext.close(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div><br />这个是根据流程配置文件最后生成的数据库信息的测试方法，刚开始我还有一个疑问，数据库和数据表是系统自动创建还<br />是要手动创建，数据库是要手动创建的，数据表可以自动创建的<br /><br /><br /><br /></pre><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/94586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-01-18 10:55 <a href="http://www.blogjava.net/wuxufeng8080/archive/2007/01/18/94586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>