<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>花钱的年华</title>
    <description>蓝缎玉娟金丝相衬，各类各色各人寻人</description>
    <link>http://calvin.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>一次Java垃圾收集调优实战</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/212967" style="color:red;">http://calvin.javaeye.com/blog/212967</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3>1 资料</h3>
<ul>
<li><span class="nobr"><a href="http://calvin.javaeye.com/blog/91905" title="Visit page outside Confluence" rel="nofollow">JDK5.0垃圾收集优化之--Don't Pause(花钱的年华)<sup><img class="rendericon" src="../../../../images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://calvin.javaeye.com/blog/91903" title="Visit page outside Confluence" rel="nofollow">编写对GC友好，又不泄漏的代码(花钱的年华)<sup><img class="rendericon" src="../../../../images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://pengjiaheng.spaces.live.com/blog/cns!2DAA368B386E6AEA!770.entry" title="Visit page outside Confluence" rel="nofollow">JVM调优总结<sup><img class="rendericon" src="../../../../images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://www.md.pp.ru/~eu/jdk6options.html" title="Visit page outside Confluence" rel="nofollow">JDK 6所有选项及默认值<sup><img class="rendericon" src="../../../../images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
</ul>
<h3>2 GC日志打印</h3>
<p>&nbsp; GC调优是个很实验很伽利略的活儿，GC日志是先决的数据参考和最终验证：</p>
<div class="macro">
<div class="code">
<div class="codeContent">
<pre class="code-java">-XX:+PrintGCDetails -XX:+PrintGCTimeStamps(GC发生的时间) -XX:+PrintGCApplicationStoppedTime(GC消耗了多少时间) -XX:+PrintGCApplicationConcurrentTime(GC之间运行了多少时间)</pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<h3>3 收集器选择</h3>
<h4><a name="JavaPerformance-CMS收集器：暂停时间优先" style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(../../../CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif);"></a>
CMS收集器：暂停时间优先</h4>
<p>&nbsp;&nbsp; 配置参数：-XX:+UseConcMarkSweepGC<br />
&nbsp;&nbsp; 已默认无需配置的参数：-XX:+UseParNewGC(Parallel收集新生代)
-XX:+CMSPermGenSweepingEnabled(CMS收集持久代)
-XX:UseCMSCompactAtFullCollection(full gc时压缩年老代)</p>
<p>&nbsp;&nbsp; 初始效果：1g堆内存的新生代约60m，minor gc约5-20毫秒，full gc约130毫秒。</p>
<h4><a name="JavaPerformance-Parallel收集器：吞吐量优先" style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(../../../CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif);"></a>
Parallel收集器：吞吐量优先</h4>
<p>&nbsp;&nbsp;&nbsp; 配置参数： -XX:+UseParallelGC -XX:+UseParallelOldGC(Parallel收集年老代，从JDK6.0开始支持)</p>
<p>&nbsp;&nbsp;&nbsp; 已默认无需配置的参数： -XX:+UseAdaptiveSizePolicy(动态调整新生代大小)</p>
<p>&nbsp;&nbsp;&nbsp; 初始效果：1g堆内存的新生代约90-110m(动态调整)，minor gc约5-20毫秒，full gc有无UseParallelOldGC 参数分别为1.3/1.1秒，差别不大。</p>
<p>&nbsp;&nbsp;&nbsp; 另外-XX:MaxGCPauseMillis=100 设置minor gc的期望最大时间，JVM会以此来调整新生代的大小，但在此测试环境中对象死的太快，此参数作用不大。</p>
<h3><a name="JavaPerformance-1.4调优实战" style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(../../../CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif);"></a>
4 调优实战</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parallel收集高达1秒的暂停时间基本不可忍受，所以选择CMS收集器。
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在被压测的Mule 2.0应用里，每秒都有大约400M的海量短命对象产生：</p>
<ol>
<li>因为默认60M的新生代太小了，频繁发生minor gc，大约0.2秒就进行一次。</li>
<li>因为CMS收集器中MaxTenuringThreshold(生代对象撑过过多少次minor gc才进入年老代的设置)默认0，存活的临时对象不经过Survivor区直接进入年老代，不久就占满年老代发生full gc。</li>
</ol>
<p>&nbsp; &nbsp;&nbsp; 对这两个参数的调优，既要改善上面两种情况，又要避免新生代过大，复制次数过多造成minor gc的暂停时间过长。</p>
<ol>
<li>使用-Xmn调到1/3 总内存。观察后设置-Xmn500M，新生代实际约460m。(用-XX:NewRatio设置无效，只能用 -Xmn)。</li>
<li>添加-XX:+PrintTenuringDistribution 参数观察各个Age的对象总大小，观察后设置-XX:MaxTenuringThreshold=5。</li>
</ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优化后，大约1.1秒才发生一次minor gc，且速度依然保持在15-20ms之间。同时年老代的增长速度大大减缓，很久才发生一次full gc，</p>
<p>&nbsp; &nbsp; &nbsp; 参数定稿：</p>
<div class="macro">
<div class="code">
<div class="codeContent">
<pre class="code-java"> -server -Xms1024m -Xmx1024m -Xmn500m -XX:+UseConcMarkSweepGC   -XX:MaxTenuringThreshold=5  -XX:+ExplicitGCInvokesConcurrent</pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后服务处理速度从1180 tps 上升到1380 tps，调整两个参数提升17%的性能还是笔很划算的买卖。</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp;&nbsp; 另外，JDK6 Update 7自带了一个VisualVM工具，内里就是之前也有用过的Netbean Profiler，类似JConsole一样使用，可以看到线程状态，内存中对象以及方法的CPU时间等调优重要参考依据。免费捆绑啊，Sun 这样搞法，其他做Profiler的公司要关门了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/212967#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 10:39:01 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/212967</link>
        <guid>http://calvin.javaeye.com/blog/212967</guid>
      </item>
      <item>
        <title>Mule ESB 2.0 苦斗两周之后的初印象</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/211389" style="color:red;">http://calvin.javaeye.com/blog/211389</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>

<strong>&nbsp; 与Mule 2.0抵死缠绵了两周，喜忧掺半。但只在2.0之后，Mule才算真正</strong>
<strong>站到了ESB的起跑线上。<br />
&nbsp; <br />
&nbsp; </strong>
完整的笔记见我的Wiki: <a href="http://wiki.springside.org.cn/display/calvin/Mule">http://wiki.springside.org.cn/display/calvin/Mule</a>
<strong> </strong>
, 这里主要列一下实际的升级感受。<strong><br />
</strong>
<strong><br />
</strong>
</p>
<ul>
<li><span class="nobr"><a href="http://www.infoq.com/cn/news/2008/04/mule2" title="Visit page outside Confluence" rel="nofollow">InfoQ中文站新闻<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://mulesource.org/display/MULE2INTRO/Whats+New+in+Mule+2.0" title="Visit page outside Confluence" rel="nofollow">Mule2.0的What's new<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://mule.mulesource.org/display/MULE2INTRO/Migrating+Mule+1.x+to+2.0" title="Visit page outside Confluence" rel="nofollow">Migrating Mule 1.x to 2.0<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://java.dzone.com/print/3172" title="Visit page outside Confluence" rel="nofollow">Pattern Based Development with Mule 2.0<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; 《Open-Source ESBs in Action》作者文章</li>
</ul>
<h3><img class="cetempAnchor" src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/Images/anchor.gif" id="3" alt="" />
1. 很Spring，很SCA的配置文件</h3>
<ul>
<li><strong>全Spring又全nameSpace化的配置文件，简洁而规范，在IDE中有良好的提示。</strong>
<br />
    尤其是transport相关的endpoint的改进明显，原来的URI<span style="color: #000000;">&lt;endpoint address=</span>
<span style="color: #000000;">&quot;pop3://bob:secret@localhost:62002&quot;&gt;</span>
 <span style="color: #000000;">或如下的connector</span>
</li>
</ul>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!-- {cps..0}--><span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">connector&nbsp;</span>
<span style="color: #ff0000;">name</span>
<span style="color: #0000ff;">=&quot;SystemStreamConnector&quot;</span>
<span style="color: #ff0000;">&nbsp;className</span>
<span style="color: #0000ff;">=&quot;org.mule.providers.stream.SystemStreamConnector&quot;</span>
<span style="color: #0000ff;">&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">properties</span>
<span style="color: #0000ff;">&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">property&nbsp;</span>
<span style="color: #ff0000;">name</span>
<span style="color: #0000ff;">=&quot;promptMessage&quot;</span>
<span style="color: #ff0000;">&nbsp;value</span>
<span style="color: #0000ff;">=&quot;Please&nbsp;enter&nbsp;something:&nbsp;&quot;</span>
<span style="color: #0000ff;">/&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">property&nbsp;</span>
<span style="color: #ff0000;">name</span>
<span style="color: #0000ff;">=&quot;messageDelayTime&quot;</span>
<span style="color: #ff0000;">&nbsp;value</span>
<span style="color: #0000ff;">=&quot;1000&quot;</span>
<span style="color: #0000ff;">/&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;/</span>
<span style="color: #800000;">properties</span>
<span style="color: #0000ff;">&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;/</span>
<span style="color: #800000;">connector</span>
<span style="color: #0000ff;">&gt;</span>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改为transport特定的namespace后，IDE中清晰显示了可选的配置项。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!-- {cps..1}--><span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">stdio:connector&nbsp;</span>
<span style="color: #ff0000;">name</span>
<span style="color: #0000ff;">=&quot;SystemStreamConnector&quot;</span>
<span style="color: #ff0000;">&nbsp;promptMessage</span>
<span style="color: #0000ff;">=&quot;Please&nbsp;enter&nbsp;something:&nbsp;&quot;</span>
<span style="color: #ff0000;">messageDelayTime</span>
<span style="color: #0000ff;">=&quot;1000&quot;</span>
<span style="color: #0000ff;">/&gt;</span>
</div>
<p>&nbsp;</p>
<ul>
<li><strong>SCA的Service/Component概念。</strong>
<br />
    Service/Component代替了原来注定要被遗忘的MuleDescriptor，其中Component定义业务逻辑的POJO，Service定义如何以服务的方式管理组件的配置。<br />
    在POJO中调用远程服务的Nested Router也改为了很SCA的Binding。<br />
    Component也有Component 与 PooledComponent的选项。完整的例子如下：</li>
</ul>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!-- {cps..2}--><span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">pooled-component</span>
<span style="color: #0000ff;">&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">spring-object&nbsp;</span>
<span style="color: #ff0000;">bean</span>
<span style="color: #0000ff;">=&quot;mySpringPojo&quot;</span>
<span style="color: #0000ff;">/&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">binding&nbsp;</span>
<span style="color: #ff0000;">interface</span>
<span style="color: #0000ff;">=&quot;org.mule.example.loanbroker.credit.CreditAgencyService&quot;</span>
<span style="color: #0000ff;">&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">outbound-endpoint&nbsp;</span>
<span style="color: #ff0000;">ref</span>
<span style="color: #0000ff;">=&quot;CreditAgency&quot;</span>
<span style="color: #0000ff;">/&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;/</span>
<span style="color: #800000;">binding</span>
<span style="color: #0000ff;">&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;</span>
<span style="color: #800000;">pooling-profile&nbsp;</span>
<span style="color: #ff0000;">exhaustedAction</span>
<span style="color: #0000ff;">=&quot;WHEN_EXHAUSTED_FAIL&quot;</span>
<span style="color: #ff0000;">&nbsp;initialisationPolicy</span>
<span style="color: #0000ff;">=&quot;INITIALISE_ALL&quot;</span>
<span style="color: #ff0000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span>
<span style="color: #0000ff;">=&quot;1&quot;</span>
<span style="color: #ff0000;">&nbsp;maxIdle</span>
<span style="color: #0000ff;">=&quot;2&quot;</span>
<span style="color: #ff0000;">maxWait</span>
<span style="color: #0000ff;">=&quot;3&quot;</span>
<span style="color: #0000ff;">/&gt;</span>
<span style="color: #000000;"><br />
<br />
</span>
<span style="color: #0000ff;">&lt;/</span>
<span style="color: #800000;">pooled-component</span>
<span style="color: #0000ff;">&gt;</span>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
上文按pooling-profile定义的pooled-component，在spring中定义mySpringPojo，并将一个远程的CXF
Endpoint binding到POJO的CreditAgencyService变量中，可直接调用；</p>
<ul>
<li><strong>可视化拖拽的Eclipse 插件Mule IDE。</strong>
<br />
    虽然还非常原始，但总算有个盼头。</li>
</ul>
<h3><a name="Mule-2.架构的更改" style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(../../CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif);"></a>
2. 架构的更改</h3>
<ol>
<li><strong>Web Service支持增强</strong>
<br />
    随着CXF作者的加入，Web Service这事实上SOA里最重要的Transport得到了加强，WSDL终于可以通过annotation准确配置。<br />
    虽然无奈，就冲这个理由就应该升级到2.0了。不是2.0太好，而是1.4太差了。<strong>&nbsp;</strong>
</li>
<li><strong>REST支持增强</strong>
<br />
    <span class="nobr"><a href="http://mule.mulesource.org/display/MULE/Mule+RESTpack" title="Visit page outside Confluence" rel="nofollow">Mule RESTPack<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，支持apache abdera(Atom Publish协议实现)，Jersey(JSR131 RESTful WebService实现)和Restlet 三种Transport。</li>
<li><strong>代码结构的合理化</strong>
<br />
    抽象出相对稳定的org.mule.api接口包，代替原来的org.mule.umo包。<br />
    开发团队还检查调整了Mule中所有对象的定义，使其更加准确。</li>
<li><strong>各个模块的升级</strong>
<br />
    如核心MuleManager大对象拆成MuleContext and Registry，运行时Reistry支持动态加载Service，支持向OSGI进军；<br />
    如以流的方式转换处理消息。<br />
    如SEDA模型定义的细化，见后。</li>
<li><strong>工具增强</strong>
<br />
    <span class="nobr"><a href="http://mule.mulesource.org/display/MULE2USER/Controlling+the+Infrastructure+with+Mule+Galaxy" title="Visit page outside Confluence" rel="nofollow">Mule Galaxy<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; SOA治理工具(开源)， <span class="nobr"><a href="http://mule.mulesource.org/display/MULE2USER/Monitoring+Data+with+Mule+Saturn" title="Visit page outside Confluence" rel="nofollow">Mule Saturn <sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;消息流监控工具，<span class="nobr"><a href="http://mule.mulesource.org/display/MULE2USER/Using+Mule+HQ" title="Visit page outside Confluence" rel="nofollow">Mule HQ<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; 底层监控工具。<br />
    不过还没试用不知道实际效果如何。</li>
</ol>
<h3><a name="Mule-3.遗憾的地方：" style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(../../CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;amp;file=anchor.gif);"></a>
3. <strong>遗憾的地方：</strong>
</h3>
<ol>
<li><strong>性能下降</strong>
<br />
    无论是代替XFire的CXF还是Mule 2.0，都拖得性能大大下降。<br />
    用一个简单例子测试，Mule 1.4+XFire&nbsp; : Mule 1.4 + CXF : Mule 2.0 + CXF 的每秒事务数对比是15000：10000：8000。<br />
    </li>
<li><strong>仍然没有自带的<span class="nobr"><a href="http://mule.mulesource.org/display/MULECDEV/Mule+Clustering+i.e.+Mule+114" title="Visit page outside Confluence" rel="nofollow">集群<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，负载均衡，流量控制实现。</strong>
<br />
    不像BEA、ServiceMix都使用JMS的底层，Mule使用vm queue在单一JVM的节点间流动。<br />
    我们团队主要用<a href="/display/calvin/Terracotta" title="Terracotta">TerraCotta</a>
&thinsp;在集群里同步状态数据，流量控制与负载均衡也是自己实现。</li>
<li><strong>CXF transport 仍然使用Mule自己实现的Http Connector。</strong>
<br />
    CXF Standlone也是用Jetty的，看tomcat们努力的劲头，相信谁都能随便实现一个不错的Http Connector。</li>
<li><strong>从1.4升到2.0非常的花时间。</strong>
<br />
    估计团队重构的太兴奋了，从代码到配置文件再到XFire to CXF，一些代码级修改还没文档详述。</li>
<li><strong>文档从1.4版更新到2.0版的进度太慢，而且文档仍然简略。</strong>
</li>
<li><strong>质量仍然需要在使用中检验。</strong>
<br />
    文档说2.0版本的比1.x版本增加了30%的单元测试用例，按理来说项目质量应该提高了。<br />
    但还是被我发现了在很重要的AbstractEntryPointResolver类里，居然有内存泄漏，原因是用没有重载Object的equals()函数的StringBuffer作为HashMap的key，结果map永远都在增大。<br />
    这说明了，开源项目的质量，最终是靠一个积极使用和反馈的用户群和一个活跃的开发团队，&quot;用&quot;出来的。</li>
</ol>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/211389#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 10:27:54 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/211389</link>
        <guid>http://calvin.javaeye.com/blog/211389</guid>
      </item>
      <item>
        <title>Terracotta，POJO开发模型的最后一块拼图</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/198140" style="color:red;">http://calvin.javaeye.com/blog/198140</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span class="nobr">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nobr"><a href="http://www.terracotta.org/" title="Visit page outside Confluence" rel="nofollow">TerraCotta<sup><img class="rendericon" src="http://wiki.springside.org.cn:8081/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" width="7" /></sup></a></span>&thinsp;&nbsp;通过将POJO对象在群集内下的共享，让POJO不再局限于SNA(Share Nothing Architect)的架构，比较透明的支持了集群模式，可谓POJO开发模型的最后一块拼图。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nobr">其</span>实它的原理很简单，本身是一个中央式的Cache服务器。在应用启动命令中添加Terracotta参数，Classloader就会根据配置文件在JVM级以AOP方式修改ByteCode，用户透明地将对象存储于中央服务器。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了性能，它以对象属性而不是整个对象为存储单位；为了可用性，它本身也支持主备集群。</p>
</span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;研究院和项目组的同事们早就在他们的地盘上用上了，这几天自己也跟风了一把。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 很喜欢这种"前商业项目"，一般都会有不错的工具。&nbsp; </p>
<ul>
<li>Sessions Configurator 。以Debug模式将tc-confg.xml运行在一个预配置的双机集群下，让你观察共享对象的数值变化，出现运行时错误时，提示配置文件缺漏错误的修正。 </li>
<li>Eclipse插件。通过对着任意的类、属性、函数点右键来设定tc-config.xml。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说是用户透明，其实只是最美好的愿望，可能还是有些代码修改：</p>
<ul>
<li>同步问题。原本单机运行的程序，改成集群运行，跑不掉的是先要将自己共享对象类的代码改为线程安全的，如使用线程安全的ConcurrentHashMap&nbsp;、AtomicInteger属性，或在访问属性的代码中加入synchronized控制。然后在xml中配置Terracotta的autolock将锁其扩展到群集范围，设定以锁为边界的批量更新属性的事务。<br />反向理解TC的CTO同志关于调优的讲话，锁没搞好的话对性能影响挺大。 </li>
</ul>
<ul>
<li>本地资源属性。有些很local的属性如文件句柄是没办法共享的，这时候就需要配置为Transients 属性。这种属性在另一个JVM里就会被强制设为Null。怎么办呢？推荐的做法是另写一个初始化这些属性的init函数，在tc-config.xml中配置调用。更少侵入的做法是直接在tc-config.xml中写beanshell脚本，不过这脚本不好写。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 最后TC承担了实现POJO集群的功能，但TC Server本身就存在单点故障的危险，需要配成Cluster模式。在TC的Persistent HA Cluster模式中，所有数据会Persist到磁盘，Cluster中永远只有一个Active Node，其他节点就作为Passive Nodee。Active Node的失效切换与Client的重连都是透明的。&nbsp;Passive 与Active Node使可以用同一块支持文件锁的磁盘空间，也可以让Active Node将所有变化通过网络同步到Passive Node上。一般采用后者。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，已经可以买国内的支持服务了。唯一遗憾要到12月份的TC2.7版，才会支持Glassfish 2。&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/198140#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 10:22:17 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/198140</link>
        <guid>http://calvin.javaeye.com/blog/198140</guid>
      </item>
      <item>
        <title>08年的读书计划</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/189401" style="color:red;">http://calvin.javaeye.com/blog/189401</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 08已过了一季，马上就要三十的人了，总有些脱不开烟火气的惫懒。为了那些"将来"，今年要读的书:<br /><br /><strong>一、架构模式</strong><br />&nbsp;&nbsp; 模式，就仿佛一个代号。一个大的架构，总能分拆成一个个代号与符号来演绎。<br />&nbsp;&nbsp;&nbsp;SOA、ESB、SCA，注定了还是这一两年内纠缠着业界和客户的名词，大型架构内应用间的集成交互、性能、伸缩性、可靠性、可管理性、可扩展性、安全性，永远都是设计人员的心头好。</p>
<ul>
<li>《Pattern-Oriented Software Architecture, Volume 4 -- A Pattern Language forDistributed Computing》架构模式的超级集大成目录。愿出版社快点翻出中文版造福市民。 </li>
<li>《企业集成模式：设计、构建及部署消息传递解决方案》，重读之，<a href="http://wiki.springside.org.cn:8081/display/calvin/Mule" title="Mule">Mule</a>、<span class="nobr"><a href="http://activemq.apache.org/camel/" title="Visit page outside Confluence" rel="nofollow">Apache Camel</a></span>、<span class="nobr"><a href="http://www.springframework.org/spring-integration" title="Visit page outside Confluence" rel="nofollow">Spring Intergration</a></span>都是它最实际的解释者。 </li>
<li>《Remoting Patterns- Foundations of Enterprise, Internet and Realtime Distributed Object Middleware》，旧书但有点声名不响，前半卷应该可读。 </li>
</ul>
<p>&nbsp;&nbsp; 下半年国外还会有些关于SOA与ESB的书要出来，如《SOA Design Patterns》，《Implementing SOA : Total Architecture in Practice》，《Open-Source ESBs in Action》，《Service-Oriented Architecture and Event-Driven Architecture: J2EE Integrated Solutions》，静待。<br />&nbsp;&nbsp;&nbsp; 而关于X性的书，下半年会有本《Patterns for Fault Tolerant Software》。<br /><br /><strong>二、BI</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;越是Web2.0，越需要BI，比如豆瓣起家的法宝。<br />&nbsp;&nbsp;&nbsp; 而且，离什么算法高数都好遥远了，忽然间看回一排排数字，心里很意动，感觉又成为了《世界尽头与冷酷仙境》里的计算士。</p>
<ul>
<li>《Programming Collective Intelligence --&nbsp;Building Smart Web 2.0 Applications》 Web2.0里的群体智慧。愿出版社的动作更快一点。 </li>
<li>《数据挖掘--实用机器学习技术 2nd》 <span class="nobr"><a href="http://www.wekacn.org/" title="Visit page outside Confluence" rel="nofollow">Weka</a></span>作者的书。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 还有一本《Collective Intelligence in Action》国外下半年会出版，这次是for Java程序员的，有weka，有java data mining api。</p>
<p><strong>三、Good Programmer<br /></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 越来越远离补充基础的年龄，赶紧多看点书了。</p>
<ul>
<li>《代码大全2nd》，细读之，书是好书，尤其是对于刚毕业两三年的人。对于一把年纪的，看了总比不看好。 </li>
<li>《编程珠玑2nd》，闲得没事时可以看看，补充一下某些我们这些惯写应用程序的人早已失去的能力。 </li>
<li>《Beautiful Code》，也是闲得没事看的，继续盼望出版社赶快译快校。 </li>
<li>《Code Craft --The Practice of Writing Excellent Code》标题不错。</li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/189401#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 16:31:42 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/189401</link>
        <guid>http://calvin.javaeye.com/blog/189401</guid>
      </item>
      <item>
        <title>设计美好的服务器(7)--Apache CXF笔记</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/151744" style="color:red;">http://calvin.javaeye.com/blog/151744</a>&nbsp;
          发表时间: 2007年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a name="CXF-OverView" class=""></a>OverView</h2>
<ul>
    <li><span class="nobr"><a href="http://incubator.apache.org/cxf/" linktext="Apache CXF|http://incubator.apache.org/cxf/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://incubator.apache.org/cxf/">Apache CXF<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://java.sys-con.com/read/452355_p.htm" linktext="Web Services Using Apache CXF(JDJ)|http://java.sys-con.com/read/452355_p.htm" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://java.sys-con.com/read/452355_p.htm">Web Services Using Apache CXF(JDJ)<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://netzooid.com/blog/" linktext="Dan Diephouse|http://netzooid.com/blog/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://netzooid.com/blog/">Dan Diephouse<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;XFire作者的Blog，现工作于MuleSource。</li>
    <li><span class="nobr"><a href="http://jeffyuchang.spaces.live.com/" linktext="余昌|http://jeffyuchang.spaces.live.com/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://jeffyuchang.spaces.live.com/">余昌<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;、<span class="nobr"><a href="http://willem.bokeland.com/blog/794/6089" linktext="Willem Jiang|http://willem.bokeland.com/blog/794/6089" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://willem.bokeland.com/blog/794/6089">Willem Jiang<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;&nbsp;两位IONA北京员工的Blog。&nbsp;</li>
</ul>
<h2><a name="CXF-%E6%9E%B6%E6%9E%84%E7%AC%94%E8%AE%B0" class=""></a>架构笔记</h2>
<p>CXF的架构看多了有点熟悉而无聊，核心模块更是经典得没法更经典了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 一、核心处理模块：</p>
<ul>
    <li>Bus -- CXF容器，基于Spring的Container与Configuration。</li>
    <li>ServiceModel -- 服务元数据，其中ServiceInfo类似WSDL，而其他部分描述了DataBinding，Interceptors等CXF属性。</li>
    <li>Message -- 在框架内流动的通用信息单元。</li>
    <li><span class="nobr"><a href="http://cwiki.apache.org/CXF20DOC/interceptors.html" linktext="Interceptor|http://cwiki.apache.org/CXF20DOC/interceptors.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://cwiki.apache.org/CXF20DOC/interceptors.html">Interceptor<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;-- 在管道内处理信息的功能单元，由Interceptor Chain控制，分属不同的阶段(Phase)。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二、扩展模块：</p>
<ul>
    <li>FrontEnd -- 用户编程API(如jax-ws,simple,javascript)，被隔离于核心模块。</li>
    <li>Trainsport -- 抽象、可扩展的传输层(如servlet,jetty,jms,local)，Destinations与Conduits代表接收与发送者。</li>
    <li>Binding -- 抽象、可扩展的协议解释层(如soap,http,xml,object)，实现createMessage()初始信息，然后通过预设置的一系列专用Interceptor实现解释。</li>
    <li>Data Binding -- 抽象、可扩展的XML与Java Object映射层(如jaxb,aegis)，实现不同的Reader与Writer进行编解码。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三、运作流程&nbsp;</p>
<ol>
    <li>CXF可以<strong>独立运行</strong>(Jetty)，也可以<strong>整合到Web服务器</strong>(servlet,jca)</li>
    <li>使用<strong>FrontEnd</strong>(如JaxWsServiceFactoryBean)从WSDL或annotated java class反射创建<strong>ServiceModel</strong></li>
    <li>在<strong>Transport</strong>(http，jms,local)上接收请求</li>
    <li>通过<strong>Binding</strong>(SOAP，REST，JMS和Corba)创建<strong>Message</strong>，并由一系列Binding预设定的<strong>Interceptor</strong>进行解释与<strong>WS-*协议</strong>处理</li>
    <li>确定目标的Java服务，并把<strong>Data Binding</strong>(JAXB,Aegis)解码参数</li>
    <li>最后调度Java方法，将返回结果重新编码并发送回去。</li>
</ol>
<h2><a name="CXF-%E7%9B%B4%E6%8E%A5%E5%A4%84%E7%90%86%E5%8E%9F%E5%A7%8BXML%E8%AF%B7%E6%B1%82%E7%9A%84Provider%E6%8E%A5%E5%8F%A3" class=""></a>直接处理原始XML请求的Provider接口</h2>
<p>JAX-WS的API有两个层次，除了常见DataBinding后调用最终Java方法外，还可以使用客户端的Dispatch与服务端<span class="nobr"><a href="http://cwiki.apache.org/CXF20DOC/provider-services.html" linktext="Provider说明|http://cwiki.apache.org/CXF20DOC/provider-services.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://cwiki.apache.org/CXF20DOC/provider-services.html">Provider</a></span>接口，绕过DataBinding处理，直接处理XML。</p>
<p>在Spring配置文件里，将implementor指向<span class="nobr"><a href="http://cwiki.apache.org/CXF20DOC/provider-services.html" linktext="Provider说明|http://cwiki.apache.org/CXF20DOC/provider-services.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://cwiki.apache.org/CXF20DOC/provider-services.html">Provider</a></span>，指定WSDL，然后编写下类实现invoke函数。</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">@WebServiceProvider(portName=<span class="code-quote">&quot;stockQuoteReporterPort&quot;</span> serviceName=<span class="code-quote">&quot;stockQuoteReporter&quot;</span>)
@ServiceMode(value=<span class="code-quote">&quot;Service.Mode.PAYLOAD&quot;</span>)
<span class="code-keyword">public</span> class  stockQuoteReporterProvider <span class="code-keyword">implements</span> Provider&lt;DOMSource&gt;
<span class="code-keyword">public</span> stockQuoteReporterProvider(){
  }

<span class="code-keyword">public</span> DOMSource invoke(DOMSource request){
    DOMSource response = <span class="code-keyword">new</span> DOMSource();
    ...
    <span class="code-keyword">return</span> response;
  }
}</pre>
</div>
</div>
</div>
<p>&thinsp;又见范型，&lt;DOMSource&gt;指明了数据的类型，可选DOM/SAX/StreamSource。也可以是Service.Mode.MESSAGE下的完整SOAPMessage或JMS的DataSource。记得需要自行拼装返回的XML结果。</p>
<p>&nbsp;&nbsp; JAX-WS新增的这个功能是为复杂Web服务编写贴身订造的。被绕过的DataBinding，可以自行调用JAXB2.0的api完成。至于WSDL，可以写死，也可以用wsdl4j动态扩展。</p>
<h2><a name="CXF-%E5%85%B6%E4%BB%96%E7%AC%94%E8%AE%B0" class=""></a>其他笔记</h2>
<ul>
    <li>CXF中的Message信息：<br />
    ID--唯一属性。<br />
    Content--内容。可通过&nbsp; &lt;T&gt; T getContent(Class&lt;T&gt; format) 函数获取，内部实现为Map&lt;Class&lt;?&gt;, Object&gt; contents。<br />
    Exchange属性特别的将In Message 、Out Message、Fault与Transport信息关联。<br />
    InterceptorChain--要处理Message的Chain。</li>
    <li><span class="nobr"><a href="http://cwiki.apache.org/CXF20DOC/invokers.html" linktext="Invoker|http://cwiki.apache.org/CXF20DOC/invokers.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://cwiki.apache.org/CXF20DOC/invokers.html">Invoker<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;，CXF默认是直接调用POJO或Spring里的Bean，可以通过Invoker调用EJB等对象。</li>
</ul>
<p>&thinsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/151744#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Dec 2007 11:52:57 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/151744</link>
        <guid>http://calvin.javaeye.com/blog/151744</guid>
      </item>
      <item>
        <title>设计美好的服务器(6)--SEDA架构笔记</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/149826" style="color:red;">http://calvin.javaeye.com/blog/149826</a>&nbsp;
          发表时间: 2007年12月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a name="SEDA-1.Overview" class=""></a>1.Overview</h2>
<ul>
    <li><span class="nobr"><a href="http://www.eecs.harvard.edu/~mdw/proj/seda/" linktext="SEDA|http://www.eecs.harvard.edu/~mdw/proj/seda/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.eecs.harvard.edu/~mdw/proj/seda/">SEDA<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
    <li><span class="nobr"><a href="http://www.eecs.harvard.edu/~mdw/papers/control-usits03.pdf" linktext="Adaptive Overload Control for Busy Internet Servers|http://www.eecs.harvard.edu/~mdw/papers/control-usits03.pdf" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.eecs.harvard.edu/~mdw/papers/control-usits03.pdf">Adaptive Overload Control for Busy Internet Servers<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
    <li><span class="nobr"><a href="http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf" linktext="An Architecture for Highly Concurrent,Well-Conditioned Internet Services|http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf">An Architecture for Highly Concurrent,Well-Conditioned Internet Services<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; SEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stag，不同资源消耗的Stag使用不同数量的线程来处理，Stag间使用事件驱动的异步通信模式。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;更进一步，在每个Stage中可以动态配置自己的线程数，在超载时降级运行(如输出纯文字页面)或拒绝服务。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在每个Stage的通常有如下组件:</p>
<ul>
    <li>Incoming Event Queue ，事件队列。 </li>
    <li>Admission Controller&nbsp; 阀门，拒绝服务。 </li>
    <li>Dynamically sized Thread Pool， 线程池。 </li>
    <li>Event Handler ，实际处理业务的Compinent。 </li>
    <li>Resource Controller ，控制Stage的参数。 </li>
</ul>
<h2><a name="SEDA-2.Web2.0SOA%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84SEDA%E5%BA%94%E7%94%A8" class=""></a>2.Web2.0+SOA环境下的SEDA应用</h2>
<p>&nbsp;&nbsp;&nbsp; <a href="/display/calvin/ArchinWeb2.0" linktext="Web2.0对架构师提出了新的挑战|ArchinWeb2.0" linktype="raw" title="ArchinWeb2.0" mce_href="/display/calvin/ArchinWeb2.0">Web2.0对架构师提出了新的挑战</a>&thinsp;，&nbsp; JavaEE 的同步调用机制(除JMS)，有限的线程池与连接池(超出范围性能会下降)，固定的定义在JNDI的资源对Web2.0/SOA的需求并不吻合。对BEEP，SCTP这些协议，必须依靠JCA另行编写模块来实现长连接模型。</p>
<p>&nbsp;&nbsp;&nbsp; <span class="nobr"><a href="http://www.ibm.com/developerworks/cn/web/wa-aj-web2jee/index.html" linktext="Java EE 迎合 Web 2.0(IBM DW)|http://www.ibm.com/developerworks/cn/web/wa-aj-web2jee/index.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.ibm.com/developerworks/cn/web/wa-aj-web2jee/index.html">Java EE 迎合 Web 2.0(IBM DW)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;提出，从统计学上看在系统总线程数固定的情况下，使用SEDA能获得较高的Throughput，阶段间的资源差异越大就越明显。<br />
&nbsp;&nbsp;&nbsp;&nbsp;比如处理一个Web 2.0常用Mashup请求，有如下几步：</p>
<ol>
    <li>接收用户请求(1单位时间) </li>
    <li>数据库查询(4单位时间) </li>
    <li>根据数据库查询结果，准备Web Service调用参数(1单位时间) </li>
    <li>发起Web Service调用((16单位时间)) </li>
    <li>将结果渲染返回给用户(2单位时间)<br />
    &nbsp;&nbsp;&nbsp; </li>
</ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 那么SEDA会使用一条线程处理1.接收用户请求、3.准备WebService、5.返回结果，两条线程处理2.数据库查询，&nbsp;而5条线程处理耗时最多的4.WebService请求。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 结果表明，当远程调用所花时间不变，而本地操作得到优化时，系统通量也能获得明显提高。</p>
<h2><a name="SEDA-3.Mule%E4%B8%AD%E7%9A%84SEDA%E5%AE%9E%E4%BE%8B" class=""></a>3. Mule 中的SEDA 实例</h2>
<ul>
    <li><span class="nobr"><a href="http://www.infoq.com/articles/SEDA-Mule" linktext="Using SEDA to Ensure Service Availability(InfoQ)|http://www.infoq.com/articles/SEDA-Mule" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.infoq.com/articles/SEDA-Mule">Using SEDA to Ensure Service Availability(InfoQ)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mule是SEDA架构的遵循者。每个Component间，用inbound-&gt;outBound的Queue异步相连，每个Component可以设置自己的线程池大小，队列长度。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此SEDA中的Stag间事件驱动异步链接，Stag内Incoming Event Queue，Thread Pool，Event Handler都有了。</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java"><mule-descriptor name="&lt;span" class="code-quote"></mule-descriptor>&quot;RadioCarUMO&quot; implementation=<span class="code-quote">&quot;radioCar&quot;</span>&gt;

    <threading-profile maxthreadsactive="&lt;span" class="code-quote"></threading-profile>&quot;5&quot; maxThreadsIdle=<span class="code-quote">&quot;10&quot;</span> poolExhaustedAction=<span class="code-quote">&quot;WAIT&quot;</span> threadWaitTimeout=<span class="code-quote">&quot;-1&quot;</span> id=<span class="code-quote">&quot;component&quot;</span> doThreading=<span class="code-quote">&quot;<span class="code-keyword">true</span>&quot;</span>/&gt;
    <queue-profile class="code-quote" maxoutstandingmessages="&lt;span"></queue-profile>&quot;6&quot;/&gt;
    <inbound-router></inbound-router>
        <endpoint address="&lt;span" class="code-quote"></endpoint>&quot;RadioCarsQueue&quot;/&gt;
        <router class="code-quote" classname="code-quote"></router>&quot;org.mulefair.routing.BennyTheGatekeeper&quot;/&gt;
    
    <outbound-router></outbound-router>
        <router class="code-quote" classname="code-quote"></router>&quot;org.mule.routing.outbound.OutboundPassThroughRouter&quot;&gt;
             <endpoint address="&lt;span" class="code-quote"></endpoint>&quot;FairAreaQueue&quot;/&gt;
        
    
</pre>
</div>
</div>
</div>
<p>&thinsp;</p>
<p>&nbsp;&nbsp; 而例子中的InboundRouter BennyTheGatekeeper，则实现了administration controller的角色，本来poolExhaustedAction=&quot;WAIT&quot;，而administration controller可以通过计数器，直接refuse需求，将请求转发到alarm queue。</p>
<p>&nbsp;&nbsp; 整个Stag中唯一缺失是动态改变资源参数的Resource Controller，threadpool也不是Dynamically sized Thread Pool，但这似乎不重要了。</p>
<p>&nbsp;&nbsp;&nbsp; 再一次觉得Mule充当Service Container比ESB时还要称职。</p>
&thinsp;
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/149826#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Dec 2007 00:33:31 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/149826</link>
        <guid>http://calvin.javaeye.com/blog/149826</guid>
      </item>
      <item>
        <title>设计美好的服务器(5)--Shoal集群框架</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/149608" style="color:red;">http://calvin.javaeye.com/blog/149608</a>&nbsp;
          发表时间: 2007年12月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a name="Shoal-Overview" class=""></a>Overview</h2>
<ul>
    <li><span class="nobr"><a href="https://shoal.dev.java.net/" linktext="Shoal|https://shoal.dev.java.net/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="https://shoal.dev.java.net/">Shoal<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
    <li><span class="nobr"><a href="http://www.glassfishwiki.org/gfwiki/attach/UserExperienceMeeting/ShoalJXTAOverview.pdf" linktext="Shoal Overview|http://www.glassfishwiki.org/gfwiki/attach/UserExperienceMeeting/ShoalJXTAOverview.pdf" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.glassfishwiki.org/gfwiki/attach/UserExperienceMeeting/ShoalJXTAOverview.pdf">Shoal Overview<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
    <li><span class="nobr"><a href="http://today.java.net/pub/a/today/2007/12/11/clustering-with-shoal-framework.html" linktext="Clustering with the Shoal Framework(java.net)|http://today.java.net/pub/a/today/2007/12/11/clustering-with-shoal-framework.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://today.java.net/pub/a/today/2007/12/11/clustering-with-shoal-framework.html">Clustering with the Shoal Framework(java.net)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
    <li><span class="nobr"><a href="http://www.glassfishwiki.org/gfwiki/attach/UserExperienceMeeting/ShoalJXTAOverview.pdf" linktext="Shoal JXTA Overview Presentation|http://www.glassfishwiki.org/gfwiki/attach/UserExperienceMeeting/ShoalJXTAOverview.pdf" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.glassfishwiki.org/gfwiki/attach/UserExperienceMeeting/ShoalJXTAOverview.pdf">Shoal JXTA Overview Presentation<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
    <li><span class="nobr"><a href="http://blogs.sun.com/shreedhar/" linktext="作者博客|http://blogs.sun.com/shreedhar/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://blogs.sun.com/shreedhar/">作者Blog<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; </li>
</ul>
<p>Shoal是Glassfish的群集子项目，和Geronimo拼命整合现有开源项目相反，Glassfish在拼命拆分可独立使用的子项目。</p>
<p>Shoal很好的抽象了集群的两个最重要功能--群集节点管理和共享状态数据，而且，这一切是作为一个类库来提供，可以嵌入到任意的Java应用中。</p>
<p>集群的目标无外伸缩性与高可靠性，实现无外Load Balancer与Failover，而Shoal对这两点实现提供了很好的支持。可关注此项目的发展与应用，也可以基于它来学习一下群集的实现。</p>
<h2><a name="Shoal-%E9%9B%86%E7%BE%A4%E7%AE%A1%E7%90%86SPI" class=""></a>集群管理SPI</h2>
<p>毫无例外地基于JXTA/JGroups。</p>
<ul>
    <li>节点可以加入，退出集群。 </li>
    <li>节点可以收到其他节点加入，退出(由节点主动发布)，怀疑失效，确认失效(由心跳系统发出)的消息。 </li>
    <li>实现了FailureRecoveryAction的节点可以收到虚拟管理器发来的接手某个失效服务器的指示。 </li>
    <li>节点可以群发或一对一发送消息。 </li>
</ul>
<p>基于上面的功能，可以....</p>
<ul>
    <li>可以做负载均衡分发器(仍然要自己实现)，根据有效的群集节点来进行分发，节点还可以用sendMessage()接口发送自己的负载情况。 </li>
    <li>可以做FailOver，当系统不是SNA架构时，接手处理的节点会根据指示，完成某些初始化工作，比如从共享内存中获取前任的数据，以保证自己能接手工作。 </li>
    <li>如果共享数据只读或者多数为读，可以不用共享内存，而是各自在本地建立对象，然后通过群集管理SPI的sendMessage函数来通知更新。 </li>
</ul>
<h2><a name="Shoal-%E7%8A%B6%E6%80%81%E6%95%B0%E6%8D%AE%E5%85%B1%E4%BA%ABSPI" class=""></a>状态数据共享SPI</h2>
<p>使用专有的API进行读写，基于使用集群内机器循环备份算法。<br />
对比其他分布式缓存方案，是分布式内存方案，共享数据不会基于某种规则失效(如总内存大小1G，先进先出)，也不会自动清空过时数据。</p>
<h2><a name="Shoal-%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81" class=""></a>示例代码</h2>
<p><span class="nobr"><a href="http://blogs.sun.com/shreedhar/resource/SimpleGMSSample.java" linktext="完整示例代码|http://blogs.sun.com/shreedhar/resource/SimpleGMSSample.java" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://blogs.sun.com/shreedhar/resource/SimpleGMSSample.java">完整示例代码<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;，启动GMS的代码如下：</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">GMSFactory.startGMSModule(serverName,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; groupName, GroupManagementService.MemberType.CORE, <span class="code-keyword">null</span>);</pre>
</div>
</div>
</div>
<p>&thinsp;</p>
&thinsp;
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/149608#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Dec 2007 10:06:44 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/149608</link>
        <guid>http://calvin.javaeye.com/blog/149608</guid>
      </item>
      <item>
        <title>JavaEE事务扫盲笔记之一扫扫到尾</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/142419" style="color:red;">http://calvin.javaeye.com/blog/142419</a>&nbsp;
          发表时间: 2007年11月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 音箱里放的是《<font face="Arial">暮良文王》、《<font face="Arial">相相生》<font face="Arial">，再看下面的笔记体，虽然实用，但还是数完盘来再数碟，言语无味的很。以后不是这里的地荒得太厉害，就尽量让这些笔记在wiki里安静的呆着吧。</font></font></font></p>
<h2>1.资料</h2>
<ul>
    <li><span class="nobr"><a href="http://www.infoq.com/minibooks/JTDS" linktext="《Java Transaction Design Strategies》|http://www.infoq.com/minibooks/JTDS" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.infoq.com/minibooks/JTDS">《Java Transaction Design Strategies》<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;&nbsp;InfoQ minibook，最好的电子文档，Java事务处于懵懂状态的必读。 </li>
    <li>《Expert One on one J2EE Development Without EJB 中文版》与<span class="nobr"><a href="http://www.redsaga.com/spring_ref/2.0/html/transaction.html" linktext="Spring参考手册中文版|http://www.redsaga.com/spring_ref/2.0/html/transaction.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.redsaga.com/spring_ref/2.0/html/transaction.html">Spring参考手册中文版<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; 中的相关章节可以看到Spring guys的意见。 </li>
</ul>
<h2><a name="Transaction-2.%E6%9C%AC%E5%9C%B0%E4%BA%8B%E5%8A%A1%E4%B8%8E%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1" class=""></a>2.本地事务与分布式事务</h2>
<ul>
    <li><strong>本地事务</strong><br />
    完全依赖于DB、JMS自身，，如直接调用jdbc中的conn.commit();这里没应用服务器什么事，所以也不支持多数据源的全局事务。 </li>
    <li><strong>分布式事务</strong><br />
    在JavaEE世界的事务在JTA、JTS规范和XA Sources之上实现。<br />
    JTA是用户编程接口，JTS是服务器底层服务，两者一般由应用服务器自带实现，而<span class="nobr"><a href="http://jotm.objectweb.org/" linktext="JTOM|http://jotm.objectweb.org/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://jotm.objectweb.org/">JOTM<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;和JBoss Transaction是专门搞局抢生意的。<br />
    XA Sources其实先于JavaEE而存在，JDBC driver必须有javax.sql.XADataSource接口的实现类，否则所谓二阶段提交就是个伪能力。<br />
    JavaEE除了支持JDBC和JMS外，还引入了JCA模型。JCA可以说是目前唯一可移植的插入JavaEE事务的资源模型，因此像JDO这类框架/Server就是靠乖乖出自己的JCA连接器来参与JavaEE事务的。 </li>
</ul>
<h2><a name="Transaction-3.%E7%BC%96%E7%A8%8B%E5%BC%8F%E6%A8%A1%E5%9E%8B" class=""></a>3.编程式模型</h2>
<p>&nbsp;&nbsp;&nbsp; 手工调用jdbc的connection事务方法和使用JTA接口都属于编程式开发，在EJB中叫BMT(Bean管理事务)。<br />
&nbsp;&nbsp;&nbsp; JTA最重要的接口就是UserTransaction和它的六个方法-begin，commit，rollback，getStatus，setRollbackonly，setTransactionTimeout。<br />
&nbsp;&nbsp;&nbsp; 程序需要UserTransaction时可以从JNDI领取，不过JNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入。</p>
<h2><a name="Transaction-4.%E5%AE%A3%E5%91%8A%E5%BC%8F%E6%A8%A1%E5%9E%8B" class=""></a>4.宣告式模型</h2>
<p>&nbsp;&nbsp;&nbsp; 前面都是铺垫，这个才是主打的事务模型，如EJB的CMT(容器管理事务)和Sprin。</p>
<p>&nbsp;&nbsp;&nbsp; 其中EJB2.0，Spring1.0在部署描述符和applicationContext.xml中定义，而EJB3.0和Spring2.0则采用annotation。</p>
<h3><a name="Transaction-4.1%E4%BA%8B%E5%8A%A1%E7%B1%BB%E5%9E%8B" class=""></a>4.1 事务类型</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这里JavaEE与Spring的定义基本相同：</p>
<ul>
    <li>Required：如果Context中有事务就加入，没有就自己创建一个。(最常用设置) </li>
    <li>Mandatory：永远加入一个事务。如果当前Context没有事务，抛出异常。(那些不打算自己负责rollback事务的方法，必须加入到别人的事务，由别人来控制rollback) </li>
    <li>RequiresNew：永远新建一个事务。(那些不管别人如何，自己必须提交事务的方法，比如审计信息是一定要写的) </li>
    <li>Supports：如果有事务就加入，如果没有就算了。永远不会创建新事务。(一般用于只读方法，不会主动创建事务，但如果当前有事务就加入，以读到事务中未提交的数据) </li>
    <li>NotSupported：永远不使用事务，如果当前有事务，挂起事务。(那些有可能抛异常但异常并不影响全局的方法) </li>
    <li>Never：不能在有当前事务的情况下调用本方法。（生人勿近?) </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可见，Required是默认的设置，Supports是只读方法的最佳选择。</p>
<h3><a name="Transaction-4.2%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB" class=""></a>4.2 事务隔离级别</h3>
<ul>
    <li>ReadUncommited：本事务可以看到另一事务未提交的数据。脏读。 </li>
    <li>ReadCommited：本事务只可以看到另一事务已提交的数据。不可重复读。 </li>
    <li>RepeatableRead：可重复读。在一个事务内，第一次读到的数据，在本事务没有提交前，无论另一个事务如何提交数据，本事务读到的数据都是不变的。 </li>
    <li>Serializable：串行化，同时只有一个事务能读相同的数据。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 级别越低越安全效率也越低。隔离级别需要相关资源支持，如重复读在Oracle里会降级为ReadCommited。Spring里默认的Default级别完全看数据源的脸色行事。</p>
<h3><a name="Transaction-4.3%E5%85%B3%E4%BA%8ERollback" class=""></a>4.3 关于Rollback</h3>
<p>&nbsp;&nbsp;&nbsp; EJB里，想rollback只能sessionContext.setRollbackOnly()，或者抛出EJBException。(EJB3还可以annotation设置某些自定义Exception可以触发rollback)</p>
<p>&nbsp;&nbsp;&nbsp; 在Spring里，同样只会rollback unchecked exception(RuntimeExcption及子类)，而checked exception(Exception及子类)是不会rollback的，除非你特别声明。</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java">&nbsp;&nbsp;&nbsp;@Transactional(readOnly = <span class="code-keyword">false</span>, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})</pre>
</div>
</div>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;因此所有在service层方法中用throws定义的Exception，都必须在事务定义中进行rollback设定。(请勿善忘)</p>
<p>&nbsp;&nbsp;&nbsp; 所有在service层方法中c被atch处理了的异常，又希望容器辅助rollback的话，必须重抛一个预定义的RuntimeException的子类。(请勿回望)</p>
<h3><a name="Transaction-4.4%E5%85%B3%E4%BA%8ESpring" class=""></a>4.4 关于Spring</h3>
<p>&nbsp;&nbsp;&nbsp; Spring不希望编程式事务管理。<br />
&nbsp;&nbsp;&nbsp; Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJO，依赖于JTA全局事务对单数据源场景造成了浪费，而且rollback机制比较麻烦（必须为EJBException或手工setRollbackOnly())。<br />
&nbsp;&nbsp;&nbsp; 因此Spring通过AOP实现了对POJO的整套宣告式事务体系；对jdbc,hibernate,jpa,jms等local数据源和JTA实现了统一的事务管理机制，而且支持本地资源与JTA在配置文件级的切换，而且改进了rollback机制。</p>
<p>&nbsp;&nbsp; 1）一个本地事务管理器：</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java"><bean class="code-quote" id="&lt;span"></bean>&quot;transactionManager&quot;
&nbsp;&nbsp;class=<span class="code-quote">&quot;org.springframework.orm.jpa.JpaTransactionManager&quot;</span>&gt;
&nbsp;&nbsp;<property name="&lt;span" class="code-quote">&quot;entityManagerFactory&quot; ref=<span class="code-quote">&quot;entityManagerFactory&quot;</span> /&gt;
&nbsp;</property></pre>
</div>
</div>
</div>
<p>&thinsp;</p>
<p>&nbsp;&nbsp; 2）Spring就会把请求都转发到应用服务器的JTA对象上（注意此时数据源也需要改为用JNDI从应用服务器获取)。</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java"><bean class="code-quote" id="&lt;span"></bean>&quot;myTxManager&quot; class=<span class="code-quote">&quot;org.springframework.transaction.jta.JtaTransactionManager&quot;</span>/&gt;</pre>
</div>
</div>
</div>
<p>&thinsp;</p>
<p>&nbsp;&nbsp; 3）应用服务器专有的类型的JTA事务管理器：</p>
<div command="code" class="macro" macrotext="{code}">
<div class="code">
<div class="codeContent">
<pre class="code-java"><bean class="code-quote" id="&lt;span"></bean>&quot;myTxManager&quot; class=<span class="code-quote">&quot;org.springframework.transaction.jta.WebLogicJtaTransactionManager&quot;</span>/&gt;</pre>
</div>
</div>
</div>
<p>&thinsp;</p>
&thinsp;
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/142419#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 Nov 2007 20:57:52 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/142419</link>
        <guid>http://calvin.javaeye.com/blog/142419</guid>
      </item>
      <item>
        <title>数据服务笔记</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/135612" style="color:red;">http://calvin.javaeye.com/blog/135612</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a name="DataService-1.Overview"></a>
1.Overview</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据服务是专门化的Web服务，在Web服务占了很大的地盘。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，有企业服务总线(ESB)，也会有数据总线，两者是SOA下的两大总线，概念与功能上基本能一一对应，都是提供集中、星型的访问服务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据vs信息。数据一般指单体的表，而信息指有业务含义的多个数据表的组合。数据服务的主体一般是&quot;信息&quot;。</p>
<h2><a name="DataService-2.数据的基本服务接口"></a>
2.数据的基本服务接口</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 通过元数据定义，在一个或多个数据源中，将一个或多个数据表组合为信息视图，暴露为服务，提供CRUD接口和更新通知机制。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 除了让数据总线直接访问数据库外，数据源还可能是业务系统的WebService/EJB等接口，这一点上极具SOA的意义，业务系统下的数据库极有可能在物理上或逻辑上不允许总线对其直接访问和更新。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <strong>1.CRUDSI操作接口</strong>
：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对信息暴露标准的Create，Update，Delete，Retrive，Search与Information接口。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;除了最传统的WebService接口外，还可能有下面的传输协议与数据格式：</p>
<ul>
<li>REST，轻量级面向资源接口，数据服务似乎是REST最贴切的用武之地--层次式URL定位对象，CRUD操作的HTTP原语。</li>
<li>JSON/POX(Plain Old XML)，尽量简化的数据传输。</li>
<li>RSS/ATOM Feed，轻量级的信息发布订阅格式。</li>
<li>IBM/BEA的SDO规范，虽然看上去很美，但由于数据传输的跨平台要求，没有MS的加入等于白搭。</li>
<li>虚拟JDBC Driver，支持ADO.net的WebService，尽量减少旧系统改造的成本。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>2.查询语言</strong>
：</p>
<ul>
<li>直接的SQL92语言。</li>
<li>针对XML结果集的XQuery。</li>
<li>自设计的面向对象的查询语言，JPA的JQL、Salesforce的SOQL、Facebook的FQL等，能更好的表达信息视图中的对象嵌套关系，如post.comments。</li>
<li>Google Base的简单按属性匹配查询--Fillter模式。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <strong>3.数据更新通知机制</strong>
：</p>
<ul>
<li>SalesForce的带时间窗参数(beginTime,endTime)的服务端查询接口，如id[] getUpdated(objectType,beginTime,endTime)。<br />
优点-<del>最为简单；缺点</del>
-实时性低，要达到高实时性时资源损耗严重；</li>
<li>客户自行实现接收通知的Web Service，供服务端调用。<br />
缺点--客户需要实现Web Service Server，而服务端需要自行实现订阅，可靠性保障等消息中间件功能。</li>
<li>使用<a href="/display/calvin/JMS" title="JMS">跨平台的消息中间件</a>
&thinsp;，客户通过MOM的客户端接收消息。而且封装屏蔽底层消息中间件的存在，只向用户提供有限的API。<br />
优点-<del>效率高，且对客户端要求低。缺点</del>
-免费又服众的跨平台中间件难觅。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <strong>4.接口粒度</strong>
：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以每个业务实体一个接口，下属SCURDI操作；也可以使用同一个操作接口，如使用REST定位实际对象类型。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REST的&quot;层次式定位&quot;比单纯的&quot;数据类型&quot;更适合复杂的数据环境。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论是最后是采用SOAP还是REST格式，采用RPC风格与强数据类型都会频繁增加或改动接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <strong>5.权限规则引擎</strong>
：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在表级、列级权限控制的基础上，还需要灵活的规则引擎来实现可定义的行记录级的权限控制。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <strong>6.业务级封装</strong>
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在规范数据接口之上，可以封装可重用的业务级接口。</p>
<h2><a name="DataService-3.数据的分散式部署"></a>
3.数据的分散式部署</h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上面的基本服务提供了基本的分散数据源的集中统一访问点(但不支持整合)之后，还可以：&nbsp;</p>
<ul>
<li>分布式实时联合视图&nbsp;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="text-decoration: underline;"><span class="nobr"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-soa-infoserv1/" title="Visit page outside Confluence" rel="nofollow"><u>数据联合模式</u>
<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</span>
，将分散在位置透明的多种数据源(DB，WebService)，多个数据表中的数据，联合成一个更大的有业务意义的信息视图，支持其即时联合查询与有限的更新能力。</p>
<ul>
<li>将数据最终整合存放&nbsp;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nobr"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-soa-infoserv2/" title="Visit page outside Confluence" rel="nofollow">数据整合模式<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，支持连接于数据总线上的数据服务进行纵向的整合。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 比如，当多个自治的独立异构数据源(地域分公司，并购企业)中，都存在核心的业务实体--主数据(如客户，订单)，可进行叠加转换后，提供统一的只读数据集。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 整合的方式有两种，一种是各数据源主动调用总数据集的基本服务接口进行发布。而另一种模式则是数据总线主动对各数据源进行拉取。</p>
<h2><a name="DataService-4.其他更强悍的需求"></a>
4.其他更强悍的需求</h2>
<ul>
<li>全文索引：支持相关性排序、模糊搜索，或者多个关键字搜索的搜索。</li>
<li>数据分析：支持数据挖掘，仪表板报告等。</li>
<li>ETL。</li>
</ul>
<h2><a name="DataService-5.轻量级的数据服务"></a>
5. 轻量级的数据服务</h2>
<ul>
<li><a href="/display/calvin/APP+and+GData" title="APP and GData">ATOM/APP,GData</a>
&thinsp; ATOM/APP协议与Google,Microsoft的扩展实现。</li>
<li><span class="nobr"><a href="http://wiki.developers.facebook.com/index.php/Data_Store_API_documentation" title="Visit page outside Confluence" rel="nofollow">FaceBook的Data Store API Beta版<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="https://www.snaplogic.org/" title="Visit page outside Confluence" rel="nofollow">snaplogic<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; RESTful的python 数据整合框架，支持db,webservice的整合。</li>
</ul>
<h2><a name="DataService-6.其他实现项目"></a>
6. 其他实现项目</h2>
<h3><a name="DataService-6.1BEADataServicePlatform"></a>
6.1 <strong>BEA Data Service Platform</strong>
</h3>
<ul>
<li><span class="nobr"><a href="http://edocs.bea.com/aldsp/docs25/index.html" title="Visit page outside Confluence" rel="nofollow">AquaLogic Data Services Platform<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;&nbsp;</li>
<li><span class="nobr"><a href="http://dev2dev.bea.com.cn/techdoc/2007/08/java-soa-data-in-soa.html" title="Visit page outside Confluence" rel="nofollow">SOA中的数据，第1部分：将数据转换成信息(dev2dev)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://dev2dev.bea.com.cn/blog/RichardManning-070705/200708/07_392.html" title="Visit page outside Confluence" rel="nofollow">逻辑数据服务 - &quot;SCRUDI&quot;设计模式(dev2dev)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://dev2dev.bea.com.cn/techdoc/05092103.html" title="Visit page outside Confluence" rel="nofollow">使用数据服务进行数据集成(dev2dev)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 支持基本服务接口，输出Web Service，SDO，JDBC(只读)等操作接口，偏重于基于XQuery的异构数据横向联合查询。</p>
<h3><a name="DataService-6.2其他"></a>
6.2 其他</h3>
<ul>
<li><span class="nobr"><a href="http://www.jboss.org/dna/" title="Visit page outside Confluence" rel="nofollow">JBoss DNA<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;&nbsp;( <span class="nobr"><a href="http://www.infoq.com/cn/news/2007/08/jboss-metamatrix-detail" title="Visit page outside Confluence" rel="nofollow">深入JBoss MetaMatrix<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;) ，类似BEA，JBoss收购后还没发布。</li>
</ul>
<ul>
<li><span class="nobr"><a href="http://www.longjump.com/daas/" title="Visit page outside Confluence" rel="nofollow">LongJump Daas(Database-as-a-Service)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
</ul>
<h2><a name="DataService-7.其他参考资料"></a>
7. 其他参考资料</h2>
<ul>
<li><span class="nobr"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-soa-infoserv1/" title="Visit page outside Confluence" rel="nofollow">信息服务模式，第1部分：数据联合模式<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，<span class="nobr"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-soa-infoserv2/" title="Visit page outside Confluence" rel="nofollow">第 2 部分: 数据整合模式<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，<span class="nobr"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-soa-infoserv3/" title="Visit page outside Confluence" rel="nofollow">第 3 部分：数据清理模式<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;(IBM DW)&nbsp;</li>
<li><span class="nobr"><a href="http://www.infoq.com/cn/articles/SOA-enterprise-data" title="Visit page outside Confluence" rel="nofollow">在SOA中整合企业数据(InfoQ)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
</ul>
&thinsp;
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/135612#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 09:07:15 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/135612</link>
        <guid>http://calvin.javaeye.com/blog/135612</guid>
      </item>
      <item>
        <title>ESB架构笔记</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/130337" style="color:red;">http://calvin.javaeye.com/blog/130337</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>ESB是什么</h2>
<ul>
<li><span class="nobr"><a href="http://www.infoq.com/cn/articles/ESB-Roundup-Part1-Defining-ESB" title="Visit page outside Confluence" rel="nofollow">ESB综述1：定义ESB<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;、<span class="nobr"><a href="http://www.infoq.com/cn/articles/ESB-Roundup-Part-two" title="Visit page outside Confluence" rel="nofollow">ESB综述2：ESB使用案例<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; (InfoQ)</li>
<li><span class="nobr"><a href="http://www.ibm.com/developerworks/cn/architecture/ar-esbpat1/" title="Visit page outside Confluence" rel="nofollow">探索企业服务总线 part1(IBM DW)<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，<span class="nobr"><a href="http://www.ibm.com/developerworks/cn/architecture/ar-esbpat2/" title="Visit page outside Confluence" rel="nofollow">part2<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;</li>
<li><span class="nobr"><a href="http://www.ddj.com/article/printableArticle.jhtml?articleID=201200303&amp;dept_url=/java/" title="Visit page outside Confluence" rel="nofollow">Defining the ESB <sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;&nbsp;(DDJ)</li>
<li><span class="nobr"><a href="/download/attachments/2640/Enterprise+Service+Bus+2004.rar?version=1" title="Enterprise Service Bus 2004.rar attached to ESB">《Enterprise Service Bus》<sup><img class="rendericon" src="/images/icons/link_attachment_7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;,O'Reilly 2004</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; ESB就是一个服务的中介，形成服务使用者-&gt;ESB服务Proxy-&gt;服务提供者的生物链，中介的作用在不同应用中各有不同：</p>
<ul>
<li><strong>解耦中介</strong>
：客户对实际服务提供者的身份、物理位置、传输协议和接口定义都是不知道也不关心的，交互集成代码提取到了业务逻辑之外，由ESB平台进行中央的宣告式定义。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESB平台实现<strong>协议转换</strong>
(WebService，Http，JMS...)，<strong>消息转换</strong>
(转换、充实、过滤)，<strong>消息路由</strong>
(同步/异步、发布/订阅、基于内容路由、分支与聚合...)。<strong>&nbsp;</strong>
</li>
<li><strong>服务中介</strong>
：ESB平台作为中介提供服务交互中的基础服务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESB平台实现<strong>SLA</strong>
(可靠性保证，负载均衡，流量控制，缓存，事务控制，加密传输)，<strong>服务管理监控</strong>
(异常处理，服务调用及消息数据记录，系统及服务的状态监控，ESB配置管理)，<strong>统一安全管理</strong>
(这个有点理想主义)<strong>。</strong>
</li>
<li><strong>服务编排</strong>
：多个服务进行编排形成新的服务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESB支持一个直观的形式定义新组合服务的流程(工作流、BPEL 或 代码级编排)。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点就是天然的额外中转性能消耗，中央ESB的性能瓶颈和高可用性问题。</p>
<h2><a name="ESB-ESB实现"></a>
ESB实现</h2>
<h3><a name="ESB-开源ESB实现"></a>
开源ESB实现</h3>
<ul>
<li><a href="/display/calvin/Mule" title="Mule">Mule</a>
&thinsp;&nbsp;，很多时候更像一个Service Container，OpenSource界暂时第一。</li>
<li><span class="nobr"><a href="http://wso2.org/projects/esb/java" title="Visit page outside Confluence" rel="nofollow">WSO2<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，Axis2 背后公司的作品。</li>
<li><span class="nobr"><a href="http://incubator.apache.org/servicemix/home.html" title="Visit page outside Confluence" rel="nofollow">ServiceMix<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，关注于JBI的实现。</li>
<li><span class="nobr"><a href="http://labs.jboss.com/jbossesb/" title="Visit page outside Confluence" rel="nofollow">JBoss ESB<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，&nbsp; <span class="nobr"><a href="https://open-esb.dev.java.net/" title="Visit page outside Confluence" rel="nofollow">Sun OpenESB<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; 没有关注。</li>
</ul>
<h3><a name="ESB-开源轻量级ESB"></a>
开源轻量级ESB</h3>
<ul>
<li><span class="nobr"><a href="http://activemq.apache.org/camel/" title="Visit page outside Confluence" rel="nofollow">Apache Camel<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，一个嵌入式的Router类库。</li>
<li><span class="nobr"><a href="http://www.springframework.org/spring-integration" title="Visit page outside Confluence" rel="nofollow">Spring Intergration<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp; ，相当清爽轻量的Spring Style的Router。</li>
</ul>
<h3><a name="ESB-商业ESB"></a>
商业ESB</h3>
<ul>
<li><span class="nobr"><a href="http://www.bea.com/aqualogic/" title="Visit page outside Confluence" rel="nofollow">BEA AquaLogic<sup><img class="rendericon" src="/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
&thinsp;，作为ESB概 念比Mule纯粹，同时使用JMS作为message flow的底层，在Weblogic上实现HA，群集和监控管理界面。但路由编排再次走了图形编程+XML Context(XQuery)的老路，相当鸡肋。</li>
<li>IBM(Message Broker, Websphere ESB，DataPower), <br />
</li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/130337#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 23:42:08 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/130337</link>
        <guid>http://calvin.javaeye.com/blog/130337</guid>
      </item>
      <item>
        <title>真正的maven私服搭建器--Artifactory </title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/107266" style="color:red;">http://calvin.javaeye.com/blog/107266</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个团队要真正用好Maven，repository私服是免不了的，否则team mate们多好奇的目光，都会全部消耗在漫长的jar下载中。
<p>&nbsp;&nbsp;&nbsp; 以前介绍过一个搭建私服的简朴但很笨的办法--将雷锋同志下载好的.m2/repository目录整个上传到任意的Web服务器中。其实世上多的是专业的maven私服搭建器，见TheServiceSide的文章--<a href="http://www.theserverside.com/tt/articles/article.tss?l=SettingUpMavenRepository">Setting Up a Maven&nbsp; Repository</a>。</p>
<p>&nbsp;&nbsp;&nbsp; 我用的是<a href="http://www.jfrog.org/sites/artifactory/latest/">Artifactory</a>，忽然间觉得，Java的服务应用啥时候终于变得这么好用了，什么都不用装，不用配，双击artifactory.bat，自己就会启动Jetty Web服务器，典型的拆箱即用。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>10分钟入门到开动</strong></p>
<ul>
    <li>双击artifactory.bat，启动默认配置的<a href="http://www.jfrog.org/sites/artifactory/latest/">Artifactory</a>服务。 </li>
    <li><a href="http://localhost:8081/artifactory/">http://localhost:8081/artifactory/</a>，用admin/password登录进管理界面看看。 </li>
    <li>修改自己项目的pom.xml，增加私服定义<br />
    <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
    <div><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">repositories</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">repository</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">artifactory&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">your&nbsp;local&nbsp;artifactory&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">http://localhost:8081/artifactory/repo&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">url</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">repository</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">repositories</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">pluginRepositories</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">pluginRepository</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">artifactory&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">id</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">your&nbsp;local&nbsp;artifactory&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">http://localhost:8081/artifactory/plugins-releases&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">url</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">snapshots</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">enabled</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">false&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">enabled</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">snapshots</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">pluginRepository</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="COLOR: #0000ff"><span style="COLOR: #800000">pluginRepositories</span><span style="COLOR: #0000ff">&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></div>
    </div>
    </li>
    <li>正常运行项目的maven命令，向artifactory索求jar。如果artifactory已经下载了就会直接返回给你，还没有的就会去那几个repo官方站下载。进入到artifactory的管理界面，不断刷新Browse the repository，会看到仓库不断丰富的情况。 </li>
</ul>
<p>另外，官网服务器上还没有的一些jar，也可以通过管理界面很方便的deploy到Artifactory中。</p>
<p>最后你团队里的artifactory服务器不能直接连外网，需要使用HTTP代理服务器的话，见<a href="http://www.jfrog.org/sites/artifactory/latest/configuration.html">http://www.jfrog.org/sites/artifactory/latest/configuration.html</a> </p>
<p>建议那些愿意为开源作实事的站点，在带宽充裕的服务器上，用<a href="http://www.jfrog.org/sites/artifactory/latest/">Artifactory</a>搭一个jar仓库吧，SpringSide就可以直接连上去下载jar了:)</p>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/107266#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 08:31:17 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/107266</link>
        <guid>http://calvin.javaeye.com/blog/107266</guid>
      </item>
      <item>
        <title>Java Web开发的未来--Servlet 3.0,Comet,REST...</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/93805" style="color:red;">http://calvin.javaeye.com/blog/93805</a>&nbsp;
          发表时间: 2007年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p goog_ds_charindex="1">Java EE 5.0 规范的笔墨在EJB3.0与Web Service上，随着万众期待的Struts2.0揭开面纱，Java在Web应用开发上便变得沉闷乏味起来。 </p>
在<a href="http://developers.sun.com/learning/javaoneonline/index.jsp" title="JavaOne2007"><font color="#551a8b">JavaOne2007</font></a><a href="http://developers.sun.com/learning/javaoneonline/index.jsp" title="JavaOne2007"></a> 上有篇 <a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-6381&amp;yr=2007&amp;track=8">The Future of the Java Technology Web Tier</a>宣讲了Sun的Servlet 3.0、REST、Comet计划，在大家渐渐失望的时候，又在前面吊了一个红萝卜。
<p goog_ds_charindex="130"><strong goog_ds_charindex="131">Servlet 3.0</strong></p>
<p goog_ds_charindex="145">Infoq 中文站：<a href="http://www.infoq.com/cn/news/2007/06/servlet3"><font color="#800080">Sun向JCP提交了Servlet3.0规范</font></a></p>
<p goog_ds_charindex="145">Infoq 英文站：<a href="http://www.infoq.com/news/2007/06/servlet3" title="Sun Submits Servlet 3.0 Specification to JCP"><font color="#800080">Sun Submits Servlet 3.0 Specification to JCP</font></a><br />
</p>
<div goog_ds_charindex="145">
<ul>
    <li>
    <div goog_ds_charindex="145">Annotation标注的servlets，可编程访问并动态改变的web.xml，使得以往经常需要重启的web应用配置终于拥有了动态特性，web framework们拥有了热插拔的能力。</div>
    </li>
    <li>
    <div goog_ds_charindex="145">Async and Comet support。</div>
    </li>
    <li>
    <div goog_ds_charindex="145">RESTul&nbsp;Service。</div>
    </li>
    <li>
    <div goog_ds_charindex="145">一堆看上去也不错的特性，如file upload。</div>
    </li>
</ul>
</div>
<p goog_ds_charindex="145">Sun，IBM，BEA，Oracle，Apache，RedHat，Interface21加上Hani Suleiman和Jason Hunter作为初始的专家组，Jetty的Greg Wilkins作为支撑成员。<br />
</p>
<p goog_ds_charindex="145">Grizzly, Tomcat and Jetty 会对Comet API Review. Struts Shale, DWR, Spring Web Flow, Wicket会对可插拔Web Framework进行Review，看起来挺民主的。</p>
<p goog_ds_charindex="145"><strong>Comet</strong></p>
<p goog_ds_charindex="145">&nbsp;&nbsp;&nbsp; 又一个新词，服务端在事件发生时主动向客户端推送--比如股票价格，聊天室信息，比客户端定时轮询服务器，在模型上高得多。但这种HTTP的PUSH的方式实际上有着重重困难如长连接的资源消耗，否则也早大规模实现了。<br />
&nbsp;&nbsp;&nbsp; <a href="http://blogs.webtide.com/gregw/2006/08/03/1154583360000.html" title="Jetty"><font color="#551a8b">Cometed with Jetty</font></a> ，<a href="http://tomcat.apache.org/tomcat-6.0-doc/aio.html" title="Tomcat 6.0"><font color="#551a8b">Advanced IO and Tomcat 6.0</font></a>&nbsp; ，<a href="https://grizzly.dev.java.net/" title="Glassfish的Grizzy子项目"><font color="#551a8b">Glassfish的Grizzy子项目</font></a> ，三个项目在NIO的基础上分别用自己的方法作了支持，而Non-blocking input/output，Delay request handling/response close，Blocking - Non-blocking notification是Servlet 3.0的统一要求。</p>
<p goog_ds_charindex="145">&nbsp;&nbsp;&nbsp;&nbsp;<u><font color="#800080"><a href="http://blog.csdn.net/mozilla/archive/2007/06/20/1658732.aspx">Comet实现的新选择</a></font></u>&nbsp;(dlee)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-6807&amp;yr=2007&amp;track=8">Real-World Comet-Based Applications</a>(Javaone2007)</p>
<p goog_ds_charindex="145"><strong>REST</strong></p>
<p goog_ds_charindex="145">&nbsp;&nbsp;&nbsp;&nbsp; REST作为最轻量级的Service方案(<u><font color="#0000ff">轻的，谁都会写的Service方案--REST与JSON</font></u>)，本来需要框架辅助的东西就不多。如果硬说有，就是URL Mapping，并分拆URL中的参数，以及结果集的转换。<a href="https://cetia4.dev.java.net/" title="Cetia4">Cetia4</a>就是作类似的东西，但在又冒出一堆的REST框架来之前，Servlet3.0先规范一下无疑是好的，真的被无数MVC框架吓怕了。</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><span style="COLOR: #000000">@UriTemplate(&ldquo;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">images</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">{imageid}&rdquo;)<br />
</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MyRestService&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@HttpMethod<br />
&nbsp;&nbsp;&nbsp;&nbsp;@ProduceMime(&ldquo;application</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">jpeg&rdquo;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;InputStream&nbsp;getImage(&nbsp;@UriParam(&ldquo;imageid&rdquo;)&nbsp;String&nbsp;imageId){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
</div>
<p goog_ds_charindex="145"><strong>其他方向</strong></p>
<ul>
    <li>
    <div goog_ds_charindex="145">Ajax继续发展：Dojo，Yahoo，Spry，Scriptaculous，GWT。</div>
    </li>
    <li>
    <div goog_ds_charindex="145">Mashup：Web2.0 与Portal的发展进入Mashup时代。<a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-6676&amp;yr=2007&amp;track=8"><font color="#800080">Blueprints for Mashups: Practical Strategies, Tips, and Code for Designing and Building</font></a>(Javaone2007)</div>
    </li>
    <li>
    <div goog_ds_charindex="145">Feeds (RSS/Atom)继续发展：Yahoo pipes, Google Data，尤其是Atom,IETF的feed format 与publishing protocol, not only for blog。Project有ROME、ROME-Propono、Abdera。</div>
    </li>
    <li>
    <div goog_ds_charindex="145">Scripting：在Server端用Script如Javascript编程。Sun的Phobos项目，<a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-6957&amp;yr=2007&amp;track=8">Project Phobos: Server-Side Scripting for the Java Platform</a>(Javaone2007)</div>
    </li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/93805#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Jun 2007 08:20:33 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/93805</link>
        <guid>http://calvin.javaeye.com/blog/93805</guid>
      </item>
      <item>
        <title>设计美好的服务器(4)--Mule ESB笔记</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/92093" style="color:red;">http://calvin.javaeye.com/blog/92093</a>&nbsp;
          发表时间: 2007年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a name="Mule-Overview" class=""></a>Overview</h2>
<ul>
    <li><span class="nobr"><a href="http://mule.codehaus.org/" linktext="Mule|http://mule.codehaus.org/" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/">Mule<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://calvin.javaeye.com/blog/92093" linktext="Mule ESB笔记(花钱的年华)|http://calvin.javaeye.com/blog/92093" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://calvin.javaeye.com/blog/92093">Mule ESB笔记(花钱的年华)<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://mule.mulesource.org/download/attachments/4585/Mule+Training+--+Ricston.pdf?version=1" linktext="Mule Training(MuleConf2007)|http://mule.mulesource.org/download/attachments/4585/Mule+Training+--+Ricston.pdf?version=1" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.mulesource.org/download/attachments/4585/Mule+Training+--+Ricston.pdf?version=1">Mule Training(MuleConf2007)<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://today.java.net/lpt/a/418" linktext="Exploring ESB Patterns with Mule(java.net)|http://today.java.net/lpt/a/418" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://today.java.net/lpt/a/418">Exploring ESB Patterns with Mule(java.net)<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://www.theserverside.com/tt/articles/content/CaseStudyMule/article.html" linktext="Mule: A Case Study(TSS)|http://www.theserverside.com/tt/articles/content/CaseStudyMule/article.html" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.theserverside.com/tt/articles/content/CaseStudyMule/article.html">Mule: A Case Study(TSS)<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://www.infoq.com/articles/Evolutionary-integration" linktext="Evolutionary integration with ESBs(InfoQ) |http://www.infoq.com/articles/Evolutionary-integration" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www.infoq.com/articles/Evolutionary-integration">Evolutionary integration with ESBs(InfoQ) <sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mule的运作能力非常强，商业的支持公司Mulesource.com，给大家贡献代码的MuleForge.org，2007年大会MuleConf2007，CXF的作者，SaleForces的CXO......</p>
<h2><a name="Mule-Features" class=""></a>Features</h2>
<ul>
    <li>*企业服务总线的主要特性：*Pluggable的传输层，转换器，路由器三者是ESB的公共核心功能，同时Mule还是《Enterprise Intergration Patterns》与 <a href="http://wiki.springside.org.cn/display/calvin/Mule+SEDA" linktext="SEDA|Mule SEDA" linktype="raw" title="Mule SEDA" mce_href="/display/calvin/Mule+SEDA">SEDA</a>&thinsp;(Staged Event-Driven Architecture)的遵循者。&nbsp;</li>
    <li>*企业服务总线的其他特性：*事务、安全、异常管理 ，JMX管理架构。</li>
    <li>*Service Container：*Mule作为一个ESB，并不纯粹。UMO的角色很灵活，既可以是什么都不干的Bridge Componet成为真正的ESB，也可以是业务POJO，让Mule成为一个Service Container。&nbsp;作为Container，有多通信协议，有SEDA，有JMX监控，也不错。</li>
    <li>*流程编排：*<span class="nobr"><a href="http://mule.mulesource.org/download/attachments/4585/Mule+and+BPM%2C+BPEL+-+Travis+Carlson.pdf?version=1" linktext="Mule and BPM, BPEL |http://mule.mulesource.org/download/attachments/4585/Mule+and+BPM%2C+BPEL+-+Travis+Carlson.pdf?version=1" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.mulesource.org/download/attachments/4585/Mule+and+BPM%2C+BPEL+-+Travis+Carlson.pdf?version=1">Mule and BPM, BPEL <sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;，&nbsp; 因为Mule的不纯粹的Bus，对于组合服务它并没有像BEA那样提供统一的流程编写语言，如果使用每个节点inBound-outBound-inBound的定义会看得很郁闷，与而jBPM结合未知。但它提供了使用UMO(POJO)在代码级进行服务编排的可能。</li>
    <li>*Cluster：*群集是它暂时还不支持的死穴，而BEA，ServiceMix都使用JMS的底层，用JMS群集来实现负载均衡，如果系统失效，JMS会回滚，将任务交给另一个消费者。而Mule使用vm queue来在每个节点间流动，也支持XA，也可以设置在shutdown时持久化到文件。<span class="nobr"><a href="http://mule.mulesource.org/display/MULE/Clustering" linktext="Wiki中的计划|http://mule.mulesource.org/display/MULE/Clustering" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.mulesource.org/display/MULE/Clustering">Wiki中的计划<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;Cluster功能，有像BEA、ServiceMix那样跑JMS底层，有使用TerraCotta的实现计划。</li>
</ul>
<h2><a name="Mule-%E6%9E%B6%E6%9E%84" class=""></a>架构</h2>
<p><img src="http://images.mulesource.org/mule-stack.gif" border="0" align="absMiddle" imagetext="http://images.mulesource.org/mule-stack.gif" mce_src="http://images.mulesource.org/mule-stack.gif" alt="" /><br />
可以看出Mule的架构分三大块，传输层一块，POJO一块，还有一块运行时管理模块。</p>
<h3><a name="Mule-TransportProvider" class=""></a><strong>Transport Provider</strong></h3>
<p>Transport 是ESB最苦力的部分，Mule支持了WebService(Axis,XFire,CXF)/REST、Ejb/Rmi、Email、Jdbc、Tcp/Udp、Xmpp、VM、Ftp、File、Quartz，还有一些Transport如vfs、IBM MQ，藏在某个sandbox代码分支或者muleforge.org中。</p>
<p>名词：Provider由Message Receiver/Dispatcher，Connector，Adapter组成。<br />
Message Receiver/Dispatcher负责具体收发，Connector负责与外系统的连接，Adapter负责转换协议特殊的数据格式，取得一些协议相关参数，比如http的Content-Length。Endpoint 定义了Transport+地址，如jms://topic:myTopic&nbsp;</p>
<ul>
    <li><span class="nobr"><a href="http://mule.codehaus.org/display/MULE/Transports+Guide" linktext="Transport Guide|http://mule.codehaus.org/display/MULE/Transports+Guide" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/display/MULE/Transports+Guide">Transport Guide<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><span class="nobr"><a href="http://mule.codehaus.org/display/MULE/Writing+Transports" linktext="Writing Transports|http://mule.codehaus.org/display/MULE/Writing+Transports" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/display/MULE/Writing+Transports">Writing Transports<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
</ul>
<h3><a name="Mule-Filter%E3%80%81Router%E3%80%81Transformer" class=""></a><strong>Filter、Router、Transformer</strong></h3>
<p>在mule里各种模式通常只是一个名词，要把《EIP》摆在手边，参考其描述与用例。</p>
<ul>
    <li><strong>Router</strong><br />
    动态的、宣告式的、基于内容的路由、基于规则的路由、BPEL、过滤、分解、聚合、重排<br />
    <span class="nobr"><a href="http://mule.codehaus.org/display/MULE/Message+Routers" linktext="http://mule.codehaus.org/display/MULE/Message+Routers" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/display/MULE/Message+Routers">http://mule.codehaus.org/display/MULE/Message+Routers<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><strong>Filter</strong><br />
    <span class="nobr"><a href="http://mule.codehaus.org/display/MULE/Filters" linktext="http://mule.codehaus.org/display/MULE/Filters" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/display/MULE/Filters">http://mule.codehaus.org/display/MULE/Filters<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
    <li><strong>Transformer</strong> 转换、包装、扩充、规范、压缩、加密、编码<br />
    <span class="nobr"><a href="http://mule.codehaus.org/display/MULE/Transformers" linktext="http://mule.codehaus.org/display/MULE/Transformers" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/display/MULE/Transformers">http://mule.codehaus.org/display/MULE/Transformers<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
</ul>
<h3><a name="Mule-UMOComponent" class=""></a><strong>UMO Component</strong></h3>
<ul>
    <li>Entrypoint Resolver，消息-&gt;UMO方法的解释与调度。</li>
    <li>对象容器，基于Spring。</li>
    <li>UMO对象池，基于Apache Common &nbsp;Pools。</li>
    <li>Interceptor ，默认有log和profile.&nbsp;&nbsp;</li>
    <li><span class="nobr"><a href="http://mule.codehaus.org/display/MULE/Writing+Components" linktext="Writing UMO|http://mule.codehaus.org/display/MULE/Writing+Components" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.codehaus.org/display/MULE/Writing+Components">Writing UMO<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;&nbsp;&nbsp;</li>
</ul>
<h2><a name="Mule-Misc" class=""></a>Misc</h2>
<ul>
    <li><span class="nobr"><a href="http://wiki.springside.org.cn/download/attachments/2598/javazone-2005-mule-real-world-old.rar?version=1" linktext="Loan Broker示例讲解|^javazone-2005-mule-real-world-old.rar" linktype="raw" title="javazone-2005-mule-real-world-old.rar attached to Mule" mce_href="/download/attachments/2598/javazone-2005-mule-real-world-old.rar?version=1">Loan Broker示例讲解<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/link_attachment_7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/link_attachment_7.gif" width="7" /></sup></a></span>&thinsp;&nbsp;Loan Broker是ESB最常用的示例，JavaZone2005上对Mule</li>
    <li><span class="nobr"><a href="http://www4.java.no/presentations/javazone/2007/slides/5521.pdf" linktext="Mule 2 and Beyond|http://www4.java.no/presentations/javazone/2007/slides/5521.pdf" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www4.java.no/presentations/javazone/2007/slides/5521.pdf">Mule 2 and Beyond<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;、<span class="nobr"><a href="http://mule.mulesource.org/download/attachments/4585/Mule+Roadmap+Discussion+-+Ross+Mason.pdf?version=1" linktext="Mule Roadmap Discussion|http://mule.mulesource.org/download/attachments/4585/Mule+Roadmap+Discussion+-+Ross+Mason.pdf?version=1" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.mulesource.org/download/attachments/4585/Mule+Roadmap+Discussion+-+Ross+Mason.pdf?version=1">Mule Roadmap Discussion<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;、<span class="nobr"><a href="http://mule.mulesource.org/download/attachments/4585/Mule+and+Spring+-+Ross+Mason.pdf?version=1" linktext="Mule and Spring|http://mule.mulesource.org/download/attachments/4585/Mule+and+Spring+-+Ross+Mason.pdf?version=1" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.mulesource.org/download/attachments/4585/Mule+and+Spring+-+Ross+Mason.pdf?version=1">Mule and Spring<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;、<span class="nobr"><a href="http://mule.mulesource.org/download/attachments/4585/Mule+and+OSGi+-+Travis+Carlson.pdf?version=1" linktext="Mule and OSGi|http://mule.mulesource.org/download/attachments/4585/Mule+and+OSGi+-+Travis+Carlson.pdf?version=1" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://mule.mulesource.org/download/attachments/4585/Mule+and+OSGi+-+Travis+Carlson.pdf?version=1">Mule and OSGi<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp; Mule未来计划的会议PPT。</li>
    <li><span class="nobr"><a href="http://www4.java.no/presentations/javazone/2007/slides/5482.pdf" linktext="Enterprise Service Bus HOWTO|http://www4.java.no/presentations/javazone/2007/slides/5482.pdf" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://www4.java.no/presentations/javazone/2007/slides/5482.pdf">Enterprise Service Bus HOWTO<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;</li>
</ul>
<p>&thinsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://calvin.javaeye.com/blog/92093#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Jun 2007 16:39:18 +0800</pubDate>
        <link>http://calvin.javaeye.com/blog/92093</link>
        <guid>http://calvin.javaeye.com/blog/92093</guid>
      </item>
      <item>
        <title>轻的，谁都会写的Service方案--REST与JSON</title>
        <author>江南白衣</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://calvin.javaeye.com">江南白衣</a>&nbsp;
          链接：<a href="http://calvin.javaeye.com/blog/91900" style="color:red;">http://calvin.javaeye.com/blog/91900</a>&nbsp;
          发表时间: 2007年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a name="RESTfulService-1.REST" class=""></a><strong>1.REST</strong></h2>
<h3><a name="RESTfulService-1.1%E7%BC%98%E8%B5%B7" class=""></a>1.1 缘起</h3>
<p>&nbsp;&nbsp;&nbsp; N年前，一说到跨平台的服务方案，大牛们就想到&quot;Socket Server&quot;，小兵们就一直退，退到会议室的墙角。<br />
&nbsp;&nbsp;&nbsp; 几年前，一说到跨平台的服务方案，连客户都会想到&quot;Web Service&quot;。<br />
&nbsp;&nbsp;&nbsp; 现在，是个人都可以，在几分钟里，使用REST风格把一个服务的客户端和服务端写出来。</p>
<h3><a name="RESTfulService-1.2%26nbsp%3B%E5%88%9D%E8%A7%81%26nbsp%3B" class=""></a>1.2&nbsp;初见&nbsp;</h3>
<p>&nbsp;&nbsp;&nbsp; REST首先是一个词，然后代表了一种服务提供模式。嗯，圣贤说，任意服务协议，都可以拆成传输协议，服务模式，数据格式三维表达，那REST就是依赖http作为传输机制，request-reponse模式，数据是预先协商好的任意格式。</p>
<p>&nbsp;&nbsp;&nbsp; 结果，任何语言的客户端，随便用一个http库访问某个URL，将请求信息写成XML或JSON或纯字符串，放在POST实体中。服务端也任意的实现一个servlet甚至jsp/asp/php，接收客户端发过来的请求，返回XML/JSON/字符串的结果就完了。</p>
<p>&nbsp;&nbsp;&nbsp;So Easy，心里是不是立刻就想到了实现的方式。Java里用<span class="nobr"><a href="http://jakarta.apache.org/commons/httpclient" linktext="Apache的HttpClient|http://jakarta.apache.org/commons/httpclient" linktype="raw" title="Visit page outside Confluence" rel="nofollow" mce_href="http://jakarta.apache.org/commons/httpclient">Apache的HttpClient<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" border="0" height="7" align="absMiddle" alt="" mce_src="/images/icons/linkext7.gif" width="7" /></sup></a></span>&thinsp;&nbsp;发送一个POST请求。</p>
<div command="code" class="macro" macrot