<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>white182517</title>
    <description>在一个不再需要个人英雄主义的年代，程序员应该不再是苦行僧。

尊崇团队协作，关注软件工程化，快乐享受生活，这就是我的程序人生！

</description>
    <link>http://flytogether.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>假如你突然病了或者失业了，你会怎么办？</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/120283" style="color:red;">http://flytogether.javaeye.com/blog/120283</a>&nbsp;
          发表时间: 2007年09月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天突然接到前同事兼下属的电话，有点意外，也有一些感慨。个人觉得，在程序员这个群体，很多人对技术的关注远胜于对生活，健康和未来规划的关注。谨记下这段感想，希望所有的程序员朋友，努力工作之余，能照顾好自己的身体，炒股买房买基之余，也别忘记检查一下自己的保险是否足够。（虽然个人也觉得保险不一定能有多少用处，但是对于保障来讲，你最好别用上，这也就是他的意义所在了）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 他是82年的，做了两年程序员，才离开一家超恶心的公司（也是我的上上家），找了一份新工作，薪水待遇都不错，职位是Team Leader，更可喜的是在新公司不久就遇到了自己心仪的人。正在他准备大展拳脚的时候，体检发现可能肝脏出了问题，要么休息，要么得住院，这就意味着新工作肯定是泡汤了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个小孩是农村的，工作两年，省吃俭用争的点钱都供给两个弟弟上学和还自己大学借的贷款了，为了换工作才买了台电脑，手上几乎没什么钱了，医保也因为工作交接给停了，估计也指望不上。当初我提议他这个年纪上些住院方面的医保和大病保险比较划算（因为他比较胖，个人感觉潜在的危险会多一些），他不以为然，总觉得自己年轻，不可能那么倒霉，如果当初有上商保，这次的医疗费用应该会少很多，到现在想上也存在诈保和拒保的两难选择了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前一段时间，一个高中同学也是体检发现心脏有些异样，才急匆匆地问我保险的事，然后就开始戒烟。人通常都在风险来临的时候或者非得亲历痛苦的时候才会悔不当初呢？ 人生就像做项目一样，风险无处不在，特别是我们程序员，往往是透支健康来获取今天的财富，却不知道有可能你花一辈子的积蓄可能因为一次的意外而付之东流。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我们辛苦奔波，当我们每天面对电脑8小时以上，当我们每天抽一包烟，当我们把大部分钱都放在银行里吃利息的时候，你是否有考虑过这些风险并设计对策呢？</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/120283#comments" style="color:red;">已有 <strong>10</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Sep 2007 16:31:28 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/120283</link>
        <guid>http://flytogether.javaeye.com/blog/120283</guid>
      </item>
      <item>
        <title>Fedora 7.0 安装中文输入法</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/111454" style="color:red;">http://flytogether.javaeye.com/blog/111454</a>&nbsp;
          发表时间: 2007年08月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">参考资料</font></h3>
<p><a href="http://www.fcitx.org/main/?q=node/32">www.fcitx.org/main/</a></p>
<p><a href="http://www.fcitx.org/main/?q=node/79">www.fcitx.org/main/</a></p>
<h3><font color="#ff0000">下载</font></h3>
<p>从<a href="http://www.fcitx.org ">www.fcitx.org </a>下载RPM 包：fcitx-3.2.050827-fc4.noarch.rpm</p>
<h3><font color="#ff0000">安装</font></h3>
<p>执行如下命令:rpm -ivh fcitx-3.2.050827-fc4.noarch.rpm</p>
<h3><font color="#ff0000">配置</font></h3>
<p>在/etc/X11/xinit/xinput.d/ 目录中创建文件fcitx,包含如下内容：</p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py">
    <li class="alt"><span><span>XIM=fcitx &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>XIM_PROGRAM=fcitx &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>GTK_IM_MODULE=fcitx &nbsp;&nbsp;</span> </li>
    <li class=""><span>gnome-im-settings-daemon&nbsp;&gt;/dev/null&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>fcitx只能在X系统中使用，在启动fcitx之前必须关闭其他输入法，然后在命令终端输入如下命令启动：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>fcitx&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>如果启动失败，需要在当前用户的主目录，设置环境变量，更改.bashrc文件，添加如下几行代码：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>export&nbsp;XMODIFIERS=</span><span class="string">&quot;@im=fcitx&quot;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>export&nbsp;XIM=fcitx &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>export&nbsp;XIM_PROGRAM=fcitx &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>如果启动成功，输入法初始是没有激活的，需要按CTRL+空格键激活。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/111454#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Aug 2007 17:16:04 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/111454</link>
        <guid>http://flytogether.javaeye.com/blog/111454</guid>
      </item>
      <item>
        <title>开发规范</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/102849" style="color:red;">http://flytogether.javaeye.com/blog/102849</a>&nbsp;
          发表时间: 2007年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Javascript代码规范：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://javascript.crockford.com/code.html">Code Conventions for the JavaScript Programming Language </a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://manual.dojotoolkit.org/Book111">Dojo的代码规范</a></p>
<p><a href="http://manual.dojotoolkit.org/Book111"></a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/102849#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jul 2007 16:21:35 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/102849</link>
        <guid>http://flytogether.javaeye.com/blog/102849</guid>
      </item>
      <item>
        <title>了解SOAP规范</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/75460" style="color:red;">http://flytogether.javaeye.com/blog/75460</a>&nbsp;
          发表时间: 2007年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">样式/编码</font></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参考资料：<a href="http://www-128.ibm.com/developerworks/webservices/library/ws-whichwsdl/">www-128.ibm.com/developerworks/webservices/library/ws-whichwsdl/</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP提供rpc和document两种样式，encoded和literal两种编码，这就组成了四种模式，还有一种document/literal wrapped模式不是规范定义的，但是得到最广泛的应用这不是规范定义的。</p>
<h4>优缺点比较</h4>
<h5><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RPC/encoded</font></h5>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优点：</strong>操作名称包含在消息中，接受者很容易基于此进行处理。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：</strong>消息中包含类型信息，增加了消息负载。无法对消息进行验证。不是WS-I兼容的。</p>
<h5><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RPC/literal</font></h5>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优点：</strong>操作名称包含在消息中，接受者很容易基于此进行处理。不包含类型信息。WS-I兼容。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：</strong>无法对消息进行验证。</p>
<h5><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document/encoded</font></h5>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 几乎不使用此模式。</p>
<h5><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document/literal</font></h5>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优点：</strong>可以使用SCHEMA对消息进行验证，不包含类型信息。WS-I兼容（有限制）。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：</strong>消息中不包含操作名称。WSDL相对复杂。虽然WS-I兼容，但是SOAP体内容只能包含一个子元素，这会限制此模式的使用。</p>
<h5><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document/literal wrapped</font></h5>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优点：</strong>可以使用SCHEMA对消息进行验证，不包含类型信息。WS-I兼容,消息中包含操作名称。</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：</strong>WSDL更加复杂。</p>
<h4>适用场景</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document/literal wrapped模式是最常用的模式，但是如果同一个WSDL中需要定义两个重载操作，因为XML中不允许两个同名的元素，这种时候可以使用Document/literal。如果有两个参数相同，操作名称不同的操作，这时候用RPC/literal模式才能够区别开来。</p>
<h3><font color="#ff0000">二进制附件</font></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参考资料：<a href="http://www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp?cv_doc_id=158614"><font face="Arial">&nbsp;</font>www.ibm.com/developerworks/cn/views/webservices/tutorials.jsp</a></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常有两种方式处理二进制附件，一种是将二进制流经过Base64编码后嵌入到XML文档中，一种是在XML文档中引用该数据，一个较为常见的例子是XHMTL文件中使用img标记引用图片。前一种方式会通常会增加XML文档的尺寸。</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP with Attachments 规范规定二进制数据可以作为多部分 MIME 文档的的一部分发送，由 XML 数据组成第一部分，而二进制数据作为附加部分添加到其中。但是这种方式的问题在于，尽管您的程序可能知道数据存在，但文档并不知道这一点。同时，还不允许对文档进行选择性优化或对包含二进制数据的现有文档进行回溯处理。</p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近W3C制定了XOP（XML-binary Optimized Packages，XOP）协议来解决二进制问题，<font face="Arial">XOP 提供一个机制，可选择性地提取要优化的信息，将其添加到多部分 MIME 消息中（其中也包括您的 SOAP 消息）并显式地对其进行引用。</font></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用 XOP 的过程称为 MTOM（SOAP 消息传输优化机制&mdash;&mdash;Message Transmission Optimization Mechanism）。</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/75460#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Apr 2007 12:17:13 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/75460</link>
        <guid>http://flytogether.javaeye.com/blog/75460</guid>
      </item>
      <item>
        <title>REST样式的WEB服务</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/75126" style="color:red;">http://flytogether.javaeye.com/blog/75126</a>&nbsp;
          发表时间: 2007年04月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">参考资料</font></h3>
<p><font face="Arial"><a href="http://www.xfront.com/REST-Web-Services.html">Building Web Services the REST Way</a></font></p>
<p><font face="Arial"><a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-restvsoap/">面向资源与面向活动的 Web 服务</a></font></p>
<p><font face="Arial"><a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">Architectural Styles and the Design of Network-based Software Architectures</a></font></p>
<p><a href="http://www.javaeye.com/topic/70113">www.javaeye.com/topic/70113</a></p>
<h3><font color="#ff0000">摘要</font></h3>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看了以上关于REST的资料，还是不太理解REST是个什么东东。个人觉得REST主要是一种设计的理念，架构的样式，类似于模式的东西。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其本质是借助于HTTP协议处理基于资源访问的业务需求，主要适用的场合是针对某种类型数据的CRUD操作，通过URL来标识用户需要请求的资源。</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而基于WSDL/SOAP的WEB服务是通过规范确定了如何描述用户的请求和响应格式。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<h3><font color="#ff0000">REST主要特性</font></h3>
<font face="Arial">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Client-Server:基于拉式的交互方式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无状态: 每个请求必须包含所有必须的信息，不能利用任何服务器保存的上下文信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓存：为提高网络传输效率，响应必须能够标识为可缓存和不可缓存的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统一接口：基于一个统一的接口访问所有的资源如：HTTP GET,POST,PUT,DELETE。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命名的资源集：系统由使用URL命名的资源集组成。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分层模式：客户端和要访问的资源之间可以插入任何中间媒介，如代理服务器，缓存服务器，网关。</p>
</font>
<h3><font color="#ff0000">设计原则</font></h3>
<font face="Arial">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先标识所有需要暴露为服务的概念实体。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 针对每一个资源创建一个URL，这些资源应该是名词而不是动词。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据客户端是否仅接受资源还是需要创建，更改资源进行分类。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有使用HTTP GET访问的资源，都不应该导致更改资源。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在资源的表示中包含超链接来访问其他相关资源的信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设计数据粒度，不要在单个响应文档中返回所有信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用XML SCHEMA,DTD等指定响应数据的格式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用WSDL或HTML文档描述应该如何使用你的服务。</p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/75126#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Apr 2007 16:52:09 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/75126</link>
        <guid>http://flytogether.javaeye.com/blog/75126</guid>
      </item>
      <item>
        <title>SOAP 1.2新特性</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/74652" style="color:red;">http://flytogether.javaeye.com/blog/74652</a>&nbsp;
          发表时间: 2007年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出处：<a href="http://www.idealliance.org/papers/xmle02/dx_xmle02/papers/02-02-02/02-02-02.html#http">www.idealliance.org/papers/xmle02/dx_xmle02/papers/02-02-02/02-02-02.html#http</a></p>
<h3><font color="#ff0000">摘要</font></h3>
<p>SOAP 1.2发生的主要变化包括：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial"><font face="Arial">SOAP 1.1基于XML 1.0，SOAP 1.2基于XML Infoset。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP 1.1和SOAP 1.2基于消息信封和编码模型的XML命名空间发生了改变。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信封结构发生了一些变化。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP 1.1提供一个HTTP绑定框架，而SOAP 1.2提供一个抽象的绑定框架，同时提供了一个具体的HTTP绑定和一个非正式的邮件绑定。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP 1.2简化了SOAP 1.1的处理模型。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP 1.2简化了SOAP 1.1的编码模型。</font></font></p>
<h3><font color="#ff0000">体会</font></h3>
<p><font face="Arial"></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本来想研读一下关于SOA相关规范，希望通过规范了解这些规范用来解决哪些问题的，主要提供哪些功能。但是这些规范全英文，晦涩难懂，看来是极难继续了。网上相关的中文资料也少得可怜。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就用得最广泛的WSDL和SOAP规范的中文资料都相当少，可能大部分人只知道如何通过工具开发WEB SERVICE服务吧。问了一下公司几个同事，几乎没几个知道这些协议的基本信息，都没听过编码样式,绑定协议。。。。。 </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/74652#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Apr 2007 14:58:01 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/74652</link>
        <guid>http://flytogether.javaeye.com/blog/74652</guid>
      </item>
      <item>
        <title>WSDL 2.0新特性</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/73927" style="color:red;">http://flytogether.javaeye.com/blog/73927</a>&nbsp;
          发表时间: 2007年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出处：<a href="http://www.xml.com/pub/a/ws/2004/05/19/wsdl2.html?page=1">www.xml.com/pub/a/ws/2004/05/19/wsdl2.html</a></p>
<h3><font color="#ff0000">摘要</font></h3>
<p><font face="Arial">WSDL1.1到WSDL1.2的主要特性改变包括：</font></p>
<ol>
    <li><font face="Arial">WSDL2.0中targetNamespace属性是definitions元素的必要属性。</font> </li>
    <li>移除了消息构建部分，改而使用XML模式定义系统在types元素中指定。 </li>
    <li>不再支持操作重载。 </li>
    <li>PortTypes重命名为接口，通过interface元素的extends属性支持接口继承。 </li>
    <li>Ports重命名为endpoints。 </li>
</ol>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSDL2.0通过两个级别来描述WEB服务，抽象级别WSDL使用接受和发送的消息来描述一个WEB服务，消息通常使用XML SCHEMA类型系统来描述，另外消息交换模式定义了消息的序列和多重性。一个接口以独立于传输协议和交换格式的方式将这些操作组织起来。</font></p>
<p><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font>具体级别中，使用绑定指定接口的传输协议和交换格式，服务端点将绑定和服务网络地址进行关联，而服务将针对一个接口相关的服务端点组织起来。</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/73927#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Apr 2007 15:52:58 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/73927</link>
        <guid>http://flytogether.javaeye.com/blog/73927</guid>
      </item>
      <item>
        <title>初识Lucene</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/72398" style="color:red;">http://flytogether.javaeye.com/blog/72398</a>&nbsp;
          发表时间: 2007年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">前言</font></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前处于工作交接阶段，比较清闲，花了几天时间看了Lucene，了解一下这个老总一直说要用之来解决项目中的问题的东东。Lucene的原理相对简单，有几篇文章很好地进行了介绍，见参考资料，这里只是按自己的理解整理一下。Lucene In Action对具体的细节有比较深入的介绍，遗憾的是该书是针对1.x版本的，新版本有很多变化，不过不影响对其原理的理解。&nbsp;</p>
<p><a href="http://www.ibm.com/developerworks/cn/java/wa-lucene/"></a></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要想从海量数据中快速地查找需要的信息，比如用户想要通过Amazon查找需要的图书，最有效的方式就是建立索引，然后基于这些索引就可以快速的定位信息。&nbsp;&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene是一个开源的组件包，具体的应用可以基于这个组件包提供索引构建和信息搜索功能。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用Lucene主要包含两个步骤，一是构建索引，二是基于索引进行搜索。这两个步骤通常是两个分离的进程，最常用的作法是后台构建索引，前台提供搜索支持。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene的索引构建是基于文本文件的，如果要针对其他数据源，如数据库记录进行索引，必须进行一些预处理，Lucene本身提供对PDF,WORD等文件类型的解析器。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构建索引的过程有一个比较关键的步骤是分词技术，Lucene发布包不提供对中文分词的支持，不过目前处于SandBox阶段有一个中文分词实现。如果要提高搜索的性能和质量，必须针对特定的应用实现自己的分词器。</p>
<h3><font color="#ff0000">实践</font></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 写了一个简单的示例，试用了一下Lucene，基于lucene2.1.0版本，需要下载该版本的jar文件，包含在类路径即可，因为要测试中文检索，所以还需要从lucene官网下载中文的分词包。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例基于这样一个场景，要能很方便的根据名称查找我机器上的MP3文件，必须支持模糊查询，为了方便测试，我准备了四个mp3文件，分别是<font face="Arial">堕落天使.mp3，没你的日子.mp3，如果你还爱我.mp3，天堂.mp3。</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mp3Searcher类主要包含两个方法，buildIndex主要用来基于上述MP3文件构建索引，目前这些索引保存在RAMDirectory中，这是一个基于内存的索引存储，运行完毕不会持久化。search方法接受一个查询字符串，返回查找结果。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Mp3Searcher &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;DATA_DIR&nbsp;=&nbsp;</span><span class="string">&quot;E:\\temp\\mp3&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(Mp3Searcher.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;RAMDirectory&nbsp;directory&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;ChineseAnalyzer&nbsp;analyzer&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Mp3Searcher() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;RAMDirectory(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;analyzer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ChineseAnalyzer(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;查询指定歌名的结果 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;ParseException&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Hits&nbsp;search(&nbsp;String&nbsp;name)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ParseException &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexSearcher(directory); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryParser&nbsp;parser&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;QueryParser(</span><span class="string">&quot;name&quot;</span><span>,analyzer); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;searcher.search(parser.parse(name)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;构建索引 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;buildIndex(&nbsp;String&nbsp;dataDir)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;遍历所有的mp3文件，添加到索引文件中 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&nbsp;files&nbsp;=&nbsp;FileUtils.listFiles(</span><span class="keyword">new</span><span>&nbsp;File(DATA_DIR), &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{&nbsp;</span><span class="string">&quot;mp3&quot;</span><span>&nbsp;},&nbsp;</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(files&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;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;iterator&nbsp;=&nbsp;files.iterator(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&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;File&nbsp;file&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(iterator.hasNext()) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;(File)&nbsp;iterator.next(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Document(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(</span><span class="keyword">new</span><span>&nbsp;Field(</span><span class="string">&quot;name&quot;</span><span>,&nbsp;FilenameUtils.getBaseName(file &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getAbsolutePath()),&nbsp;Field.Store.YES, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field.Index.TOKENIZED)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(doc); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">&quot;index&nbsp;file&nbsp;&quot;</span><span>&nbsp;+&nbsp;file.getName()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.optimize(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>测试用例如下：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Mp3SearcherTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;TestCase &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Mp3Searcher&nbsp;searcher&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Mp3Searcher(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setUp()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcher.buildIndex(Mp3Searcher.DATA_DIR); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testSearch()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;results&nbsp;=&nbsp;searcher.search(</span><span class="string">&quot;没你的日子&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="number">1</span><span>,results.length()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;results.doc(</span><span class="number">0</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="string">&quot;没你的日子&quot;</span><span>,doc.getField(</span><span class="string">&quot;name&quot;</span><span>).stringValue()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results&nbsp;=&nbsp;searcher.search(</span><span class="string">&quot;天&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="number">2</span><span>,results.length()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;=&nbsp;results.doc(</span><span class="number">0</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertNotNull(doc);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<h3><font color="#ff0000">总结</font></h3>
<p>Lucene提供一个非常简单易用的API，可以很容易的基于其构建搜索引用，同时也提供很好的扩展。要构建一个成熟的产品级应用，还需要做很多工作，主要包括如何实现针对特定领域的分词技术来提高索引的质量，索引的大小。</p>
<h5><font color="#0000ff">如何基于数据库进行索引</font></h5>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很多应用的数据都是存储在数据库中的，比如china-pub的所有的书籍目录，CMS中的客户资料。如何针对这些数据来源构建搜索应用呢？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以建一个后台进程，在闲时构建增量索引，比如每天晚上12点。这种方式不能保证实时查询到最新录入的数据，搜索会有一定的延迟，但是大多数这种应用都能接受这种延迟。如果要在每次增加新的数据时构建索引，会极大的影响应用的性能。</p>
<h3><font color="#ff0000">参考资料</font></h3>
<p><a href="http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/">www.ibm.com/developerworks/cn/java/j-lo-lucene1/</a></p>
<p><a href="http://www.ibm.com/developerworks/cn/java/wa-lucene/">www.ibm.com/developerworks/cn/java/wa-lucene/</a></p>
<p><a href="http://www.javaeye.com/topic/70305">www.javaeye.com/topic/70305</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/72398#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Apr 2007 10:50:48 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/72398</link>
        <guid>http://flytogether.javaeye.com/blog/72398</guid>
      </item>
      <item>
        <title>试用JBoss Rules</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/70652" style="color:red;">http://flytogether.javaeye.com/blog/70652</a>&nbsp;
          发表时间: 2007年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">前言</font></h3>
<p>这两天研究了一下JBoss Rules，最大的感觉是JBoss Rules的文档写得不错，而且Eclipse IDE插件的功能也挺不错，相比JBoss JBPM好多了。</p>
<p>个人觉得规则引擎就是把一堆if/else逻辑从业务代码转移到配置文件中，这样如果业务规则发生变化就不用更改代码，而且如果描述这种规则的语言足够清晰明白，更改业务规则的任务就可以由业务人员来完成了，Domain Specific Language就是来干这事的。</p>
<p>JBoss Rules的内部机制，这里就不再详细介绍了，已经有先行者对JBoss Rules的参考手册进行了整理，参见<a href="http://www.blogjava.net/guangnian0412/category/11762.html">www.blogjava.net/guangnian0412/category/11762.html</a>。</p>
<p>我针对一个实际的业务场景写了一个例子，应用场景是这样的，一个汽车网的销售人员的提成有一定的规则，大致的规则根据售出价格的折扣来决定提成比例，比如如果10000元的广告服务，最后售出价格是4500，销售人员的提成是0.3%。</p>
<h3><font color="#ff0000">创建工程</font></h3>
<p>假定已经安装了Eclipse JBoss Rules插件，新建一个Rules工程。</p>
<h3><font color="#ff0000">创建规则文件</font></h3>
<p>创建一个规则文件如下：</p>
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-rb">
    <li class="alt"><span><span class="comment">#描述如何计算销售人员提成比例的规则&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>package&nbsp;org.gaofubing.commision &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;org.gaofubing.discount.CommisionComputer; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">#折扣小于5折 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>rule&nbsp;</span><span class="string">&quot;lessThanFive&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:CommisionComputer(discount&nbsp;&lt;&nbsp;5) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(0.03);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">#折扣等于5折 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>rule&nbsp;</span><span class="string">&quot;equalsFive&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:CommisionComputer(discount&nbsp;==&nbsp;5) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(0.1);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">#折扣大于5折小于等于6折 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>rule&nbsp;</span><span class="string">&quot;betweenFiveAndSix&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:&nbsp;&nbsp;CommisionComputer(discount</span><span class="symbol">:discount</span><span>,discount&nbsp;&gt;&nbsp;5,discount&nbsp;&lt;=&nbsp;6) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(((discount.doubleValue()&nbsp;-5)&nbsp;*&nbsp;0.5&nbsp;+&nbsp;6&nbsp;*&nbsp;0.1&nbsp;)&nbsp;/&nbsp;discount.doubleValue());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">#折扣大于6折小于等于7折 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>rule&nbsp;</span><span class="string">&quot;betweenSixAndSeven&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:&nbsp;CommisionComputer(discount</span><span class="symbol">:discount</span><span>,discount&nbsp;&gt;&nbsp;6,discount&nbsp;&lt;=&nbsp;7) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(((discount.doubleValue()&nbsp;-6)&nbsp;*&nbsp;0.6&nbsp;+&nbsp;(6&nbsp;-&nbsp;5)&nbsp;*&nbsp;0.5&nbsp;+&nbsp;5&nbsp;*&nbsp;0.1&nbsp;)&nbsp;/&nbsp;discount.doubleValue());&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">#折扣大于7折小于等于8折 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>rule&nbsp;</span><span class="string">&quot;betweenSevenAndEight&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:CommisionComputer(discount</span><span class="symbol">:discount</span><span>,discount&nbsp;&gt;&nbsp;7,discount&nbsp;&lt;=&nbsp;8) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(((discount.doubleValue()&nbsp;-7)&nbsp;*&nbsp;0.65&nbsp;+&nbsp;(7-6)&nbsp;*&nbsp;0.6&nbsp;+&nbsp;(6&nbsp;-&nbsp;5)&nbsp;*&nbsp;0.5&nbsp;+&nbsp;5&nbsp;*&nbsp;0.1&nbsp;)&nbsp;/&nbsp;discount.doubleValue());&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">#折扣大于8折小于等于9折 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>rule&nbsp;</span><span class="string">&quot;betweenEightAndNine&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:CommisionComputer(discount</span><span class="symbol">:discount</span><span>,discount&nbsp;&gt;&nbsp;8,discount&nbsp;&lt;=&nbsp;9) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(((discount.doubleValue()&nbsp;-8)&nbsp;*&nbsp;0.7&nbsp;+&nbsp;(8-7)&nbsp;*&nbsp;0.65&nbsp;+&nbsp;(7-6)&nbsp;*&nbsp;0.6&nbsp;+&nbsp;(6&nbsp;-&nbsp;5)&nbsp;*&nbsp;0.5&nbsp;+&nbsp;5&nbsp;*&nbsp;0.1&nbsp;)&nbsp;/&nbsp;discount.doubleValue());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">#折扣大于9折 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>rule&nbsp;</span><span class="string">&quot;greaterThanNine&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">when</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer:CommisionComputer(discount</span><span class="symbol">:discount</span><span>,discount&nbsp;&gt;&nbsp;9)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">then</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;computer.setDeduct(((discount.doubleValue()&nbsp;-9)&nbsp;*&nbsp;0.85&nbsp;+&nbsp;(9-8)&nbsp;*&nbsp;0.7&nbsp;+&nbsp;(8-7)&nbsp;*&nbsp;0.65&nbsp;+&nbsp;(7-6)&nbsp;*&nbsp;0.6&nbsp;+&nbsp;(6&nbsp;-&nbsp;5)&nbsp;*&nbsp;0.5&nbsp;+&nbsp;5&nbsp;*&nbsp;0.1&nbsp;)&nbsp;/&nbsp;discount.doubleValue()); &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>在测试的时候发生过一些问题，如果要描述折扣大于8小于9的条件，使用如下代码就不行</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>computer:&nbsp;CommisionComputer(discount:discount,discount&nbsp;&gt;&nbsp;</span><span class="number">6</span><span>)&nbsp;&amp;&amp;&nbsp;CommisionComputer(discount&nbsp;&lt;=&nbsp;</span><span class="number">7</span><span>)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>另外CommisionComputer的discount属性是double类型，Rules的then部分会将其自动封箱，但是不会自动拆箱，所以如果then部分使用discount就会报错，必须使用discount.doubleValue();</p>
<h3><font color="#ff0000">创建Java类</font></h3>
<p>CommisionComputer类的主要方法是<font face="Arial">computeCommision方法接受一个合同价格和售出价格，返回销售人员的提成数额。</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.gaofubing.discount; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.InputStreamReader; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.Reader; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.commons.logging.Log; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.commons.logging.LogFactory; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.drools.RuleBase; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.drools.RuleBaseFactory; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.drools.WorkingMemory; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.drools.compiler.PackageBuilder; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.drools.rule.Package; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CommisionComputer &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;RULE_FILE&nbsp;=&nbsp;</span><span class="string">&quot;discount.drl&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(CommisionComputer.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//折扣 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//提成比例 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据合同价格和销售价格计算销售人员提成 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;contractPrice&nbsp;合同价格 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;saledPrice&nbsp;销售价格 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;提成 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;computeCommision(</span><span class="keyword">double</span><span>&nbsp;contractPrice,</span><span class="keyword">double</span><span>&nbsp;saledPrice) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//读取规则集,创建工作内存区 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleBase&nbsp;ruleBase&nbsp;=&nbsp;readRule(RULE_FILE); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkingMemory&nbsp;workingMemory&nbsp;=&nbsp;ruleBase.newWorkingMemory(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">&quot;执行规则前的提成比例值为：&quot;</span><span>&nbsp;+&nbsp;getDeduct()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//激活规则 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDiscount(saledPrice&nbsp;*&nbsp;10d&nbsp;/contractPrice);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;workingMemory.assertObject(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;workingMemory.fireAllRules();&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">&quot;执行规则后的提成比例值为：&quot;</span><span>&nbsp;+&nbsp;getDeduct());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Throwable&nbsp;t)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span class="string">&quot;不能成功执行规则&quot;</span><span>,t); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;contractPrice&nbsp;*&nbsp;getDeduct(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;读取规则文件 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;ruleFile&nbsp;规则文件名称，相对于类路径 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;RuleBase&nbsp;readRule(String&nbsp;ruleFile)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//读取规则文件 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reader&nbsp;source&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(CommisionComputer.</span><span class="keyword">class</span><span>.getClassLoader().getResourceAsStream(ruleFile)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建包 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageBuilder&nbsp;builder&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PackageBuilder(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.addPackageFromDrl(&nbsp;source&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Package&nbsp;pkg&nbsp;=&nbsp;builder.getPackage(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//构建规则集 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleBase&nbsp;ruleBase&nbsp;=&nbsp;RuleBaseFactory.newRuleBase(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleBase.addPackage(&nbsp;pkg&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ruleBase; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;getDiscount() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setDiscount(&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.discount&nbsp;=&nbsp;discount; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">double</span><span>&nbsp;getDeduct() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;deduct; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setDeduct(&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.deduct&nbsp;=&nbsp;deduct; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<h3><font color="#ff0000">创建测试</font></h3>
<p>测试代码如下：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountLessThanFive() &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">4500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*</span><span class="number">0.03</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountEqualsFive() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">5000</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*</span><span class="number">0.1</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountBetweenFiveAndSix() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">5500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount&nbsp;=&nbsp;</span><span class="number">5500</span><span>&nbsp;*&nbsp;10d&nbsp;/</span><span class="number">10000</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct&nbsp;=&nbsp;((discount&nbsp;-</span><span class="number">5</span><span>)&nbsp;*&nbsp;</span><span class="number">0.5</span><span>&nbsp;+&nbsp;</span><span class="number">6</span><span>&nbsp;*&nbsp;</span><span class="number">0.1</span><span>&nbsp;)&nbsp;/discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*deduct); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountBetweenSixAndSeven() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">6500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount&nbsp;=&nbsp;</span><span class="number">6500</span><span>&nbsp;*&nbsp;10d&nbsp;/</span><span class="number">10000</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct&nbsp;=&nbsp;((discount&nbsp;-</span><span class="number">6</span><span>)&nbsp;*&nbsp;</span><span class="number">0.6</span><span>&nbsp;+&nbsp;(</span><span class="number">6</span><span>&nbsp;-&nbsp;</span><span class="number">5</span><span>)&nbsp;*&nbsp;</span><span class="number">0.5</span><span>&nbsp;+&nbsp;</span><span class="number">5</span><span>&nbsp;*&nbsp;</span><span class="number">0.1</span><span>&nbsp;)&nbsp;/discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*deduct); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountBetweenSevenAndEight() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">7500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount&nbsp;=&nbsp;</span><span class="number">7500</span><span>&nbsp;*&nbsp;10d&nbsp;/</span><span class="number">10000</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct&nbsp;=&nbsp;((discount&nbsp;-</span><span class="number">7</span><span>)&nbsp;*&nbsp;</span><span class="number">0.65</span><span>&nbsp;+&nbsp;(</span><span class="number">7</span><span>-</span><span class="number">6</span><span>)&nbsp;*&nbsp;</span><span class="number">0.6</span><span>&nbsp;+&nbsp;(</span><span class="number">6</span><span>&nbsp;-&nbsp;</span><span class="number">5</span><span>)&nbsp;*&nbsp;</span><span class="number">0.5</span><span>&nbsp;+&nbsp;</span><span class="number">5</span><span>&nbsp;*&nbsp;</span><span class="number">0.1</span><span>&nbsp;)&nbsp;/discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*deduct); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountBetweenEightAndNine() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">8500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount&nbsp;=&nbsp;</span><span class="number">8500</span><span>&nbsp;*&nbsp;10d&nbsp;/</span><span class="number">10000</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct&nbsp;=&nbsp;((discount&nbsp;-</span><span class="number">8</span><span>)&nbsp;*&nbsp;</span><span class="number">0.7</span><span>&nbsp;+&nbsp;(</span><span class="number">8</span><span>-</span><span class="number">7</span><span>)&nbsp;*&nbsp;</span><span class="number">0.65</span><span>&nbsp;+&nbsp;(</span><span class="number">7</span><span>-</span><span class="number">6</span><span>)&nbsp;*&nbsp;</span><span class="number">0.6</span><span>&nbsp;+&nbsp;(</span><span class="number">6</span><span>&nbsp;-&nbsp;</span><span class="number">5</span><span>)&nbsp;*&nbsp;</span><span class="number">0.5</span><span>&nbsp;+&nbsp;</span><span class="number">5</span><span>&nbsp;*&nbsp;</span><span class="number">0.1</span><span>&nbsp;)&nbsp;/discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*deduct); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testDiscountGreaterThanNine() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;commision&nbsp;=&nbsp;computer.computeCommision(</span><span class="number">10000</span><span>,</span><span class="number">9500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;discount&nbsp;=&nbsp;</span><span class="number">9500</span><span>&nbsp;*&nbsp;10d&nbsp;/</span><span class="number">10000</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;deduct&nbsp;=&nbsp;((discount&nbsp;-</span><span class="number">9</span><span>)&nbsp;*&nbsp;</span><span class="number">0.85</span><span>&nbsp;+&nbsp;(</span><span class="number">9</span><span>-</span><span class="number">8</span><span>)&nbsp;*&nbsp;</span><span class="number">0.7</span><span>&nbsp;+&nbsp;(</span><span class="number">8</span><span>-</span><span class="number">7</span><span>)&nbsp;*&nbsp;</span><span class="number">0.65</span><span>&nbsp;+&nbsp;(</span><span class="number">7</span><span>-</span><span class="number">6</span><span>)&nbsp;*&nbsp;</span><span class="number">0.6</span><span>&nbsp;+&nbsp;(</span><span class="number">6</span><span>&nbsp;-&nbsp;</span><span class="number">5</span><span>)&nbsp;*&nbsp;</span><span class="number">0.5</span><span>&nbsp;+&nbsp;</span><span class="number">5</span><span>&nbsp;*&nbsp;</span><span class="number">0.1</span><span>&nbsp;)&nbsp;/discount; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(commision,</span><span class="number">10000</span><span>*deduct); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/70652#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Apr 2007 15:11:57 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/70652</link>
        <guid>http://flytogether.javaeye.com/blog/70652</guid>
      </item>
      <item>
        <title>Spring+Mysql+Jbpm整合</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/70007" style="color:red;">http://flytogether.javaeye.com/blog/70007</a>&nbsp;
          发表时间: 2007年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">前言</font></h3>
<p>最近因为工作需要做一个工作流相关的DEMO，研究了一下JBPM，记录一下个人的心得与体会。</p>
<p>软件环境：</p>
<ul>
    <li>spring2.0.2 </li>
    <li>hibernate3.2.2 </li>
    <li>spring modules 0.8 (Jbpm3.1) </li>
    <li>jbpm3.1.4 </li>
    <li>struts2.0.6 </li>
</ul>
<h3><font color="#ff0000">配置</font></h3>
<p>Spring Module Jbpm模块提供了几个工具类用来整合spring和jbpm，关于具体的配置可以参见spring module下载包中的参考手册，按照上面的指示来就OK了，这里粘贴示例配置。</p>
<div class="code_title">xml 代码</div>
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
    <li class=""><span><!--CTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"</sp--><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;</span><span class="attribute">default-autowire</span><span>=</span><span class="attribute-value">&quot;byName&quot;</span><span>&nbsp;</span><span class="attribute">default-lazy-init</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;approveWorkflow&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;definitionLocation&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;classpath:jbpm/audit/processdefinition.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;jbpmConfiguration&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;configuration&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;classpath:jbpm/jbpm.cfg.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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;processDefinitions&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;approveWorkflow&quot;</span><span>&nbsp;</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"><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;jbpmTemplate&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springmodules.workflow.jbpm31.JbpmTemplate&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">constructor-arg</span><span>&nbsp;</span><span class="attribute">index</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;jbpmConfiguration&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">constructor-arg</span><span>&nbsp;</span><span class="attribute">index</span><span>=</span><span class="attribute-value">&quot;1&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;approveWorkflow&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<font face="Arial">
<p>比较关键的是为了能够使JBPM实体和业务实体使用同一个会话工厂，这样可以在JBPM流程实例中持久化业务实体对象。必须将业务实体映射和JBPM的实体映射进行整合。我的作法是改写JBPM本身提供的hibernate.cfg.xml文件，将业务实体包括在里面。</p>
<div class="code_title">xml 代码</div>
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">'1.0'</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">'utf-8'</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span><!--CTYPE hibernate-configuration PUBLIC   </sp--></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;-//Hibernate/Hibernate&nbsp;Configuration&nbsp;DTD&nbsp;3.0//EN&quot; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">hibernate-configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">session-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernate.cache.use_second_level_cache&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;&nbsp;&nbsp;&nbsp;false &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.cache.use_query_cache&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.MySQL5Dialect</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.show_sql&quot;</span><span class="tag">&gt;</span><span>false</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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.query.factory_class&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;&nbsp;&nbsp;&nbsp;org.hibernate.hql.ast.ASTQueryTranslatorFactory &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!--  下面是业务实体映射 --></span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;com/emap/jbpm/model/Apply.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- 下面是JBPM引擎本身的实体映射 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/action/Script.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/db/hibernate.queries.hbm.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- graph.def mapping files --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/ProcessDefinition.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/Node.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/Transition.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/Event.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/Action.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/SuperState.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/graph/def/ExceptionHandler.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mapping</span><span>&nbsp;</span><span class="attribute">resource</span><span>=</span><span class="attribute-value">&quot;org/jbpm/instantiation/Delegation.hbm.xml&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;........ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">session-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">hibernate-configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
</div>
<p>下面我们看看sessionFactory工厂的配置。</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
    <li class=""><span><!--CTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"</sp--><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;</span><span class="attribute">default-autowire</span><span>=</span><span class="attribute-value">&quot;byName&quot;</span><span>&nbsp;</span><span class="attribute">default-lazy-init</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- 数据源定义,使用Apache DBCP 连接池 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.apache.commons.dbcp.BasicDataSource&quot;</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">&quot;close&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverClassName&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${jdbc.driverClassName}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${jdbc.url}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;username&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${jdbc.username}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${jdbc.password}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- Hibernate SessionFactory --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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;configLocations&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>classpath:jbpm/hibernate.cfg.xml</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!--Hibernate TransactionManager--></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.HibernateTransactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
</font>
<h3><font color="#ff0000">遗留问题</font></h3>
<p><font color="#0000ff"><strong>如何使用JBPM Process Designer插件？</strong></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一直没找到如何使用JBPM Process Designer插件的使用文档，比如如何配置JBPM安装路径，如何部署。目前唯一用到的功能就是编写流程文件。</p>
<h5><font color="#0000ff">如何发布流程文件？</font></h5>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于如何发布流程文件，我比较同意如下帖子中的观点，编程实现或许是最简洁的方式。</p>
<p><a href="http://www.pcdog.com/edu/java/2006/11/v171946.html">www.pcdog.com/edu/java/2006/11/v171946.html</a></p>
<h5><font color="#0000ff">如何关联业务实体和流程实例？</font></h5>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBPM主要用来管理业务流程，记录每个流程进入哪个环节，同时还要保存一些状态，这些状态信息可能来自于业务实体。JBPM的实现方式是将这些状态信息序列化到数据库的表列。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假定有一个订单处理的流程，现在要获取某个角色当前的所有任务列表，同时将关联的订单信息展示给用户，我们应该如何处理?目前我想到有以下几种方式：</p>
<p><strong><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方式一：</font></strong>在构建任务实例的时候，将业务实体持久化到contextInstance，在获取任务列表时从任务实例中直接解析出业务实体。如果需要保存的业务实体数据量很大，这会给JBPM数据库造成很大的数据冗余。</p>
<p><strong><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方式二：</font></strong>在构建任务实例的时候，仅将业务实体的唯一标识符持久到contextInstance，在获取任务列表时从任务实例中解析出任务实体的唯一标识符，然后再根据此标识符查询业务实体数据库。这种情况会造成查询一个包含N个的任务列表时，需要N+1次数据库查询，显然性能是无法满足需求的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#0000ff">方式三：</font></strong>是否可以在构建业务实体时，和TaskInstance进行关联？这种方式会造成业务实体和JBPM紧耦合，而且必须对JBPM本身有比较深刻的理解。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><font color="#0000ff">有什么更好的办法解决这种问题呢？个人以为方式一可能是目前性价比最好的解决方式吧。</font></strong></p>
<h3><font color="#ff0000">一点体会</font></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBPM看来在国内并没有得到很多的应用，资料都比较稀缺，唯一的参考手册也是非常的浅显和简单。而其源码的注释不是很好，这在国外的开源软件中是很罕见的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JBPM提供的某些API不是很全，举个例子，假定我要查询某个角色某个时间段的所有任务列表。因为<font face="Arial">TaskMgmtSession仅提供了findXXXTaskInstances(String actorId)方法，所以我只能先查询出该角色的所有任务列表，采用如下代码：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>TaskMgmtSession&nbsp;taskMgmtSession&nbsp;=&nbsp;context.getTaskMgmtSession(); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;List&nbsp;tasks&nbsp;=&nbsp;taskMgmtSession.findPooledTaskInstances(actorId);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后再在内存中使用类似如下代码进行过滤。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;(task.getName().equals(taskName)&nbsp;&amp;&amp;&nbsp;!task.hasEnded())&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>这种方式太笨拙和低效了。</p>
<p><strong><font color="#ff0000"></font></strong></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/70007#comments" style="color:red;">已有 <strong>9</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Apr 2007 11:53:18 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/70007</link>
        <guid>http://flytogether.javaeye.com/blog/70007</guid>
      </item>
      <item>
        <title>Oracle相关资料</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/66592" style="color:red;">http://flytogether.javaeye.com/blog/66592</a>&nbsp;
          发表时间: 2007年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">虽然一直用oracle数据库，不过一般都局限于使用应用程序连接数据库，最近工作中接触到oracle一些深层次的东西，才发现这个很不错的网站，收藏一下!(有点孤陋寡闻啊）</font></p>
<p><font face="Arial"><a href="http://www.oracle.com.cn/">ORACLE中国用户组</a></font></p>
<p>下面这个网页对DBMS_JOB的讲解比较透彻，相关信息在ORACLE官方文档里也有的。</p>
<p><a href="http://www.psoug.org/reference/dbms_job.html">www.psoug.org/reference/dbms_job.html</a></p>
<p><font face="Arial"><a href="http://www.psoug.org/reference/dbms_job.html">Supplied PL SQL Packages and Types Reference</a></font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/66592#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 Mar 2007 10:39:32 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/66592</link>
        <guid>http://flytogether.javaeye.com/blog/66592</guid>
      </item>
      <item>
        <title>数据挖掘</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/65381" style="color:red;">http://flytogether.javaeye.com/blog/65381</a>&nbsp;
          发表时间: 2007年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">概念</font></h3>
<p>数据挖掘是一个利用各种分析工具在海量数据中发现模型和数据之间关系的过程，这些模型和关系可以被企业用来分析风险，进行预测。</p>
<p>数据挖掘是通过仔细分析大量数据来揭示有意义的新的关系，模式和趋势的过程。</p>
<p>现在很多公司开始采用数据挖掘技术来判断哪些是最有价值客户，电信公司使用数据挖掘检测话费欺诈行为，银行使用数据挖掘检测信用卡欺诈行为。</p>
<p>数据挖掘的分析数据源可以是数据仓库或者数据挖掘数据集市。</p>
<h3><font color="#ff0000">数据挖掘/CRM</font></h3>
<p>数据挖掘利用数据库的信息创建模型和预测客户行为。可以用来为推销活动选择最合适的客户群，或者发现可能流失客户名单。</p>
<p>通过数据挖掘优化CRM流程，可以用来留住客户，提高活动的响应率。</p>
<h3><font color="#ff0000">挖掘过程</font>&nbsp; </h3>
<p><font face="Arial">确定挖掘对象 <br />
准备数据 <br />
建立模型 <br />
数据挖掘 <br />
结果分析 <br />
知识应用阶段<br />
</font></p>
<h3><font color="#ff0000">模型和算法</font></h3>
<h5><font color="#0000ff">关联分析</font></h5>
<p>关联分析是寻找数据库中数值的相关性，从大量商业数据中发现有意义的关联关系，可以帮助商业决策的制定。典型的应用如超市使用关联分析设计商品的摆放位置。</p>
<p>表达某一特定关联出现的频率在关联规则中称为支持度，当情况一出现时，发生情况二的概率在关联规则中称为可信度。如100万个移动用户中，有25万使用银行业务，2万用户使用手机银行和移动秘书业务，则同时使用两种业务的支持度为200/10000=2%。</p>
<p>Apriori算法是挖掘布尔关联规则最有影响的算法，但是其递推的过程要求多次数据库扫描，引起很大的I/O负载。</p>
<h5><font color="#0000ff">分类/预测</font></h5>
<p>预测离散数据通常称为分类，预测连续数据通常称为预测。</p>
<p>决策树是一种典型的分类算法，可以得到类似在什么条件下会得到什么结果的规则。比如建立顾客决策树模型，进行市场细分，找出最有可能对促销宣传感兴趣的客户群。</p>
<p>决策树的优点是生成容易理解的规则，计算量不是很大，擅长处理非数值型数据。</p>
<h5><font color="#0000ff">聚类分析</font></h5>
<p>将数据分组成多个类或簇，同一个簇中的对象之间有较高的相似度。</p>
<p>神经网络是常用的聚类算法。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/65381#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 25 Mar 2007 18:23:11 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/65381</link>
        <guid>http://flytogether.javaeye.com/blog/65381</guid>
      </item>
      <item>
        <title>好用的工具</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/64981" style="color:red;">http://flytogether.javaeye.com/blog/64981</a>&nbsp;
          发表时间: 2007年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><font color="#ff0000">实用工具</font></h3>
<p><font face="Arial">一个挺不错的Html转PDF格式的工具</font></p>
<p><a href="http://down.05sun.com">down.05sun.com</a></p>
<p>一个很好的思维导图工具MindManager，可以用来做会议记录，脑力激荡等等,下面有不错的教程噢</p>
<p><a href="http://www.cuifang.com/?q=node/195">www.cuifang.com/</a></p>
<h3><font color="#ff0000">开发工具</font></h3>
<p>一个挺不错的javascript调试工具，是Firefox浏览器的插件</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/1843">addons.mozilla.org/en-US/firefox/addon/1843</a></p>
<p>.net程序员的十大必备工具</p>
<p><a href="http://blog.csdn.net/zhumi/archive/2004/07/22/49076.aspx">blog.csdn.net/zhumi/archive/2004/07/22/49076.aspx</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flytogether.javaeye.com/blog/64981#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Mar 2007 15:26:20 +0800</pubDate>
        <link>http://flytogether.javaeye.com/blog/64981</link>
        <guid>http://flytogether.javaeye.com/blog/64981</guid>
      </item>
      <item>
        <title>OGNL使用手记</title>
        <author>white182517</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flytogether.javaeye.com">white182517</a>&nbsp;
          链接：<a href="http://flytogether.javaeye.com/blog/64910" style="color:red;">http://flytogether.javaeye.com/blog/64910</a>&nbsp;
          发表时间: 2007年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><a name="OGNL%E4%BD%BF%E7%94%A8%E6%89%8B%E8%AE%B0-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%26nbsp%3B"></a><font color="#ff0000">基本概念</font>&nbsp;</h3>
<p>OGNL全称是Object-Graph Navigation Language，是一个用来获取和设置JAVA对象的属性的表达式语言。通过使用表达式语法导航对象图，而不是直接调用对象的获取和设置方法可以提供许多应用。比如在XML文件或者脚本文件中嵌入OGNL表达式语法，在JSP页面展现层使用OGNL表达式语法。类似的应用有Velocity,Freemark,Webwork。</p>
<h3><a name="OGNL%E4%BD%BF%E7%94%A8%E6%89%8B%E8%AE%B0-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8"></a><font color="#ff0000">如何使用</font></h3>
<p>最简单的使用是直接使用<tt>ognl.Ognl类来评估一个OGNL表达式。</tt> Ognl类提供一些静态方法用来解析和解释OGNL表达式，最简单的示例是不使用上下文从一个对象中获取某个表达式的值，示例如下：</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><font face="Arial"><div class="code_title">java 代码</div><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>&nbsp;</span><span class="keyword">import</span><span>&nbsp;ognl.Ognl;&nbsp;</span><span class="keyword">import</span><span>&nbsp;ognl.OgnlException;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;Ognl.getValue(expression,&nbsp;root);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li class=""><span>}&nbsp; &nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="keyword">catch</span><span>&nbsp;(OgnlException&nbsp;ex)&nbsp; &nbsp;&nbsp;</span></li><li class=""><span>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Report&nbsp;error&nbsp;or&nbsp;recover&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div></font></pre>
</div>
</div>
<p><font face="Arial">上述代码将基于root对象评估expression，返回结果，如果表达式有错，比如没有找到指定的属性，将抛出OgnlException。</font></p>
<p><font face="Arial">更复杂一点的应用是使用预解析的表达式。这种方式允许评估表达式前捕获解析错误，也允许缓存解析出来的表达式进一个AST供重得使用从而提高性能。Ognl的parseExpression方法就是用来执行预解析操作的。</font></p>
<p><font face="Arial">Ognl类的获取和设置方法大都可以接受一个context map参数，是一个Map类型的对象，允许你一些自己的变量进去，缺省的上下文里只包含#root和#context两个键。 Ognl内部会用这个Map替换OgnlContext类的缺省的map属性。Ognl的一些addDefaultContext方法就是完成这些功能的。</font></p>
<p><font face="Arial">OgnlContext提供一些设置，可以更改OGNL的缺省行为，比如TypeConverter接口实例用来改变类型转换行为，具体可以参见相关文档。<br />
</font></p>
<p>下面的示例展示如何从root对象中解析出documentName属性，然后将当前用户名称添加到返回的结果后面：</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><div class="code