<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>devilbaby</title>
    <description></description>
    <link>http://devilbaby.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>提高Liferay生产环境下的性能</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/202971" style="color:red;">http://devilbaby.javaeye.com/blog/202971</a>&nbsp;
          发表时间: 2008年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">&nbsp;&nbsp;&nbsp; 最近总能听到抱怨</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Liferay</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的性能不好，作为一个开源的项目，其实也是很正常的事情。不过从</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">vesion 4.3.x</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">开始，性能明显有了很大的提高。从影响程序性能的角度来看，</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Liferay</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的确违背了编写高性能代码的宗旨，不过由于合理的运用了</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Cache</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">，所以性能还是可以让人满意的。在生产环境中，我们要做的就是停掉一些用不到的功能和一些方便开发人员</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">debug</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的配置就可以了。具体可以参考下图：</span></p>
<p>&nbsp;</p>
<p><img src="../../upload/picture/pic/15993/bf90aae3-dcb9-3ae9-86d6-e88eba30426f.png" height="275" alt="liferay performance" width="1075" /></p>
<p>&nbsp;</p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">网站：<a href="http://www.hrocc.org" target="_blank">http://www.hrocc.org</a> 这个是调整过参数后的网站，大家可以看看</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">另外引起性能问题基本上都会程序低效的原因，程序低效的原因可以归纳为：</span></p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><img src="../../upload/picture/pic/15991/5a81e999-ef1a-39c3-814c-8679a863e1e6.png" height="225" alt="inefficient algorithms" width="865" /></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/202971#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jun 2008 14:57:54 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/202971</link>
        <guid>http://devilbaby.javaeye.com/blog/202971</guid>
      </item>
          <item>
        <title>OpenID实现多系统整合的用户同步解决方案</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/197370" style="color:red;">http://devilbaby.javaeye.com/blog/197370</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 最近特别多人问我关于如何用</span>
<span lang="EN-US">liferay</span>
<span style="font-family: 宋体;">整合多个不相关的系统，其中整合其中一个必须面对的问题就是每个系统都有自己的用户管理，所以必须让多个系统的用户统一管理起来，我的提议就是用</span>
<span lang="EN-US">LDAP</span>
<span style="font-family: 宋体;">，但是一般这个方案很多公司都不太愿意采用，原因是要多维护一样东西，往往最后他们宁愿多开发一个数据表，然后自己去管理这些用户信息也不想让</span>
<span lang="EN-US">LDAP</span>
<span style="font-family: 宋体;">来管理这些。</span>
<span lang="EN-US">Anyway</span>
<span style="font-family: 宋体;">，我觉得一套成熟的技术提供的解决方案会在以后的维护中减少很多不必要的风险，毕竟成熟的技术是现成的，就算换一个人只要简单的培训一下就可以管理起来，而重新设计一个表，毕竟做一个方方面面都能考虑到的设计是很困难的事情，所以这样做到后期可能维护成本是用</span>
<span lang="EN-US">LDAP</span>
<span style="font-family: 宋体;">的好几倍。</span>

</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">技术是场革命，永远都是向前走，</span>
<span lang="EN-US">OpenID</span>
<span style="font-family: 宋体;">就是我今天要和大家说的另一个解决用户同步问题的方案。</span>
<span lang="EN-US">OpenID</span>
<span style="font-family: 宋体;">在中国可能并不受大家所熟悉：</span>
<span lang="EN-US">OpenID is an open, decentralized,
free framework for user-centric digital identity.</span>
<span style="font-family: 宋体;">（</span>
<span lang="EN-US" style="letter-spacing: 0.4pt;">OpenID</span>
<span style="letter-spacing: 0.4pt; font-family: 宋体;">是一种开放、离散式的用于用户数字标识的开源框架。</span>
<span style="font-family: 宋体;">）就等于是你的</span>
<span lang="EN-US">passport</span>
<span style="font-family: 宋体;">，现在</span>
<span lang="EN-US">Google</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">Yahoo</span>
<span style="font-family: 宋体;">都已经提供了</span>
<span lang="EN-US">OpenID</span>
<span style="font-family: 宋体;">的服务了，一般新技术都是需要那些大头去推的。同时</span>
<span lang="EN-US">liferay</span>
<span style="font-family: 宋体;">也支持</span>
<span lang="EN-US">OpenID</span>
<span style="font-family: 宋体;">的应用，用起来也很简单，具体参照</span>
<span lang="EN-US"><a href="http://wiki.liferay.com/index.php/Using_OpenID_with_Liferay">http://wiki.liferay.com/index.php/Using_OpenID_with_Liferay</a>
</span>
<span style="font-family: 宋体;">，在这就不做太多说明了。更多</span>
<span lang="EN-US">OpenID</span>
<span style="font-family: 宋体;">相关的技术也可以访问</span>
<span> <span lang="EN-US"><a href="http://openid.net/">http://openid.net/</a>
</span>
</span>
<span style="font-family: 宋体;">。</span>

</p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">这里只是针对多系统整合的用户同步问题多提供一个解决方案，个人认为</span>
<span lang="EN-US"> OpenID </span>
<span style="font-family: 宋体;">会有一定的发展，但是要一个非常非常漫长的过程。其实一般对于同一个问题往往解决方案都不止一个，只要通过比较、风险测算，找一个适合自己的方案就可以了。</span>
</p>
<p class="MsoNormal">&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/197370#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 27 May 2008 11:43:27 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/197370</link>
        <guid>http://devilbaby.javaeye.com/blog/197370</guid>
      </item>
          <item>
        <title>liferay4.4.x关于Message Boards的bug</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/178563" style="color:red;">http://devilbaby.javaeye.com/blog/178563</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; Message Boards在liferay4.4.x的版本中增加了一个配置:是否允许匿名用户增加话题</p><p>&nbsp;</p><pre name="code" class="xml"> #
 # Set this to true to allow anonymous posting.
 #
  message.boards.anonymous.posting.enabled=true</pre><p>&nbsp;可是这个功能根本就没有测试过,成为bug也变得顺理成章.具体出现bug的代码在<br />com.liferay.portal.util.PropsUtil中</p><pre name="code" class="java">	public static final String MESSAGE_BOARDS_ANONYMOUS_POSTING_ENABLED = &quot;message.boards.expire.ban.job.interval&quot;;</pre><p>&nbsp;应该改为</p><pre name="code" class="java">	public static final String MESSAGE_BOARDS_ANONYMOUS_POSTING_ENABLED = &quot;message.boards.anonymous.posting.enabled&quot;;</pre><p>这个明显就是拷贝后忘记修改内容而导致的错误.原来外国人编程和我们中国人没两样嘛.一个低级的错误,可是能隐藏得很深.</p><p>希望liferay以后要加强测试,毕竟有7,8年历史的开源项目,如果测试能更上去的话，那将会更让人期待。</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/178563#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 01 Apr 2008 20:53:59 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/178563</link>
        <guid>http://devilbaby.javaeye.com/blog/178563</guid>
      </item>
          <item>
        <title>利用Liferay开发portal应用(插件)</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/163631" style="color:red;">http://devilbaby.javaeye.com/blog/163631</a>&nbsp;
          发表时间: 2008年02月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">随着</span><span>portal</span><span style="font-family: 宋体">的应用在中国越来越广泛，越来越受欢迎，</span><span>Liferay</span><span style="font-family: 宋体">在中国的用户数也随之增长。每个</span><span>Liferay</span><span style="font-family: 宋体">的开发人员都会面临一个问题，到底通过应用</span><span>liferay</span><span style="font-family: 宋体">的哪种方式进行开发是最好的呢？</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">我认为在</span><span>Liferay</span><span style="font-family: 宋体">上开发</span><span>portal</span><span style="font-family: 宋体">主要有两种方法：</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">第一种，利用</span><span>Extension Environment</span><span style="font-family: 宋体">形式进行开发，设置</span><span>Extension Environment</span><span style="font-family: 宋体">的方法网上已有很多，在这里不再做详细说明，大家可以参考官方的</span><span><a href="http://wiki.liferay.com/index.php/Setting_up_the_Extension_Environment">http://wiki.liferay.com/index.php/Setting_up_the_Extension_Environment</a></span><span style="font-family: 宋体">，或者我们</span><span>group</span><span style="font-family: 宋体">里面的</span><span><a href="http://liferay.group.javaeye.com/group/blog/126024">http://liferay.group.javaeye.com/group/blog/126024</a></span><span style="font-family: 宋体">。</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">用该方式进行开发存在着以下问题：</span></p><p class="MsoNormal" style="text-indent: 21pt"><span>1</span><span style="font-family: 宋体">）和</span><span>Liferay</span><span style="font-family: 宋体">绑定得太紧，从</span><span>version4.1</span><span style="font-family: 宋体">到</span><span>version4.2</span><span style="font-family: 宋体">目录结构发生变化，从</span><span>version4.2</span><span style="font-family: 宋体">到</span><span>version4.3</span><span style="font-family: 宋体">底层程序实现发生变化。这样结果就是，我们升级存在着一定的风险，虽然官方提供了升级方案，但是随着数据的增长了，开发过程的不规范，升级带来的风险是无法估计的；</span></p><p class="MsoNormal" style="text-indent: 21pt"><span>2</span><span style="font-family: 宋体">）开发成本，</span><span>Liferay</span><span style="font-family: 宋体">用的是类似</span><span>MDA</span><span style="font-family: 宋体">模型的构架，但是过度使用设计模式和代码的复杂性，让开发成本不能保持在一个相对底的水平，更重要的是他的代码没有注释，学习起来比较费劲，这样的一个结果就是必须要有水平相对高的程序员去做这方面的研究，防止出异常后无法解决。</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">第二种，利用</span><span>plugin</span><span style="font-family: 宋体">的形式进行开发，</span><span>plugin</span><span style="font-family: 宋体">的概念</span><span>liferay</span><span style="font-family: 宋体">很早就已经有了，但是一直表现得不是很强，相对的例子也比较少。从</span><span>Liferay4.3</span><span style="font-family: 宋体">开始，</span><span>plugin</span><span style="font-family: 宋体">在这个</span><span>portlet container</span><span style="font-family: 宋体">上面有了非常强的体现，官方发布了专门开发</span><span>plugin</span><span style="font-family: 宋体">的</span><span>SDK</span><span style="font-family: 宋体">，</span><span>hot deploy</span><span style="font-family: 宋体">的</span><span>bugs</span><span style="font-family: 宋体">也比前几个版本减少了不少。</span><span>Plugin</span><span style="font-family: 宋体">支持</span><span>java</span><span style="font-family: 宋体">、</span><span>php</span><span style="font-family: 宋体">、</span><span>ruby&hellip;</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">现在我们看看通过</span><span>plugin</span><span style="font-family: 宋体">开发</span><span>portlet</span><span style="font-family: 宋体">到底有哪些必需元素，以</span><span>java</span><span style="font-family: 宋体">的开发为例，</span><span>liferay-plugin-package.properties</span><span style="font-family: 宋体">和</span><span>liferay-plugin-package.xml</span><span style="font-family: 宋体">――对</span><span>plugin</span><span style="font-family: 宋体">的一个描述，包括需要下载的</span><span>tld</span><span style="font-family: 宋体">文件和</span><span>jar</span><span style="font-family: 宋体">文件；</span><span>liferay-display.xml</span><span style="font-family: 宋体">――</span><span>portlet</span><span style="font-family: 宋体">所属的</span><span>category</span><span style="font-family: 宋体">；</span><span>portlet.xml</span><span style="font-family: 宋体">和</span><span>liferay-portlet.xml</span><span style="font-family: 宋体">――这两个文件如果接触过</span><span>liferay</span><span style="font-family: 宋体">的人都不会陌生，就是对</span><span>portlet</span><span style="font-family: 宋体">的详细描述。这几个文件是必需的，</span><span>liferay</span><span style="font-family: 宋体">的就是通过解析这几个文件，通过</span><span>listener</span><span style="font-family: 宋体">来把你的应用以</span><span>portlet</span><span style="font-family: 宋体">的形式发布并加载到这个</span><span>container</span><span style="font-family: 宋体">里面。而</span><span>portlet</span><span style="font-family: 宋体">加载后，直接访问你的应用是通过</span><span>portal-bridge</span><span style="font-family: 宋体">进行的。</span></p><p class="MsoNormal" style="text-indent: 21pt"><span>p.s. </span><span style="font-family: 宋体">4.3的版本plugin通过修改tomcat的classloader的机制</span><span style="font-family: 宋体">，修改一些context的配置</span></p><span style="font-family: 宋体"><pre name="code" class="xml">&lt;Context&gt;
	&lt;Loader 
		loaderClass=&quot;com.liferay.support.tomcat.loader.PortalClassLoader&quot;
	/&gt;
&lt;/Context&gt;</pre><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">让当前的war包能共享liferay war中的所有jar包，各自的应用只需要保留自己的</span><span>jar</span><span style="font-family: 宋体">包（在</span><span>liferay</span><span style="font-family: 宋体">中没有）就可以了。</span></p></span><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">开发</span><span>plugin</span><span style="font-family: 宋体">最简单的方法是用官方提供的</span><span>SDK</span><span style="font-family: 宋体">，直接运行</span><span>ant</span><span style="font-family: 宋体">命名或已经定义好的脚本，就可以生成相关的应用。</span></p><p class="MsoNormal" style="text-indent: 21pt"><img src="../../../upload/picture/pic/8070/7a7f0a4c-66cf-3baa-a837-aa288e1a5a3c.jpg" border="0" height="308" alt="" width="178" /></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">例如，我要生成一个名为</span><span>&rdquo;hello world&rdquo;</span><span style="font-family: 宋体">的</span><span>portlet</span><span style="font-family: 宋体">，只需要在</span><span>portlets</span><span style="font-family: 宋体">下运行脚本：</span><span>create hello-world &ldquo;hello word&rdquo;</span><span style="font-family: 宋体">就会自动生成一个名为</span><span>&rdquo;hello world&rdquo;</span><span style="font-family: 宋体">的项目，必需的所有配置文件都已经自动的生成</span></p><p class="MsoNormal" style="text-indent: 21pt"><img src="../../../upload/picture/pic/8074/51f2ebd9-039d-3cc0-9f3f-4829391f9665.jpg" border="0" height="322" alt="" width="280" /></p><p class="MsoNormal" style="text-indent: 21pt"><span>p.s.</span><span style="font-family: 宋体">个人来说我并不喜欢他自动生成的目录结构，既然是用</span><span>plugin</span><span style="font-family: 宋体">的形式进行开发，那直接用自己喜欢的目录结构和开发方法，最后在加上这些配置文件就好了。</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">同样的方法，你可以开发</span><span>theme</span><span style="font-family: 宋体">，</span><span>layouttpl</span><span style="font-family: 宋体">等等</span></p><p class="MsoNormal" style="text-indent: 21pt"><img src="../../../upload/picture/pic/8072/14b7d64a-f4c5-3af6-9105-f2e09e7b1100.jpg" border="0" height="169" alt="" width="172" /></p><p class="MsoNormal"><span>Conclusion</span><span style="font-family: 宋体">：</span><span>Liferay</span><span style="font-family: 宋体">是一个非常好的</span><span>portlet container</span><span style="font-family: 宋体">，由于文档的缺少，代码的复杂性，升级的频繁性等等问题，如果直接用</span><span>Liferay</span><span style="font-family: 宋体">进行二次开发，会带来不少的风险。所以个人的观点是把</span><span>Liferay</span><span style="font-family: 宋体">只看成是一个</span><span>portlet container</span><span style="font-family: 宋体">，作为一个建站工具，应用他的用户管理和权限管理的功能，然后通过</span><span>plugin</span><span style="font-family: 宋体">的形式，用你自己熟悉的方式进行开发，然后再发布到</span><span>Liferay</span><span style="font-family: 宋体">中，这样能把风险降到最低。</span></p><p class="MsoNormal" style="text-indent: 21pt"><span style="font-family: 宋体">（转载请注明出处）</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/163631#comments" style="color:red;">已有 <strong>16</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Feb 2008 14:58:02 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/163631</link>
        <guid>http://devilbaby.javaeye.com/blog/163631</guid>
      </item>
          <item>
        <title>Liferay -- Terracotta solution</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/91861" style="color:red;">http://devilbaby.javaeye.com/blog/91861</a>&nbsp;
          发表时间: 2007年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 在这个论坛里面，相信也有不少的人在研究liferay portal，liferay在potal container方面也慢慢地超过了其他开源的portal container，当越来越多企业想运用liferay作为portal解决方案的时候，未免会担忧性能方面是否能达到HA（p.s.在前段时间对单机版的liferay做了个性能测试，详见http://devilbaby.javaeye.com/blog/81140），而且liferay默认的server是以用tomcat，而移植到weblogic方面的方案也是收费的，所以很多企业都是处于一种观望的态度。<br />
&nbsp;&nbsp;&nbsp; Terracotta－－JVM-level Clustering的一个方案（p.s.如果不了解Terracotta的同学可以参看http://devilbaby.javaeye.com/blog/88466）。能否把liferay和Terracotta整合起来做个solution呢？针对此问题，我做了个尝试，但似乎liferay对session的处理有的特殊，在cluster的时候，和Terracotta整合起来并不友好，而且存在一定的bug：http://forums.terracotta.org/forums/posts/list/280.page，这个问题我已经提交给Terracotta去处理，而且受到了Taylor（Terracotta product manager）和liferay方面的关注http://forums.terracotta.org/forums/posts/list/286.page。<br />
<br />
[quote=&quot;<span class="postbody"><cite>Michael Young</cite></span>&quot;]<br />
<span class="postbody"> We would absolutely like to collaborate to provide a Liferay -- Terracotta solution. We are in our planning stages for our next release and would love to make this integration an item on our roadmap. <br />
[/quote]<br />
<br />
似乎liferay那边对Terracotta也很感兴趣，打算在下个release和terracotta合作<br />
Taylor给我回的信息说第一次的appointment会定在6月21号<br />
感兴趣的朋友可以一直关注，欢迎大家发表自己的意见</span><span class="gensmall"></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/91861#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Jun 2007 11:01:54 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/91861</link>
        <guid>http://devilbaby.javaeye.com/blog/91861</guid>
      </item>
          <item>
        <title>JVM-level clustering</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/88466" style="color:red;">http://devilbaby.javaeye.com/blog/88466</a>&nbsp;
          发表时间: 2007年06月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt"><font size="3"><font face="宋体"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">前段时间一直在运用<span lang="EN-US">memcached</span>来保存<span lang="EN-US">session</span>的集群方案，这的确是实现<span lang="EN-US">HA</span>和<span lang="EN-US">HP</span>的一个好方案。但是在实现上还存在不少的<span lang="EN-US">bug</span>。我和大家分享另外一种<span lang="EN-US">HA</span>方案：<span lang="EN-US">JVM</span>堆级群集。<span lang="EN-US"><o:p></o:p></span></span></font></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt"><font size="3"><font face="宋体"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>JVM-level clustering</span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">主要是通过<span lang="EN-US">terracotta</span>来实现，<span lang="EN-US">terracotta</span>在<span lang="EN-US">2003</span>年成立，代码是最近才开源的，<span lang="EN-US">license</span>对企业也没有太大的限制，据相关的报道，<span lang="EN-US">terracotta</span>正努力劝服<span lang="EN-US">sun</span>，让<span lang="EN-US">JVM-level clustering</span>成为标准，嵌入到<span lang="EN-US">JDK</span>中。然后它的企业版应用主要是靠服务攒钱，它的战略有点象<span lang="EN-US">Redhat</span>。在这里我先介绍一下<span lang="EN-US">Terracotta<o:p></o:p></span></span></font></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face="宋体"><font size="3"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">Terracotta</span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">到底是什么呢？官方是这样定义的：</span><span lang="EN-US" style="FONT-SIZE: 12pt; mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Open Terracotta is an enterprise-class, open-source, JVM-level clustering solution. JVM-level clustering simplifies enterprise Java by enabling applications to be deployed on multiple JVMs, yet interact with each other as if they were running on the same JVM. Terracotta extends the Java Memory Model of a single JVM to include a cluster of virtual machines such that threads on one virtual machine can interact with threads on another virtual machine as if they were all on the same virtual machine with an unlimited amount of heap.</span></font></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face="宋体"><font size="3"><span lang="EN-US" style="FONT-SIZE: 12pt; mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"></span></font><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><font face="宋体"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp;</span>Terracotta</span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">实现了什么？<span lang="EN-US"><o:p></o:p></span></span></font></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font size="3" face="宋体">1）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp; </span></span></span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><font size="3"><font face="宋体">堆级的复制：集群时需要拷贝的对象在堆之间进行<span lang="EN-US"><o:p></o:p></span></font></font></span></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font size="3" face="宋体">2）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp; </span></span></span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><font size="3"><font face="宋体">超大的虚拟堆：由于是<span lang="EN-US">JVM</span>层次的集群，所以堆要比单个<span lang="EN-US">JVM</span>大很多<span lang="EN-US"><o:p></o:p></span></font></font></span></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font size="3" face="宋体">3）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp; </span></span></span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><font size="3" face="宋体">多种集群锁语法：</font></span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt">distributed wait/notify and synchronized</span><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font size="3" face="宋体">4）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp; </span></span></span><font face="宋体"><span style="FONT-SIZE: 9pt; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt; mso-ascii-font-family: Arial">运行实时监控</span><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font size="3" face="宋体">5）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp; </span></span></span><font face="宋体"><span style="FONT-SIZE: 9pt; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt; mso-ascii-font-family: Arial">无需序列化实现集群</span><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font size="3" face="宋体">6）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp; </span></span></span><font size="3"><font face="宋体"><span lang="EN-US" style="mso-font-kerning: 0pt">Find-Grained Changes</span><span style="mso-font-kerning: 0pt">：由于集群时，<span lang="EN-US">terracotta</span>不要求序列化，所以对象拷贝可以细化到对象中的每一个<span lang="EN-US">field</span>，就是说在进行<span lang="EN-US">replication</span>的时候，当对象发生变化的时候，不需要整个对象进行拷贝，只需要拷贝发生变化的那个<span lang="EN-US">field</span>。<span lang="EN-US">P.s.</span>这点也是我最喜欢的，这对于性能的提高会有明显的效果</span><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></font></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-font-kerning: 0pt"><o:p><font size="3" face="宋体">&nbsp;</font></o:p></span></p>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 21pt"><font size="3"><font face="宋体"><span lang="EN-US" style="mso-font-kerning: 0pt">Terracotta</span><span style="mso-font-kerning: 0pt">能给我们做什么？（这个很简单，我也不做翻译了）<span lang="EN-US"><o:p></o:p></span></span></font></font></p>
<ul type="disc">
    <li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 19.2pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt">HTTP Session Replication - Tomcat, Weblogic, Websphere <o:p></o:p></span></li>
    <li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 19.2pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt">Distributed Cache - from java.util.Hashmap to OSCache, we support it, <o:p></o:p></span></li>
    <li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 19.2pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt">Work/Manager Distributed Queries - Coordination is easy with Terracotta. We even have code to get you started on the <a href="http://www.terracotta.org/confluence/display/orgsite/Forge" title="Forge"><span style="COLOR: #333333; mso-bidi-font-size: 12.0pt">Terracotta Forge</span></a> <o:p></o:p></span></li>
    <li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 19.2pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt">POJO Clustering/Spring integration- Everything from Spring Beans to java.util.HashMap <o:p></o:p></span></li>
    <li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 19.2pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Arial; mso-font-kerning: 0pt">Collaboration/Coordination - Use a queue, use distributed wait/notify, or even <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html" title="Visit page outside Confluence"><span style="COLOR: #333333; mso-bidi-font-size: 12.0pt">Cyclic Barrier</span><sup><span style="COLOR: #333333; TEXT-DECORATION: none; text-underline: none"><v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html" visit="" title="" id="_x0000_i1025" page="" type="#_x0000_t75" o:button="t" outside="" alt="" style="WIDTH: 5.25pt; HEIGHT: 5.25pt"><v:imagedata o:href="mhtml:file://J:\open_source\terracotta\doc\What%20Is%20Terracotta%20DSO%20-%20Open%20Terracotta%20-%20Terracotta.mht!http://www.terracotta.org/confluence/images/icons/linkext7.gif" src="file:///C:\DOCUME~1\Anson\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"></v:imagedata></v:shape></span></sup></a>(<a href="http://blog.terracottatech.com/archive/2005/08/fun_with_dso_an.html" title="Visit page outside Confluence"><span style="COLOR: #333333; mso-bidi-font-size: 12.0pt">We love Cycle Barrier</span><sup><span style="COLOR: #333333; TEXT-DECORATION: none; text-underline: none"><v:shape href="http://blog.terracottatech.com/archive/2005/08/fun_with_dso_an.html" visit="" title="" id="_x0000_i1026" page="" type="#_x0000_t75" o:button="t" outside="" alt="" style="WIDTH: 5.25pt; HEIGHT: 5.25pt"> <v:imagedata o:href="mhtml:file://J:\open_source\terracotta\doc\What%20Is%20Terracotta%20DSO%20-%20Open%20Terracotta%20-%20Terracotta.mht!http://www.terracotta.org/confluence/images/icons/linkext7.gif" src="file:///C:\DOCUME~1\Anson\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"></v:imagedata></v:shape></span></sup></a>) with Terracotta coordination across VMs is as easy as coordination across threads <o:p></o:p></span></li>
</ul>
<p class="MsoPlainText" style="MARGIN: 0cm 0cm 0pt 21pt"><font size="3"><font face="宋体"><span lang="EN-US" style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">p.s. tomcat</span><span style="mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">现在支持的版本有<span lang="EN-US">5.0,5.5,6.0;weblogic</span>官方测试过的只有<span lang="EN-US">8.1</span>，<span lang="EN-US">websphere</span>只支持<span lang="EN-US">CE</span>，<span lang="EN-US">6.1</span>预计会在今年夏季测试完成，估计就是最近<a name="WebSearchSessionsLanding-SupportedPlatfo"></a>，如今还支持<span lang="EN-US">Lucence</span>和<span lang="EN-US">Wicket</span>的集群。具体可以查看他的官方网站<span lang="EN-US"><o:p></o:p></span></span></font></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">如果实习</span><span lang="EN-US"><font face="Times New Roman">AOP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的人应该对</span><span lang="EN-US"><font face="Times New Roman">Terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的工作原理很容易理解。</span><span lang="EN-US"><font face="Times New Roman">Terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">一个很重要的概念是</span><span lang="EN-US"><font face="Times New Roman">bytecode instrumentation</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，这种对字节流监控的技术在很多</span><span lang="EN-US"><font face="Times New Roman">AOP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的项目中都用到，例如</span><span lang="EN-US"><font face="Times New Roman">AspectJ</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，</span><span lang="EN-US"><font face="Times New Roman">AspectWerkz</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span lang="EN-US"><font face="Times New Roman">Terrocotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的介绍到此为止。</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"></span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">作为一个</span><span lang="EN-US"><font face="Times New Roman">HA</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">方案的设计者，在运用一项新技术的时候必须评估它给现有项目带来的风险，特别是</span><span lang="EN-US"><font face="Times New Roman">terrcotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">还没有足够的成熟。</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt 37.5pt; TEXT-INDENT: -37.5pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo3; tab-stops: list 37.5pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">1）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">如果运用了</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，我们现有的项目需要有哪些方面的修改，这点我估计也是大家最关心的。由于</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">运用了</span><span lang="EN-US"><font face="Times New Roman">bytecode instrumentation</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的技术，所以我们现有的项目基本上不需要做任何修改。</span><span lang="EN-US"><font face="Times New Roman">Terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">提供一个配置文件</span><span lang="EN-US"><font face="Times New Roman">tc-config.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，我们只需要在这个配置文件里配置一些必须参数就可以实现集群（</span><span lang="EN-US"><font face="Times New Roman">p.s.</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">官方提供了</span><span lang="EN-US"><font face="Times New Roman">pojo</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，</span><span lang="EN-US"><font face="Times New Roman">spring</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，</span><span lang="EN-US"><font face="Times New Roman">tomcat</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，</span><span lang="EN-US"><font face="Times New Roman">weblogic</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的预配置模版；这点比用</span><span lang="EN-US"><font face="Times New Roman">memcached</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">来保存</span><span lang="EN-US"><font face="Times New Roman">session</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">要简单，而且考虑的问题要少，毕竟官方就支持用</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">来管理</span><span lang="EN-US"><font face="Times New Roman">session</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">）。我现在的项目是在</span><span lang="EN-US"><font face="Times New Roman">tomcat</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">下跑，需要做集群，众所周知，</span><span lang="EN-US"><font face="Times New Roman">tomcat</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">集群的</span><span lang="EN-US"><font face="Times New Roman">replication</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">性能是非常非常低的，但是如果运用</span><span lang="EN-US"><font face="Times New Roman">sticky</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式的话就不能完全实现</span><span lang="EN-US"><font face="Times New Roman">failuer-over</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。在这个时候</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">就解决了这个问题，我用</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">来管理我的</span><span lang="EN-US"><font face="Times New Roman">session</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，由于它不需要序列话和它</span><span lang="EN-US"><font face="Times New Roman">find grained changes</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的机制，所以不存在大对象拷贝的问题，例如我有十个点，其中一个点发生了变化，它不会立刻把变化拷贝到所有点上，只会当某个点需要变化的时候才把变化发送到该点上。我从一些监控工具里面发现，</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">捕获了所有</span><span lang="EN-US"><font face="Times New Roman">httpsession</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">到</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的</span><span lang="EN-US"><font face="Times New Roman">sessiondata</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中，你会发现根本不存在</span><span lang="EN-US"><font face="Times New Roman">httpsession</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">相当于一个代理，当</span><span lang="EN-US"><font face="Times New Roman">httpsession getAttribute</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的时候，代理会从</span><span lang="EN-US"><font face="Times New Roman">sessiondata</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中取到相对应的值，然后付给</span><span lang="EN-US"><font face="Times New Roman">httpsession</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，具体的实现有兴趣的可以看看源代码</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt 37.5pt; TEXT-INDENT: -37.5pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo3; tab-stops: list 37.5pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">2）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">性能的变化，把</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">集成到项目后性能是否能有明显的提升？在官方文档中，对</span><span lang="EN-US"><font face="Times New Roman">terracotta http session clustering</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">weblogic8.1 http session clustering</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">做了一个比较（如果大家感兴趣的话，我可以以后配合实际再写篇有关</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">方面性能测试的文章），结果让人比较让人惊讶</span></font></p>
<table class="MsoTableGrid" cellspacing="0" border="1" cellpadding="0" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><font face="Times New Roman"><strong><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPS-BoldMT; mso-bidi-font-family: TimesNewRomanPS-BoldMT; mso-font-kerning: 0pt">Measure</span></strong><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPS-BoldMT; mso-bidi-font-family: TimesNewRomanPS-BoldMT; mso-font-kerning: 0pt"><o:p></o:p></span></font></p>
            </td>
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><font face="Times New Roman"><strong><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPS-BoldMT; mso-bidi-font-family: TimesNewRomanPS-BoldMT; mso-font-kerning: 0pt">Gain from Terracotta</span></strong><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPS-BoldMT; mso-bidi-font-family: TimesNewRomanPS-BoldMT; mso-font-kerning: 0pt"><o:p></o:p></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPSMT; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt"><font face="Times New Roman">Throughput<o:p></o:p></font></span></p>
            </td>
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPSMT; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt"><font face="Times New Roman">67% increase in TPS<o:p></o:p></font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2">
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US"><font size="3" face="Times New Roman">Memory Use</font></span></p>
            </td>
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPSMT; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt"><font face="Times New Roman">6-7 x reduction in garbage collection cycles<o:p></o:p></font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes">
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US"><font size="3" face="Times New Roman">Latency</font></span></p>
            </td>
            <td valign="top" width="287" style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 215.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt">
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt">&Oslash; </span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPSMT; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt"><font face="Times New Roman">50% reduction<o:p></o:p></font></span></p>
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt">&Oslash; </span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPSMT; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt"><font face="Times New Roman">Queue depth never exceeds 125, vs. 280-<o:p></o:p></font></span></p>
            <p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"><font face="Times New Roman"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: TimesNewRomanPSMT; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt">560 for WebLogic</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><o:p></o:p></span></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt 37.5pt; TEXT-INDENT: -37.5pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo3; tab-stops: list 37.5pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font face="Times New Roman"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font size="3">3）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US"><font size="3">Terracotta</font></span></font><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的扩展性。</span><span lang="EN-US"><font face="Times New Roman">Terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">是纯</span><span lang="EN-US"><font face="Times New Roman">java</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">编写的，源码开源，可以自己修改源代码进行扩展。而且</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">很活跃，从它的策略来看，会有不错的发展和不久就会流行起来。</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt 37.5pt; TEXT-INDENT: -37.5pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo3; tab-stops: list 37.5pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">4）</font><span new="" times="" style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">从这点来看</span><span lang="EN-US"><font face="Times New Roman">Terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">相当一个中央服务器，那会不会</span><span lang="EN-US"><font face="Times New Roman">terracotta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">出现</span><span lang="EN-US"><font face="Times New Roman">single-point</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的问题呢？</span><span lang="EN-US"><font face="Times New Roman">terracotta server</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">本身支持集群</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt 37.5pt; TEXT-INDENT: -37.5pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo3; tab-stops: list 37.5pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"></span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 好像写得太多了。说说我现在项目的</span><span lang="EN-US"><font face="Times New Roman">HA</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">方案吧，我正在实现和测试的方案是这样的：</span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span lang="EN-US"><font face="Times New Roman">Apache</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">＋</span><span lang="EN-US"><font face="Times New Roman">5 tomcat</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">＋</span><span lang="EN-US"><font face="Times New Roman">2 terrcotta server cluster</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">＋</span><span lang="EN-US"><font face="Times New Roman">2 mysql cluster</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，在这个方案中还是存在单点问题，就是</span><span lang="EN-US"><font face="Times New Roman">apache</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，我曾经考虑过用四层交换机来代替</span><span lang="EN-US"><font face="Times New Roman">apache</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">做</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">balance</font></span></font></p>
<p class="MsoNormal" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><font size="3"><span lang="EN-US"><font face="Times New Roman"><br />
</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">感兴趣的同学，欢迎对</span><span lang="EN-US"><font face="Times New Roman">JVM-level Clustering</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和我的</span><span lang="EN-US"><font face="Times New Roman">HA</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">方案进行讨论</span></font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/88466#comments" style="color:red;">已有 <strong>24</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 09 Jun 2007 13:07:03 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/88466</link>
        <guid>http://devilbaby.javaeye.com/blog/88466</guid>
      </item>
          <item>
        <title> Liferay（专业版）性能测试</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/81140" style="color:red;">http://devilbaby.javaeye.com/blog/81140</a>&nbsp;
          发表时间: 2007年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span lang="EN-US"><font face="Times New Roman">
<p><font size="2" face="Arial">本测试主要是模拟10，30，100个用户并发登陆的情况。<br />
测试环境：<br />
CPU ：core2 6300@1.86ghz<br />
RAM ：2GB<br />
OS ： winxp pro sp2（en）<br />
Server ：tomcat5.1.7(java &ndash;Xmx768m，maxThread调为300)<br />
DB ：MySQL5</font><font size="2" face="Arial"><br />
JDK ：1.5.0_11<br />
Tool ：LR<br />
场景：<br />
模拟10，30，100个超级用户并发登陆，成功登陆后都有权限并自动加载：calculate, clock, workflow, admin, communities, enterprise admin, calendar七个portlet<br />
我在登陆动作submit前定义了集合点，登陆和每个portlet都定义了独立的事务，目的是看每个portlet加载的时间</font></p>
<p><font size="2" face="Arial">10 vusers：5 seconds<br />
&nbsp;<img src="http://devilbaby.javaeye.com/upload/picture/pic/3397/302506d7-651e-4473-b7e8-125db25f2213.jpg" alt="10个并发用户" /></font></p>
<p><font size="2" face="Arial">30 vusers：15seconds</font></p>
<p><font size="2" face="Arial"><img src="http://devilbaby.javaeye.com/upload/picture/pic/3398/88b84be6-fef9-4e1e-a41d-0f7718168376.jpg" alt="30个并发用户" /><br />
</font><font face="Arial"></font></p>
<p><font size="2" face="Arial">100 vusers：1 minute and 12 seconds</font></p>
<p><font size="2" face="Arial"><img src="http://devilbaby.javaeye.com/upload/picture/pic/3399/650dd086-e9c6-4eac-9546-7c1ed3535060.jpg" alt="100个并发用户" /><br />
</font></p>
<p><font size="2" face="Arial">补充说明：这个数据在忽略网络带来的影响下进行的，往往很多在线系统对性能影响最大的还是网络。<br />
简单分析：<br />
由于在忽略网络影响的情况下进行测试，所以吞吐量和点击率的数据就显得不那么具参考价值，不过我们可以算算每次登陆每个用户的网络吞吐量大概是194,915b左右，大家可以结合自己当地的网络情况，计算一下需要多长时间去处理这个bytes。<br />
一个比较乐观的结果是，从10个并发到100个并发都能全部pass<br />
现在我们来看看login这个事务需要多长的时间，这里的login是输入密码后点登陆，从出现正在登陆的进度条，到页头出现的整个过程。我们先看看10个vusers的情况，90 per执行该事务需要1.847s，这个数字我认为很乐观，众所周知，liferay的登陆对用于进行了很复杂的认证，跑了几个process，设置了n次attribute，所以这个处理时间是很快的了。30个并发的时候，90％vusers通过的时间为4.362，这个时间有点长，但是从Std. Deviation这个值看来，不到0.4，所以我认为是相对的稳定，而响应时间都是可以接受的范围里。我们在看看100个并发时，时间高到26.762s，而Std. Deviation的值也比较大，这个时间是不能让人满意的，这点有一大部分的责任应该归咎于tomcat，因为tomcat处理高并发的性能确实不好。<br />
现在我们来看看portlet的加载时间，因为portlet的加载是异步加载的，所以我们来抽取其中一个portlet来进行分析，我这里选择calendar。Calendar的加载时间从0.3 到1.248到8.686s，且标准差的值基本在0.5s范围内徘徊，所以说这个响应时间我认为是在一个可让人接受。</font></p>
<p><font size="2" face="Arial">结论：<br />
很多人说portal的性能不好，从上面的报表和分析可以看出，liferay portal的性能是不错的，这个结果和我一些项目的测试结果进行了一些比较，发觉portal的性能和一般的jsp，servlet作为展现层的性能是差不多的，借助于ajax，还有liferay多处缓存的设置，甚至有些性能还比传统的模式要优胜。所以，我认为一个公司启动一个项目的时候，考虑是否用liferay，不应该把评估的标准放在响应速度上，应该放在些别的方面，例如：liferay的学习成本比较高，不单单要先熟悉portal的标准，而且liferay的文档比较小，很多时候都是要直接debug源码去理解liferay。还有你的项目是否适合用portal，因为每个portlet都是代表一个比较独立的应用，如果portlet间的交互很多，用liferay会带来一定的难度，尽管都是可以实现。<br />
另外：tomcat的并发性能确实不好，web的处理性能也不好，我加入了apr，据说可以用在生产环境，但是通过测试，结果也并不理想。<br />
Liferay如果通过tomcat做集群，是件比较痛苦的事情，<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">因为缓存和</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">session</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">同步要付出不少代价。</span><br />
p.s.个人认为liferay是个优秀的项目，而且他的活动性很强，在很多企业需求功能上都有比较好的解决方案，可以省事不少。但是我认为liferay有点过度设计，代码比较冗余，可能这个很多是历史遗留下来的问题。<br />
希望这篇文章能对大家有帮助：）<br />
</font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</font></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/81140#comments" style="color:red;">已有 <strong>10</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 May 2007 20:39:00 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/81140</link>
        <guid>http://devilbaby.javaeye.com/blog/81140</guid>
      </item>
          <item>
        <title>Liferay多用户通过不同session同时登陆</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/70605" style="color:red;">http://devilbaby.javaeye.com/blog/70605</a>&nbsp;
          发表时间: 2007年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 最近做性能和压力测试的时候想起一个问题，就是是否在同一ip只能登陆一个user。</p>
<p>&nbsp;&nbsp;&nbsp; 一般来说，每次打开一个新的ie窗口，应该是建立一个新的进程，就是说产生不同的session(p.s.我的机器是一个ie一个线程)。在liferay中，默认情况下是能根据不同的session同时登陆不同的用户。根据不同的需要，我们可以修改配置文件，在portal-ext.properties中加上这样一个配置</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="attribute">auth.simultaneous.logins</span><span>=</span><span class="attribute-value">false</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>当上述配置的值为false的时候，liferay就不允许用户根据不同的session同时登陆不同的用户，从而实现一个ip只能登陆一个user的操作。也可根据需要定制不同的测试策略。<br />
对应程序：<font face="Arial">PortalRequestProcessor</font><br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//&nbsp;Authenticated&nbsp;users&nbsp;may&nbsp;not&nbsp;be&nbsp;allowed&nbsp;to&nbsp;have&nbsp;simultaneous&nbsp;logins </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">boolean</span><span>&nbsp;simultaenousLogins&nbsp;=&nbsp;GetterUtil.getBoolean( &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;PropsUtil.get(PropsUtil.AUTH_SIMULTANEOUS_LOGINS),&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!simultaenousLogins)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Boolean&nbsp;staleSession&nbsp;= &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Boolean)ses.getAttribute(WebKeys.STALE_SESSION); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;((user&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&amp;&amp;&nbsp;(staleSession&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&amp;&amp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(staleSession.booleanValue()))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;_PATH_PORTAL_ERROR; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/70605#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Apr 2007 11:40:00 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/70605</link>
        <guid>http://devilbaby.javaeye.com/blog/70605</guid>
      </item>
          <item>
        <title>Liferay同时连接多个数据库及其事务问题</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/59248" style="color:red;">http://devilbaby.javaeye.com/blog/59248</a>&nbsp;
          发表时间: 2007年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;<font face="宋体">&nbsp;&nbsp;&nbsp;</font><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">运用的是</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">spring</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">框架，从早期版本开始，就可以同时连接多个数据库应用，但是在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的文档还是代码中都没有关于同时连接多个数据库的说明，从</span><st1:chsdate isrocdate="False" month="12" islunardate="False" day="30" w:st="on" year="1899"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">4.2.0</span></st1:chsdate><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的版本开始出现了连接多个数据库的文档（请参照</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">liferay wiki</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">：<font face="Arial">http://wiki.liferay.com/index.php/Connecting_to_Another_Datasource/Database</font>），代码中也有相应的明确定义。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">首先我们来看他的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">liferay-service-builder_4_2_0.dtd</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Element column</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中增加了两项属性</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">data-source CDATA #IMPLIED</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">和</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>session-factory CDATA #IMPLIED</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，对于这两个属性文档中是这样描述的：</span></p>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>The&nbsp;data-source&nbsp;value&nbsp;specifies&nbsp;the&nbsp;the&nbsp;data&nbsp;source&nbsp;target&nbsp;that&nbsp;is&nbsp;set&nbsp;to&nbsp;the &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>persistence&nbsp;</span><span class="keyword">class</span><span>.&nbsp;The&nbsp;</span><span class="keyword">default</span><span>&nbsp;value&nbsp;is&nbsp;the&nbsp;Liferay&nbsp;data&nbsp;source.&nbsp;This&nbsp;is&nbsp;used&nbsp;in &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>conjunction&nbsp;with&nbsp;session-factory. &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>The&nbsp;session-factory&nbsp;value&nbsp;specifies&nbsp;the&nbsp;the&nbsp;session&nbsp;factory&nbsp;that&nbsp;is&nbsp;set&nbsp;to&nbsp;the &nbsp;&nbsp;</span> </li>
    <li class=""><span>persistence&nbsp;</span><span class="keyword">class</span><span>.&nbsp;The&nbsp;</span><span class="keyword">default</span><span>&nbsp;value&nbsp;is&nbsp;the&nbsp;Liferay&nbsp;session&nbsp;factory.&nbsp;This&nbsp;is &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>used&nbsp;in&nbsp;conjunction&nbsp;with&nbsp;data-source &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span>&nbsp;<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">由此可见，通过定义这两个属性，可以把自定义的某个</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">entity</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">指定不同的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">datasource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">和</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">sessionfactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，从而实现连接不同的数据库。例如，我们按照</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">wiki</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中的文章增加了一个</span><span lang="EN" style="mso-ansi-language: EN">ext-spring-training.xml</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的定义文件，然后我们就可以把</span><span lang="EN" style="mso-ansi-language: EN">entity</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN" style="mso-ansi-language: EN">datasource</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定为</span><span lang="EN" style="mso-ansi-language: EN">trainingDataSource</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN" style="mso-ansi-language: EN">sessionfactory</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定为</span><span lang="EN" style="mso-ansi-language: EN">trainingSessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN" style="mso-ansi-language: EN"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN" style="mso-ansi-language: EN"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定了多个不同的数据库，取得了不同的</span><span lang="EN" style="mso-ansi-language: EN">connection</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，那从不同的</span><span lang="EN" style="mso-ansi-language: EN">sessionfactory</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得到了不同的</span><span lang="EN" style="mso-ansi-language: EN">transaction instance</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，大家担心的就是分段式事务问题，而</span><span lang="EN" style="mso-ansi-language: EN">liferay</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的事务处理是由</span><span lang="EN" style="mso-ansi-language: EN">spring support</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，我们可以先看看</span><span lang="EN" style="mso-ansi-language: EN">spring</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">PlatformTransactionManager</span></p>
<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;PlatformTransactionManager&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp; TransactionStatus&nbsp;getTransaction(TransactionDefinition&nbsp;definition) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">&nbsp; throws</span><span>&nbsp;TransactionException; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">&nbsp; void</span><span>&nbsp;commit(TransactionStatus&nbsp;status)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;TransactionException; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">&nbsp; void</span><span>&nbsp;rollback(TransactionStatus&nbsp;status)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;TransactionException; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">当程序由于事务问题抛出异常的时候，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-ansi-language: EN-US; mso-font-kerning: 1.0pt; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">spring</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">文档是这样描述的:<br />
&nbsp; </span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><font color="#339966"><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">Again in keeping with Spring's philosophy, the </span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">TransactionException </span><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">that can be thrown by any of the<o:p></o:p></span></font></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><font color="#339966"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">PlatformTransactionManager </span><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">interface's methods is <em>unchecked </em>(i.e. it extends the<o:p></o:p></span></font></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><font color="#339966"><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">java.lang.RuntimeException </span><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">class). Transaction infrastructure failures are almost invariably fatal. In rare<o:p></o:p></span></font></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt"><font color="#339966">cases where application code can actually recover from a transaction failure, the application developer can still<o:p></o:p></font></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><font color="#339966"><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">choose to catch and handle </span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">TransactionException</span><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">. The salient point is that developers are not <em>forced </em>to do so.</span></font></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">看</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">spring</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的源码，你会发现当程序在运行过程中抛出</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">unchecked exception</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的时候，</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">transaction</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">会设为</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">rollback only</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">status</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">从而回滚事务。所以我们设想只要抛出unchecked exception的时候，事务很同时回滚。通过测试，事务不能同时回滚。主要原因是因为处于不同的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">sessionfactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中，就是说两个事务之间没有任何的联系。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">分布式事务，</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">ejb</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">方有个很好的解决方案，至于在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中如何运用，还需时间去研究。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">这样的活动性高的开源平台下做开发，未免升级时候会遇到种种问题，其中一个就是数据库的升级问题，所以一个很好的方案是把</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的数据库和业务数据库分开。虽然事务没有按预期测试成功，但是对于多个没有事务关联的数据库来说，这个是个很好的解决方案，而且连接不同数据库是通过配置完成，对开发人员是透明的。希望这篇文章能对运用</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的朋友有帮助。同时，欢迎大家针对连接多个数据库的方案特别是事务问题作出讨论。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none">&nbsp;</p>
</span></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/59248#comments" style="color:red;">已有 <strong>6</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 12 Mar 2007 12:46:00 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/59248</link>
        <guid>http://devilbaby.javaeye.com/blog/59248</guid>
      </item>
          <item>
        <title>高级软件工程师</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/56540" style="color:red;">http://devilbaby.javaeye.com/blog/56540</a>&nbsp;
          发表时间: 2007年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.喜欢写代码，编程功底扎实，代码简洁漂亮； <br />2.熟悉J2EE体系结构，有分布式开发，集群开发经验的优先<br />3.对struts/spring/hibernate 有过2-3个项目的经验；<br />4.熟悉Linux操作系统，熟悉ORACLE，MYSQL，DB2, SQL SERVER等数据库中至少一种<br />5.对portal开发有一定的经验,熟悉liferay portal的优先<br />6.有WebLogic、JBoss、WebSphere平台开发、调优的经验<br />7.对SOA，Webservice有经验，有具体实践<br />8.熟悉TCP/IP等网络协议，有网络安全经验的优先<br />9. 精通测试流程、测试工具和测试方法及熟悉相关的背景知识，善于编写单元测试代码 <br />10.有性能测试经验，熟悉运用JProfiler,Load Runner的优先<br />11.熟悉wfmc规范，有一定的工作流开发和建模经验，熟悉jbpm的优先<br />12.具有快速解决问题的能力<br /><br /><br />2,3,6必须<br /><br />下面四选一：<br />5<br />8<br />9，10<br />11<br /><br />待遇根据能力面谈，有意者发邮件到anson.chen@deluker.com
          <br/><br/>
          <span style="color:red;">
            <a href="http://devilbaby.javaeye.com/blog/56540#comments" style="color:red;">已有 <strong>23</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 28 Feb 2007 17:40:22 +0800</pubDate>
        <link>http://devilbaby.javaeye.com/blog/56540</link>
        <guid>http://devilbaby.javaeye.com/blog/56540</guid>
      </item>
          <item>
        <title>liferay权限开发（一）</title>
        <author>devilbaby</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devilbaby.javaeye.com">devilbaby</a>&nbsp;
                    链接：<a href="http://devilbaby.javaeye.com/blog/52048" style="color:red;">http://devilbaby.javaeye.com/blog/52048</a>&nbsp;
          发表时间: 2007年02月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;
<p class="MsoNormal"><span lang="EN-US">HOWTO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang="EN-US">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">权限开发（一）</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">权限控制是</span><span lang="EN-US">liferay4.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以后增加的新特性。在</span><span lang="EN-US">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中开发权限是一件很容易的事情，基本上都是通过定义</span><span lang="EN-US">xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现。</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，我们来看看给自己的</span><span lang="EN-US">portlet</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加上权限控制，主要要完成以下四步操作（</span><span lang="EN-US">DRAC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US">1.</span><span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"> Define all resources and their permissions.<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先定义所有所需要的权限（包括</span><span lang="EN-US">portlet resource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">model resource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt">2. For all the resources defined in step 1, register them into the permission system. This is also known<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt">simply as &ldquo;adding resources.&rdquo;<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当定义完权限后，我们需要把权限的定义注册到权限系统中，即把权限相关信息保存到数据库中</span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt">3. Associate the necessary permissions to these resources.<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把所需的</span><span lang="EN-US">permission</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关联到</span><span lang="EN-US">resources</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上</span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt">4. Check permission before returning resources.<o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在相应的位置加上权限检验的方法</span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在解析上面四个步骤以前，有两个定义是非常重要的：</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 59.25pt; TEXT-INDENT: -37.5pt; mso-list: l0 level1 lfo1; tab-stops: list 59.25pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">Resource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">－在</span><span lang="EN-US">portal</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统中，可以简单的认为</span><span lang="EN-US">Resource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个个可以操作的实体对象。举个例子：一般</span><span lang="EN-US">resources</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括</span><span lang="EN-US">portlets</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（如：</span><span lang="EN-US">Message Boards</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">Calendar</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US"> etc</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），</span><span lang="EN-US">java</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类（如：</span><span lang="EN-US">Message Board Topics</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">Calendar Events</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US"> etc</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）还有</span><span lang="EN-US">flies</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（如：</span><span lang="EN-US">documents</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">images</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">etc</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 59.25pt; TEXT-INDENT: -37.5pt; mso-list: l0 level1 lfo1; tab-stops: list 59.25pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2．<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">Permission</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">－一个个可运行的权限动作，都已经在</span><span lang="EN-US">resourcez</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中定义了。举个例子：&ldquo;查看</span><span lang="EN-US">calendar</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">portlet</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&rdquo;这个权限动作已经通过</span><span lang="EN-US">resource</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">liferay</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的权限系统中定义</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21.75pt"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面来简单解析一下开发权限的四个步骤：</span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一．</span><strong><span lang="EN-US" style="FONT-SIZE: 14.5pt; mso-font-kerning: 0pt">Defining Resources and Actions</span></strong><span lang="EN-US" style="FONT-SIZE: 10pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认的权限定义的</span><span lang="EN-US">xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件放</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">portal/portal-ejb/classes/resource-actions</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">中</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier"><v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier"><img src="http://devilbaby.javaeye.com/upload/picture/pic/2164/bdac2c46-b3c1-4c40-afc8-393cd8750b2c.jpg" alt="" /></span></p>
<p class="MsoNormal" align="left" style="TEXT-ALIGN: left; mso-layout-grid-align: none"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">我们来看看</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">calendar</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">的权限定义</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier"><o:p></o:p></span></p>
<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">resource-action-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">portlet-resource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">portlet-name</span><span class="tag">&gt;</span><span>8</span><span class="tag"><span class="tag-name">portlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">supports</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>ADD_EVENT</span><span class="tag"><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>CONFIGURATION</span><span class="tag"><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>VIEW</span><span class="tag"><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">supports</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">community-defaults</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>VIEW</span><span class="tag"><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">community-defaults</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">guest-defaults</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>VIEW</span><span class="tag"><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">guest-defaults</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">guest-unsupported</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>ADD_EVENT</span><span class="tag"><span class="tag-name">action-key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">guest-unsupported</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">portlet-resource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">model-resource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="ta