<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://fyjava.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>使用rewrite module解决SSL访问问题</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/208902" style="color:red;">http://fyjava.javaeye.com/blog/208902</a>&nbsp;
          发表时间: 2008年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出自：<a href="http://operamasks.blogbus.com/logs/23496723.html">http://operamasks.blogbus.com/logs/23496723.html</a>
</p>
<p>&nbsp;</p>
<p>Apache +
Apusic的集群，client到Apache端采用的是双向SSL连接，Apache到Apusic走的是http。应用的虚拟访问路径为
/test，当访问https://hostname/test/时，Apache能够正常跳转到Apusic，而当访问
<a href="https://hostname/test" target="_blank">https://hostname/test</a>时，Apache不能正常跳转。</p>
<p>&nbsp;</p>
<p>解决办法：</p>
<p>&nbsp;</p>
<p>启用Apache的rewrite module（可能需要重新编译） ，将/test访问重定向到该应用下的欢迎页面，配置片段参考如下：</p>
<p>&nbsp;</p>
<div><span class="809501815-17062008">LoadModule rewrite_module 
modules/mod_rewrite.so</span>
</div>
<p>
<span class="809501815-17062008">rewriteengine on<br />
rewriterule ^/test$ https://hostname/test/index.jsp</span>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/208902#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jun 2008 10:25:38 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/208902</link>
        <guid>http://fyjava.javaeye.com/blog/208902</guid>
      </item>
      <item>
        <title>Apusic支持GZIP压缩</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/208901" style="color:red;">http://fyjava.javaeye.com/blog/208901</a>&nbsp;
          发表时间: 2008年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出自：<a href="http://operamasks.blogbus.com/logs/23676900.html">http://operamasks.blogbus.com/logs/23676900.html</a>
</p>
<p>&nbsp;</p>
<p>在Apusic 5.1中，支持GZIP压缩。GZIP压缩主要用于当带宽成为性能瓶颈的场合。启用GZIP压缩很简单，只需要在Muxer服务中，添加一个EnableGZip的属性，并设置为True，即可。示例配置如下：</p>
<p>&lt;SERVICE<br />
&nbsp;&nbsp;&nbsp; CLASS=&quot;com.apusic.net.Muxer&quot;<br />
&nbsp;&nbsp;&nbsp; &gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;Port&quot; VALUE=&quot;6888&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;Backlog&quot; VALUE=&quot;50&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;Timeout&quot; VALUE=&quot;300&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;MaxWaitingClients&quot; VALUE=&quot;200&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;WaitingClientTimeout&quot; VALUE=&quot;5&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;SSLEnabled&quot; VALUE=&quot;True&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;SecurePort&quot; VALUE=&quot;6889&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;KeyStore&quot; VALUE=&quot;config/sslserver&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;KeyPassword&quot; VALUE=&quot;keypass&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ATTRIBUTE NAME=&quot;EnableGZip&quot; VALUE=&quot;True&quot;/&gt;<br />
&lt;/SERVICE&gt; </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/208901#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jun 2008 10:21:15 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/208901</link>
        <guid>http://fyjava.javaeye.com/blog/208901</guid>
      </item>
      <item>
        <title>使用jconsole监控Apusic</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/198137" style="color:red;">http://fyjava.javaeye.com/blog/198137</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出自：&nbsp;<a href="http://operamasks.blogbus.com/logs/21824589.html">http://operamasks.blogbus.com/logs/21824589.html</a>
</p>
<p>&nbsp;</p>
<p>JDK 1.5+提供了jconsole工具，可以对JVM实例的堆、线程等使用情况进行实时监控。Apusic支持jconsole，不过JMX地址串有点难记，可以写到一个脚本startjconsole.cmd中，放到JDK_HOME/bin目录，内容参考如下：</p>
<p>jconsole -interval=5 -notile service:jmx:iiop:///jndi/corbaname::1.2@localhost:6888#jmx/rmi/RMIConnectorServer</p>
<p>其中 localhost:6888即服务器所在的地址和端口。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/198137#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 10:09:15 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/198137</link>
        <guid>http://fyjava.javaeye.com/blog/198137</guid>
      </item>
      <item>
        <title>IBM JDK 选项</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/198128" style="color:red;">http://fyjava.javaeye.com/blog/198128</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出自： <a href="http://operamasks.blogbus.com/logs/21800310.html">http://operamasks.blogbus.com/logs/21800310.html</a>
</p>
<p>&nbsp;</p>
<p>以下选项是非标准选项，可随时更改，而不另行通知。<br />
<br />
&nbsp; -Xbootclasspath:&lt;path&gt;&nbsp;&nbsp;&nbsp; 将引导类路径设置为 &lt;path&gt;<br />
&nbsp; -Xbootclasspath/p:&lt;path&gt;&nbsp; 将 &lt;path&gt; 附加在引导类路径前面<br />
&nbsp; -Xbootclasspath/a:&lt;path&gt;&nbsp; 将 &lt;path&gt; 附加到引导类路径后面<br />
<br />
&nbsp; -Xrun&lt;dll&gt;[:options]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动 JVMPI 概要分析<br />
<br />
&nbsp; -Xshareclasses[:options]&nbsp; 启用类数据共享（使用帮助获取详细信息）<br />
<br />
&nbsp; -Xint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅运行已解释的（等同于 -Xnojit -Xnoaot）<br />
&nbsp; -Xnojit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁用 JIT<br />
&nbsp; -Xnoaot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不运行预编译代码<br />
&nbsp; -Xquickstart&nbsp;&nbsp;&nbsp; 通过延迟优化来减少启动时间<br />
&nbsp; -Xfuture&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用最严格的检查，预测未来的缺省值<br />
<br />
&nbsp; -verbose[:{class|gcterse|gc|dynload|sizes|stack|debug}]<br />
<br />
以下选项的参数以字节为单位。<br />
带有后缀&ldquo;k&rdquo;（千）或&ldquo;m&rdquo;（兆）的值会进行相应的计算。<br />
<br />
&nbsp; -Xmca&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将 RAM 类段增量设置为 &lt;x&gt;<br />
&nbsp; -Xmco&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将 ROM 类段增量设置为 &lt;x&gt;<br />
&nbsp; -Xmn&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将初始／最大新空间大小设置为 &lt;x&gt;<br />
&nbsp; -Xmns&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将初始新空间大小设置为 &lt;x&gt;<br />
&nbsp; -Xmnx&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将最大新空间大小设置为 &lt;x&gt;<br />
&nbsp; -Xmo&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将初始／最大旧空间大小设置为 &lt;x&gt;<br />
&nbsp; -Xmos&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将初始旧空间大小设置为 &lt;x&gt;<br />
&nbsp; -Xmox&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将最大旧空间大小设置为 &lt;x&gt;<br />
&nbsp; -Xmoi&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将旧空间增量设置为 &lt;x&gt;<br />
&nbsp; -Xms&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将初始内存大小设置为 &lt;x&gt;<br />
&nbsp; -Xmx&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将内存最大大小设置为 &lt;x&gt;<br />
&nbsp; -Xmr&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将记住的集合大小设置为 &lt;x&gt;<br />
&nbsp; -Xmrx&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将记住的集合的最大大小设置为 &lt;x&gt;<br />
&nbsp; -Xmso&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将操作系统线程堆栈大小设置为 &lt;x&gt;<br />
&nbsp; -Xiss&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将初始 java 线程堆栈大小设置为 &lt;x&gt;<br />
&nbsp; -Xssi&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将 java 线程堆栈增量设置为 &lt;x&gt;<br />
&nbsp; -Xss&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将最大 java 线程堆栈大小设置为 &lt;x&gt;<br />
&nbsp; -Xscmx&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将新共享类高速缓存的大小设置为 &lt;x&gt;<br />
&nbsp; -Xmine&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将堆扩展的最小大小设置为 &lt;x&gt;<br />
&nbsp; -Xmaxe&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将堆扩展的最大大小设置为 &lt;x&gt;<br />
<br />
以下选项的参数以 0 至 1 的小数表示。<br />
值为 0.3 表示请求百分比为 30%<br />
<br />
&nbsp; -Xminf&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GC 之后自由堆的最小百分比<br />
&nbsp; -Xmaxf&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GC 之后自由堆的最大百分比<br />
<br />
以下选项的参数以小数表示。<br />
<br />
&nbsp; -Xgcthreads&lt;x&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置 GC 线程的数量<br />
&nbsp; -Xnoclassgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁用动态类卸装<br />
&nbsp; -Xclassgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用动态类卸装<br />
&nbsp; -Xalwaysclassgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用每个 GC 的动态类卸装<br />
&nbsp; -Xnocompactexplicitgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁用系统 GC 的压缩<br />
&nbsp; -Xcompactexplicitgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用每个系统 GC 的压缩<br />
&nbsp; -Xcompactgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用压缩<br />
&nbsp; -Xnocompactgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁用压缩<br />
&nbsp; -Xlp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用大页面支持<br />
<br />
&nbsp; -Xdbg:&lt;options&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用调试，JDWP 标准选项<br />
&nbsp; -Xrunjdwp:&lt;options&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用调试，JDWP 标准选项<br />
&nbsp; -Xdbginfo:&lt;symbol file path&gt;&nbsp; 启用调试信息服务器<br />
&nbsp; -Xrdbginfo:&lt;host&gt;:&lt;port&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用远程调试信息服务器</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/198128#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 09:44:34 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/198128</link>
        <guid>http://fyjava.javaeye.com/blog/198128</guid>
      </item>
      <item>
        <title>在Apusic上配置虚拟目录</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/198127" style="color:red;">http://fyjava.javaeye.com/blog/198127</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文出自： <a href="http://operamasks.blogbus.com/logs/21769251.html">http://operamasks.blogbus.com/logs/21769251.html</a>
</p>
<p>&nbsp;</p>
<p>Web服务器上有个虚拟目录的概念，比如配置一个访问路径名为images的虚拟目录，则通过http://localhost/images/可以访问到相关资源，而虚拟目录所对应的物理文件路径不必是在应用的物理根目录之下。</p>
<p>在Apusic上部署虚拟目录也比较简单，通过配置一个&ldquo;空应用&rdquo;就行了。下面举例：</p>
<p>Apusic的安装目录为c:\apusic，目录c:\images包含一些图片文件，现想通过http://localhost/images/xx.jpg的方式去访问该目录中的图片。 </p>
<p>配置过程如下：</p>
<p>1. 配置 c:\apusic\config\server.xml，添加如下片段，装载一个名（虚拟路径）为images的Web应用</p>
<p>&lt;application name=&quot;images&quot; base=&quot;c:\images&quot; start=&quot;auto&quot;/&gt;&nbsp;</p>
<p>2.在c:\images目录下创建WEB-INF目录，并在 WEB-INF目录下创建文件web.xml，内容参考如下：</p>
<p>&nbsp;&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;<br />
<br />
&lt;web-app
xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee
<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" target="_blank">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>&quot; version=&quot;2.4&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;display-name&gt;images&lt;/display-name&gt;<br />
&lt;/web-app&gt;</p>
<p>至此配置完毕。</p>
<p>当然还可以进行进一步的配置，如目录是否可以浏览等，也可以添加Filter，加入浏览规则、权限控制、后台统计等功能，甚至可以配置相应的WebDAV功能，进行图片文件的管理等。</p>
<p>配置目录浏览：</p>
<p>在c:\images\WEB-INF\web.xml中，加入下述片段：</p>
<p>&nbsp; &lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;description&gt;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;directoryListing&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;True&lt;/param-value&gt;<br />
&nbsp; &lt;/context-param&gt;</p>
<p>&nbsp;配置WebDAV：</p>
<p>在c:\images\WEB-INF\web.xml中，加入下述片段： </p>
<pre class="programlisting"> &lt;servlet&gt;
     &lt;servlet-name&gt;WebDAV&lt;/servlet-name&gt;     
     &lt;servlet-class&gt;com.apusic.web.webdav.WebDAVServlet&lt;/servlet-class&gt;
     &lt;init-param&gt;
       &lt;param-name&gt;readonly&lt;/param-name&gt;
       &lt;param-value&gt;false&lt;/param-value&gt;
     &lt;/init-param&gt;
     &lt;init-param&gt;
       &lt;param-name&gt;showMetaResource&lt;/param-name&gt;
       &lt;param-value&gt;false&lt;/param-value&gt;
     &lt;/init-param&gt;  
      &lt;init-param&gt;
       &lt;param-name&gt;resourceRoot&lt;/param-name&gt;
       &lt;param-value&gt;/&lt;/param-value&gt;
     &lt;/init-param&gt;     
  &lt;/servlet&gt;
  &lt;servlet-mapping&gt;
      &lt;servlet-name&gt;WebDAV&lt;/servlet-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/198127#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 09:43:07 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/198127</link>
        <guid>http://fyjava.javaeye.com/blog/198127</guid>
      </item>
      <item>
        <title>Apusic中的类装载（classloader）机制</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/198119" style="color:red;">http://fyjava.javaeye.com/blog/198119</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>本文转自Apusic官方文档，详细内容请访问http://infocenter.apusic.com 。</p>
<p>&nbsp;</p>
<h2 class="title" style="clear: both;">配置Classloader</h2>
<p>JavaEE
规范定义了一个打包机制的框架，用来把JavaEE应用的各个部分组织在一起。不同的应用服务器厂商可以自由的设计自己的类装载层次来装载应用中的类和资
源。因此开发者必须非常清楚类和资源应该放置在什么位置对于JavaEE应用才是可用的。理解Apusic应用服务器的类装载体系结构能够帮助
JavaEE应用的开发者设计高效和可移植应用打包结构。本章先介绍类装载的基本概念，然后讨论了Apusic应用服务器的类装载层次是如何设计的。</p>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e1791"></a>
Classloader的基本概念</h3>
</div>
</div>
</div>
<p>Classloader
在运行期会以父/子的层次结构存在，每个Classloader的实例都持有其父Classloader的引用，而父Classloader并不持有子
Classloader的引用，从而形成一条单向链，当一个类装载请求被提交到某个Classloader时，其默认的类装载过程如下：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>检查这个类有没有被装载过，如果已经装载过，则直接返回；</p>
</li>
<li>
<p>调用父Classloader去装载类，如果装载成功直接返回；</p>
</li>
<li>
<p>调用自身的装载类的方法，如果装载成功直接返回；</p>
</li>
<li>
<p>上述所有步骤都没有成功装载到类，抛出ClassNotFoundException；</p>
</li>
</ul>
</div>
<p>每一层次的Classloader都重复上述动作。</p>
<p>简
单说，当Classloader链上的某一Classloader收到类装载请求时，会按顺序向上询问其所有父节点，直至最顶端
（BootstrapClassLoader），任何一个节点成功受理了此请求，则返回，如果所有父节点都不能受理，这时候才由被请求的
Classloader自身来装载这个类，如果仍然不能装载，则抛出异常。</p>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1813"></a>
类装载的方式</h4>
</div>
</div>
</div>
<p>类装载的方式主要有两种：显式的和隐式的。</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>显式类装载</p>
<p>发生在使用以下方法调用进行装载类的时候：</p>
<div class="itemizedlist">
<ul type="circle">
<li>
<p>ClassLoader.loadClass()（使用指定的Classloader进行装载）</p>
</li>
<li>
<p>Class.forName()（使用当前类的Caller Classloader进行装载）</p>
<p>当调用上述方法的时候，指定的Class（以类名为参数）由Classloader装入。这两个方法的行为有轻微的区别，Class.forName()在类装载完成后，会对类进行初始化，而ClassLoader.loadClass()只负责装载类。</p>
</li>
</ul>
</div>
</li>
<li>
<p>隐式类装载</p>
<p>发生在由于引用、实例化或继承导致需要装载类的时候。隐式类装载是在幕后启动的，JVM会解析必要的引用并装载类。</p>
<p>类的装载通常组合了显式和隐式两种方式。例如，Classloader可能先显式地装载一个类，然后再隐式地装载它引用的其它类。</p>
</li>
<li>
<p>类装载发生的时间</p>
<p>从
类装载方式的描述中我们可以看到，只有在显式的调用方法或者实例化、引用、继承一个类时，类才真正被装载。由此，我们可以知道，import并不会导致类
装载，以及，在一个类实例化之前，调用它的静态方法，会导致这个类和它的父类、实现的接口和相关的静态成员的类会被装载，而它的成员变量的类却不会被装载</p>
</li>
</ul>
</div>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1845"></a>
 一个基本的Classloader的层次结构</h4>
</div>
</div>
</div>
<div class="mediaobject">
<table cellspacing="0" border="0" summary="manufactured viewport for HTML img" width="245" cellpadding="0">
<tbody>
<tr style="height: 226px;">
<td align="center"><img src="http://infocenter.apusic.com/help/topic/com.apusic.studio.doc.server/output/eclipse/img/cl1.jpg" align="middle" alt="" width="245" />
</td>
</tr>
</tbody>
</table>
</div>
<p>上
图显示了一个基本的Classloader的层次结构。在给定层次上的Classloader不能引用任何层次低于它的Classloader，另外，它
的子Classloader装载的类对于其是不可见的。在上图中，如果Foo.class是由ClassLoaderB装载的，并且Foo.class依
赖于Bar.class，那么Bar.class必须由ClassLoaderA或B装载。如果Bar.class只是对ClassLoaderC和D可
见，那么将会发生ClassNotFoundException或者NoClassDefFoundError异常。</p>
<p>如果
Bar.class分别对于两个平级的Classloader可见（例如C和D），但对于它们的父Classloader不可见，那么当类装载请求发送到
这两个Classloader时，每一个Classloader会装载自己版本的类。ClassLoaderC装载的Bar.class的实例将不兼容于
ClassLoaderD装载的Bar.class的实例。如果对Classloader的层次结构不了解，试图使用由ClassLoaderC装载的类
去造型一个ClassLoaderD装载的Bar.class的实例，则会发生造型失败（ClassCastException）。</p>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1855"></a>
基本的Classloader</h4>
</div>
</div>
</div>
<p>最基本的Classloader是Bootstrap Classloader和System
        Classloader（也有人称之为AppClassLoader），只要写过java程序，都会用到这两个Classloader。</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Bootstrap Classloader</p>
<p>这
个Classloader装载Java虚拟机提供的基本运行时刻类（$JAVA_HOME/jre/lib），还包括放置在系统扩展目录（$
JAVA_HOME/jre/lib/ext）内的JAR文件中的类。这个Classloader是java程序最顶层的Classloader，只有它
没有父Classloader。如果你将一个自己写的类或第三方jar包放进$JAVA_HOME/jre/lib/ext目录中，那么它将被
Bootstrap Classloader装载。</p>
</li>
<li>
<p>System Classloader</p>
<p>System
Classloader通常负责装载系统环境变量CLASSPATH中设置的类。由System
Classloader装载的类对于Apusic服务器内部的类和部署在Apusic服务器上的J2EE应用（通常打包成ear）都是可见的。%
APUSIC_HOME%/lib目录下的jar文件是Apusic应用服务器的核心类，一般把这些jar文件都加在系统CLASSPATH中。另外，一
些公用类也可以加在系统CLASSPATH中，如JDBC驱动程序等。</p>
</li>
</ul>
</div>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1871"></a>
自定义Classloader</h4>
</div>
</div>
</div>
<p>在
编写应用代码的时候，常常有需要动态加载类和资源，比如显式的调用classLoader.loadClass(&ldquo;ClassName&rdquo;)，虽然直接使用
ClassLoader.getSystemClassLoader()，可以得到SystemlassLoader来完成这项任务。但是，由于
System
Classloader是JVM创建的Classloader，它的职责有限，只适合于普通的java应用程序，在很多复杂场景中不能满足需求，比如在应
用服务器中。这时候就需要自行实现一个Classloader的子类，实现特定的行为。Apusic应用服务器中就定义了若干个特有的
Classloader，负责装载部署在Apusic中的JavaEE应用中的类，这里并不试图去描述如何实现一个自定义的Classloader，但本
章第二部分将详细描述Apusic自定义的Classloader的行为。</p>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1876"></a>
Caller Classloader和线程上下文Classloader</h4>
</div>
</div>
</div>
<p>动态加载资源时，往往有三种Classloader可选择：System Classloader、Caller
        Classloader、当前线程的上下文Classloader。System
        Classloader前面已经描述过了，下面我们看看什么是Caller
        Classloader、当前线程的上下文Classloader。</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Caller Classloader</p>
<p>Caller Classloader指的是当前所在的类装载时使用的Classloader，它可能是System
            Classloader，也可能是一个自定义的Classloader，这里，我们都称之为Caller
            Classloader。我们可以通过getClass().getClassLoader()来得到Caller
            Classloader。例如，存在A类，是被AClassLoader所加载，A.class.getClassLoader()为AClassLoader的实例，它就是A.class的Caller
            Classloader。</p>
<p>如果在A类中使用new关键字，或者Class.forName(String
            className)和Class.getResource(String resourceName)方法，那么这时也是使用Caller
            Classloader来装载类和资源。比如在A类中初始化B类：</p>
<pre class="programlisting">/**
  * A.java
*/
...
public void foo() {
    B b = new B();
    b.setName(&quot;b&quot;);
}
</pre>
<p>那么，B类由当前Classloader，也就是AClassloader装载。同样的，修改上述的foo方法，其实现改为：</p>
<pre class="programlisting">Class clazz = Class.forName(&quot;foo.B&quot;);</pre>
<p>最终获取到的clazz，也是由AClassLoader所装载。</p>
<p>那么，如何使用指定的Classloader去完成类和资源的装载呢？或者说，当需要去实例化一个Caller
            Classloader和它的父Classloader都不能装载的类时，怎么办呢？</p>
<p>一
个很典型的例子是JAXP，当使用xerces的SAX实现时，我们首先需要通过rt.jar中的
javax.xml.parsers.SAXParserFactory.getInstance()得到xercesImpl.jar中的
org.apache.xerces.jaxp.SAXParserFactoryImpl的实例。由于JAXP的框架接口的class位于
JAVA_HOME/lib/rt.jar中，由Bootstrap
Classloader装载，处于Classloader层次结构中的最顶层，而xercesImpl.jar由低层的Classloader装载，也就
是说SAXParserFactoryImpl是在SAXParserFactory中实例化的，如前所述，使用SAXParserFactory的
Caller Classloader(这里是Bootstrap Classloader)是完成不了这个任务的。</p>
<p>这时，我们就需要了解一下线程上下文Classloader了。</p>
</li>
<li>
<p>线程上下文Classloader</p>
<p>每个线程都有一个关联的上下文Classloader。如果使用new
            Thread()方式生成新的线程，新线程将继承其父线程的上下文Classloader。如果程序对线程上下文Classloader没有任何改动的话，程序中所有的线程将都使用System
            Classloader作为上下文Classloader。</p>
<p>当
使用Thread.currentThread().setContextClassLoader(classloader)时，线程上下文
Classloader就变成了指定的Classloader了。此时，在本线程的任意一处地方，调用Thread.currentThread().
getContextClassLoader()，都可以得到前面设置的Classloader。</p>
<p>回到JAXP的例子，假设
xercesImpl.jar只有AClassLoader能装载，现在A.class内部要使用JAXP，但是A.class却不是由
AClassLoader或者它的子Classloader装载的，那么在A.class中，应该这样写才能正确得到xercesImpl的实现：</p>
<pre class="programlisting">AClassLoader aClassLoader = new AClassLoader(parent);
Thread.currentThread().setContextClassLoader(aClassLoader);
SAXParserFactory factory = SAXParserFactory.getInstance();
...
</pre>
<p>JAXP这时就可以通过线程上下文Classloader装载xercesImpl的实现类了，当然，还有一个前提是在配制文件或启动参数中指定了使用xerces作为JAXP的实现。下面是JAXP中的代码片断：</p>
<pre class="programlisting">ClassLoader cl = Thread.currentThread().getContextClassLoader();
…
Class providerClass = cl.loadClass(className);
…
</pre>
</li>
</ul>
</div>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1918"></a>
JVM中类的唯一性</h4>
</div>
</div>
</div>
<p>JVM
为每一个Classloader维护一个唯一标识。在一个JVM里（对应一个Java进程），可以由不同的Classloader装载多个同名的类（指包
名和类名都完全相同，下同），为了唯一地标识被不同Classloader装载的类，JVM会在被装载的类名前加上装载该类的Classloader的标
识。</p>
</div>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e1923"></a>
Apusic的Classloader体系</h3>
</div>
</div>
</div>
<p>在上一节，我们了解了基本的Classloader层次结构模型，知道了Bootstrap Classloader、System
      Classloader的职责，还知道可以通过自定义Classloader来完成特定的装载任务，除此之外，我们还了解了什么是Caller
      Classloader和线程上下文Classloader。下面，我们就可以根据这些基本的Classloader概念去看看Apusic
      Classloader体系是长什么样的了。</p>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1928"></a>
JavaEE应用对Classloader的要求</h4>
</div>
</div>
</div>
<p>Apusic
应用服务器本身运行需要的类都在CLASSPATH中，由System
Classloader加载。在上一节中，我们提到Apusic应用服务器中定义了若干个专有的Classloader，负责装载部署在Apusic中的
JavaEE应用中的类和资源。Apusic为何要额外的去自定义Classloader呢？把应用需要的类和资源都放在CLASSPATH中，
System Classloader不也可以加载这些类吗？要回答这些问题，我们先考虑一下下面两个简单的需求：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>不同的应用中，可能有同名的资源文件或类，它们在各自应用中有不同的行为或语义。</p>
</li>
<li>
<p>应用发生变化的时候，例如改了Jsp或者JavaBean，在不重启服务器甚至不重启应用的情况下，需要立即看到修改的效果。</p>
</li>
</ul>
</div>
<p>我们前面提到过在一个JVM中一个类的唯一标识，当不能改变类的包名和类名的情况下，除非
        Classloader的实例发生变化，才有可能实现对一个类的再次加载。显然，在只有System
        Classloader的情况下，无法满足上面两个简单的需求。这是因为在运行期，我们无法重新创建System
        Classloader的实例，也没办法让它装载一个已经装载过的类</p>
<p>对
于第一个需求，我们可以对不同的应用中的类和资源进行隔离加载，这就需要为每个应用使用不同的Classloader实例；对于第二个需求，当Jsp或
JavaBean发生变化时，我们需要把原来装载Jsp的Classloader销毁掉，创建一个新的Classloader实例，并让它去装载修改后的
类，因此，要专门定义一个Classloader去负责装载Jsp、JavaBean，使得在重新创建Classloader时，受影响的范围尽可能的
小。</p>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1944"></a>
Apusic的Classloader和它们的层次结构</h4>
</div>
</div>
</div>
<p>Apusic为装载JavaEE应用中的类定义了EJBClassLoader和ServletClassLoader这两个主要的Classloader。假设一个JavaEE应用的结构如下：</p>
<div class="mediaobject">
<table cellspacing="0" border="0" summary="manufactured viewport for HTML img" width="387" cellpadding="0">
<tbody>
<tr style="height: 270px;">
<td align="center"><img src="http://infocenter.apusic.com/help/topic/com.apusic.studio.doc.server/output/eclipse/img/app2.jpg" align="middle" alt="" width="387" />
</td>
</tr>
</tbody>
</table>
</div>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>EJBClassLoader</p>
<p>每
个JavaEE应用都有一个EJBClassLoader，用于装载EJB
module和公共类。上图中的ejbjarA.jar、ejbjarB.jar、util.jar以及app.ear我们可以看成是一个jar文件，也
可以看成是一个目录，它们里边的类和文件都由同一个EJBClassLoader实例装载，因此，同一个JavaEE应用中的EJB
module和公共类是相互可见的。</p>
<p>不同的应用，其EJBClassLoader实例也不同，且每个EJBClassLoader实例间是平级关系，所以不同应用中的类是相互不可见的。</p>
</li>
<li>
<p>ServletClassLoader</p>
<p>在Apusic应用服务器中，每个Web module都有一个ServletClassLoader，用于装载Web
            module中的类和资源文件。所以，每个JavaEE应用中都可能有一个或多个ServletClassLoader，例如上图表示的JavaEE应用就有两个ServletClassLoader，它们是平级关系，所以Web
            module中的类相互不可见。对于ServletClassLoader，还有一些特殊的行为，将在下一节介绍。</p>
</li>
<li>
<p>层次结构</p>
<p>通过以上的介绍，我们可以知道，Apusic应用服务器启动后，假设其中部署了两个应用，分别是appA.ear和appB.ear，那么其Classloader层次结构可表现为：</p>
<div class="mediaobject">
<table cellspacing="0" border="0" summary="manufactured viewport for HTML img" width="549" cellpadding="0">
<tbody>
<tr style="height: 402px;">
<td align="center"><img src="http://infocenter.apusic.com/help/topic/com.apusic.studio.doc.server/output/eclipse/img/cl3.jpg" align="middle" alt="" width="549" />
</td>
</tr>
</tbody>
</table>
</div>
<p>其
中，我们可以看到，EJBClassLoader是ServletClassLoader的父，由ejbClassLoaderA装载的类和文件，对于
servletClassLoaderA和servletClassLoaderB装载的类都是可见的。也就是说，同一个应用中的任意Web
Module的类（即位于WEB-INF/classes、WEB-INF/lib中的类），都可以使用ejb jar或util jar中的类。</p>
<p>但对于上图中ejbClassLoaderA装载的类，servletClassLoaderC是看不见的，它们属于不同的应用。</p>
</li>
</ul>
</div>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e1977"></a>
ServletClassLoader的特性</h4>
</div>
</div>
</div>
<p>在
前面几节，我们提到过Apusic对于Web
module中的类，包括jsp（最终被应用服务器解析成servlet并编译成Java类）、WEB-INF/classes和WEB-INF/lib
里边的class和资源文件，专门定义一个ServletClassLoader进行加载是了满足类似开发期中类的动态加载、不同Module间类的隔离
等的需要。Apusic应用服务器在Classloader体系中做了充分的考虑以降低Web应用开发的复杂性及提升应用服务器的易用性。下面将介绍
Apusic的ServletClassLoader的行为特性：</p>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h5 class="title"><a name="d0e1982"></a>
类的动态加载</h5>
</div>
</div>
</div>
<p>在Apusic检测到jsp或WEB-INF/classes目录下的类的更新后，会重新加载修改过的类。对于用户来说，不需要做任何事情，在修改完后马上调用该类就可以看到刚刚做的更新。</p>
<p>考
虑到运行期和开发期的要求不同，运行期类和资源文件不会频繁更新，因此，在运行期，不需要频繁检测类文件是否已经更新，可通过配置apusic.conf
中的ServletReloadCheckInterval属性值来修改检测时间。当值小于&rdquo;0&rdquo;时，不检测。此值默认是3，即每3秒中检测一次。</p>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h5 class="title"><a name="d0e1989"></a>
ServletClassLoader的多层结构</h5>
</div>
</div>
</div>
<p>ServletClassLoader是一层壳，根据配置的不同策略，委托给不同的Classloader执行装载任务。Servlet
          Classloader的装载行为有两种策略，可通过配置进行指定，配置有两种方式：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>在web.xml中增加Context Parameter</p>
<pre class="programlisting">&lt;context-param&gt;
    &lt;param-name&gt;com.apusic.web.ServletClassLoaderDelegate&lt;/param-name&gt;
    &lt;param-value&gt;Separated&lt;/param-value&gt;
&lt;/context-param&gt;</pre>
<p>这样的配置有效范围只有当前应用。如果修改的是$DOMAIN_HOME/config/web.xml下的配置，则适用所有应用。</p>
</li>
<li>
<p>通过VM参数指定</p>
<pre class="programlisting">-Dcom.apusic.web.ServletClassLoaderDelegate=Separated</pre>
<p>这种系统属性配置，所有的应用都生效。</p>
</li>
</ul>
</div>
<p>ServletClassLoader的两种装载策略分别通过com.apusic.web.ServletClassLoaderDelegate的两个值来指定：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Composite</p>
<p>默
认值，表示ServletClassLoader的行为委托给了两层Classloader，一层叫CompositeClassLoader，它的父
Classloader是EJBClassLoader，它负责WEB-INF/lib和WEB-INF/classes目录下的类和资源的装载，其中，
如果在WEB-INF/lib和WEB-INF/classes下有同名的类或资源，WEB-INF/classes下的类将被优先装载；另一层是
JSPClassLoader，它的父Classloader是CompositeClassLoader，它负责装载解析编译后的JSP。</p>
</li>
<li>
<p>Separated</p>
<p>表
示ServletClassLoader的行为委托给了三层Classloader，跟上一种策略不同的是WEB-INF/lib下类和WEB-
INF/classes目录下的类和资源由不同的Classloader装载，前者叫StaticClassLoader，它的父是
EJBClassLoader；后者我们称为ReloadableClassLoader，它的父是StaticClassLoader，子是
JSPClassLoader。根据前面对Classloader父子关系的描述，我们可以知道，WEB-INF/lib下的类看不见WEB-
INF/classes下的类，而WEB-INF/classes下的类可以看见WEB-INF/lib下的类。考虑到客户应用中，资源文件一般放在
WEB-INF/classes目录中，因此，如果在WEB-INF/lib和WEB-INF/classes下有同名的资源文件，仍然是WEB-
INF/classes下的资源优先装载。</p>
</li>
</ul>
</div>
<p>如果客户应用系统中，WEB-INF/lib下的类会引用WEB-INF/classes下的类或资源，或者认为WEB-INF/classes下的类应该优先于WEB-INF/lib下的类装载，我们建议使用Composite，即默认的策略。</p>
<p>如
果考虑到在开发期WEB-INF/lib下的类或文件不会频繁更新，为了避免检测范围太大而导致的检测时间过长，不扫描WEB-INF/lib下的更新
（即此目录下的类只被装载一次，如果有更新，则需要重启应用才能生效），或者认为WEB-INF/lib下的类应该优先于WEB-INF/classes
下的类装载时，可采用Separated策略。</p>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h5 class="title"><a name="d0e2026"></a>
Session中对象的类动态装载</h5>
</div>
</div>
</div>
<p>如果session中保存的对象实例的类发生了更改，且类的签名未发生变化，那么对象实例的类型信息将被标识为新装载的类，从Session中取出对象后，它的行为按更新后的类执行。但如果类的签名发生了变化，那么此session中的对象实例将被丢弃。</p>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h5 class="title"><a name="d0e2031"></a>
类装载的Web优先策略</h5>
</div>
</div>
</div>
<p>在默认情况下，ServletClassLoader遵循大多数Classloader的装载行为，如&ldquo;<a href="http://infocenter.apusic.com/help/topic/com.apusic.studio.doc.server/output/eclipse/ch04s02.html#classloader_concept">Classloader的基本概念</a>
&rdquo;
一节描述的那样，会按顺序向上询问其所有父节点装载，如果父没装载到，才会由自身进行加载。这种默认的Java类装载机制有时也会碰到麻烦，比如WEB-
INF/classes中有某个类，在系统Classpath中有这个类的另一个版本，Classloader默认的装载行为决定了系统
Classpath中的类会被优先加载。如果我们期望WEB-INF/classes中的类要优先加载，Apusic的Servlet
Classloader提供了机会，可以通过配置系统属性或者在web.xml中增加Context Parameter来达到此目的：</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>在web.xml中增加Context Parameter</p>
<pre class="programlisting">&lt;context-param&gt;
    &lt;param-name&gt;apusic.prefer.war.classes&lt;/param-name&gt;
    &lt;param-value&gt;true&lt;/param-value&gt;
&lt;/context-param&gt;</pre>
<p>这样的配置有效范围只有当前应用。如果修改的是$DOMAIN_HOME/config/web.xml下的配置，则适用所有应用。</p>
</li>
<li>
<p>通过VM参数指定</p>
<pre class="programlisting">-Dapusic.prefer.war.classes=true</pre>
<p>这种系统属性配置，所有的应用都生效。</p>
</li>
</ul>
</div>
</div>
</div>
<div class="section" lang="zh">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e2054"></a>
类装载查看服务</h4>
</div>
</div>
</div>
<p>Apusic应用服务器提供了类装载查看服务，通过此服务，可以查找指定的类是由哪一层的Classloader装载的，类文件路径等信息，从而可以协助排查一些跟类装载相关的问题。类装载查看服务的相关配置段如下：</p>
<pre class="programlisting">...
&lt;SERVICE
    CLASS=&quot;com.apusic.util.ClassLoaderViewer&quot;
    &gt;
&lt;/SERVICE&gt;
...</pre>
<p>可以通过Admin Console上提供的类加载器来访问类装载查看服务，如何使用类加载器请参考Admin
        Console文档。</p>
</div>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/198119#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 09:26:15 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/198119</link>
        <guid>http://fyjava.javaeye.com/blog/198119</guid>
      </item>
      <item>
        <title>Apusic中log4j无法装载问题的解决</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/198107" style="color:red;">http://fyjava.javaeye.com/blog/198107</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          部署在Apusic 4.0.3上的应用中，使用到log4j，在应用装载时报如下异常：<br /><pre name="code" class="java">
2008-05-27 20:00:41 错误 [apusic.server.Main] 启动 'apusic:name=J2EEDeployer,j2eeType=Service' 服务失败。
java.lang.ExceptionInInitializerError
   at org.apache.struts.action.ActionServlet.initInternal(ActionServlet.java:1013)
   at org.apache.struts.action.ActionServlet.init(ActionServlet.java:322)
   at com.tjsoft.system.CTJActionServlet.init(CTJActionServlet.java:27)
   at javax.servlet.GenericServlet.init(GenericServlet.java:256)
   at com.apusic.servlet.http.ServletConfigImpl.initializeComponent(Unknown Source)
   at com.apusic.servlet.http.ServletConfigImpl.initializeComponent(Unknown Source)
   at com.apusic.servlet.http.ComponentConfigImpl.createComponent(Unknown Source)
   at com.apusic.servlet.http.ComponentConfigImpl.getComponent(Unknown Source)
   at com.apusic.servlet.http.ServletConfigImpl.getServlet(Unknown Source)
   at com.apusic.servlet.http.Context.loadStartupServlets(Unknown Source)
   at com.apusic.servlet.http.Context.start(Unknown Source)
   at com.apusic.servlet.http.VirtualHost.addContext(Unknown Source)
   at com.apusic.servlet.http.HttpServer.loadWebModule(Unknown Source)
   at com.apusic.servlet.http.WebService.loadWebModule(Unknown Source)
   at com.apusic.deploy.runtime.J2EEApplication.loadWebModule(Unknown Source)
   at com.apusic.deploy.runtime.J2EEApplication.startApplication(Unknown Source)
   at com.apusic.deploy.runtime.J2EEApplication.startService(Unknown Source)
   at com.apusic.service.Service.start(Unknown Source)
   at com.apusic.deploy.runtime.J2EEDeployer.startUserApplications(Unknown Source)
   at com.apusic.deploy.runtime.J2EEDeployer.startService(Unknown Source)
   at com.apusic.service.Service.start(Unknown Source)
   at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at com.apusic.jmx.MBeanDescriptor.invoke(Unknown Source)
   at com.apusic.jmx.DynamicMBeanSupport.invoke(Unknown Source)
   at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.invoke(DynamicMetaDataImpl.java:221)
   at com.sun.jmx.mbeanserver.MetaDataImpl.invoke(MetaDataImpl.java:228)
   at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:822)
   at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:792)
   at com.apusic.server.J2EEServer.start(Unknown Source)
   at com.apusic.server.J2EEServer.startup(Unknown Source)
Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@20ca8b for org.apache.commons.logging.impl.Log4JCategoryLog
   at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:532)
   at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:272)
   at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:246)
   at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:395)
   at org.apache.struts.util.MessageResources.(MessageResources.java:59)
   ... 32 more
Caused by: org.apache.commons.logging.LogConfigurationException: No suitable Log constructor [Ljava.lang.Class;@20ca8b for org.apache.commons.logging.impl.Log4JCategoryLog
   at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:432)
   at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:525)
   ... 36 more
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Category
   at java.lang.Class.getDeclaredConstructors0(Native Method)
   at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
   at java.lang.Class.getConstructor0(Unknown Source)
   at java.lang.Class.getConstructor(Unknown Source)
   at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:429)
   ... 37 more
</pre><br /><br />引起此异常的原因是Apusic的system classloader中，已经加载了commons-logging类，而log4j的类是在下一级的servlet classloader中加载的，对system classloader加载的类来说不可见，因此报“java.lang.NoClassDefFoundError”。<br /><br />解决的办法由多种，下面介绍常用的2种：<br /><br />1. 将log4j的jar包加入到APUSIC_HOME/lib目录，并且在APUSIC_HOME/bin/startapusic.cmd(linux下是startapusic)中的java命令行中，通过添加 -Dlog4j.configuration=your_log4j_configuration_file指定log4j的配置文件。<br /><br />2. 在APUSIC_HOME/bin/startapusic.cmd(linux下是startapusic)中的java命令行中，通过添加 -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/198107#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 09:08:28 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/198107</link>
        <guid>http://fyjava.javaeye.com/blog/198107</guid>
      </item>
      <item>
        <title>Java中的字体</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/192101" style="color:red;">http://fyjava.javaeye.com/blog/192101</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文引自：http://operamasks.blogbus.com/logs/20754657.html<br /><br />非Windows环境下，Java程序中需要用到某些字体，如非OS自带的字体，则需要将字库文件拷贝至相应目录：<br /><br />Solaris: /usr/openwin/lib/X11/fonts/TrueType<br /><br />AIX: /usr/lpp/X11/lib/X11/fonts/TrueType<br /><br />HP: /usr/lib/X11/fonts/ms.st/typefaces<br /><br />Linux: /usr/lib/X11/fonts/TrueType
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/192101#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 09:36:59 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/192101</link>
        <guid>http://fyjava.javaeye.com/blog/192101</guid>
      </item>
      <item>
        <title>在Apusic上配置达梦等数据源</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/186575" style="color:red;">http://fyjava.javaeye.com/blog/186575</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19649949.html<br /><br />近期因支持项目，测试了跟达梦、人大金仓、gbase等数据库的兼容性，摘录在Apusic上配置访问不同数据库的TYPE4数据源样例如下：<br /><br />1. 达梦<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="dm.jdbc.driver.DmDriver"<br />     url="jdbc:dm://localhost:12345/test"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource><br /><br />2. kingbase<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="com.kingbase.Driver"<br />     url="jdbc:kingbase://127.0.0.1:54321/TEST"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource><br /><br />3. gbase<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="com.gbase.jdbc.Driver"<br />     url="jdbc:GBase://localhost:5258/test"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource><br />4. sybase<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="com.sybase.jdbc2.jdbc.SybDrive"<br />     url="jdbc:sybase:Tds:localhost:2638?ServiceName=test"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource><br /><br /><br />5. db2<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="COM.ibm.db2.jdbc.net.DB2Driver"<br />     url="jdbc:db2://localhost:50000/test"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource><br /><br />6. SQL Server<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="com.microsoft.jdbc.sqlserver.SQLServerDriver"<br />     url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource><br /><br />7. Oracle<br /><br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="oracle.jdbc.OracleDriver"<br />     url="jdbc:oracle:thin:@localhost:1521:orcl"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />  &lt;/datasource>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/186575#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 00:34:02 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/186575</link>
        <guid>http://fyjava.javaeye.com/blog/186575</guid>
      </item>
      <item>
        <title>在Apusic上配置Oracle RAC数据源</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/186574" style="color:red;">http://fyjava.javaeye.com/blog/186574</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19649985.html<br /><br />在Apusic上配置Oracle RAC数据源很简单，只需要2步就搞定：<br /><br />1. 拷贝ojdbc14.jar到APUSIC_HOME/lib<br />2. 修改APUSIC_HOME/config/datasources.xml，添加形如下述片段：<br />&lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="oracle.jdbc.OracleDriver"     url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=node1)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=node2)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=on))(CONNECT_DATA=(SERVICE_NAME=RAC_DB)))"<br />     min-spare-connections="10"<br />     max-spare-connections="35"<br />     max-connections="75"<br />  ><br />    &lt;property name="user" value="scott"/>    <br />    &lt;property name="password" value="tiger"/><br />    &lt;property name="test-before-reused" value="false"/><br />    &lt;property name="test-command" value="select 1 from dual"/><br />    &lt;remote-acl><br />      &lt;user>admin&lt;/user><br />      &lt;user>j2ee&lt;/user><br />    &lt;/remote-acl><br />  &lt;/datasource>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/186574#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 00:32:21 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/186574</link>
        <guid>http://fyjava.javaeye.com/blog/186574</guid>
      </item>
      <item>
        <title>网上摘抄三个故事，以自我鞭策以及谴责不良行为</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184364" style="color:red;">http://fyjava.javaeye.com/blog/184364</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          【故事一】<br /><br /><br />　　 秦汉时代，我国西南地区居住着许多部落。汉初，由于朝廷忙着平定内乱和对付北方匈奴的侵犯，没有余力顾及到遥远的西南地区，而西南的这些部落也从不知道外面的世界。<br /><br />　　西南地区的这些部落都很小，他们散住在山中、林问。其中有一支名为“夜郎”的部落，就算是很大的了。  <br /><br />　　夜朗部落有个首领名叫多同。在他眼里，夜郎就是天底下最大的国家了。一天，他骑马带着随从出外巡游，他们来到一片平坦的土地上，多同扬鞭指着前方说：“你们看！这一望无边的疆土，都是我的，有哪一国能比它大呢？”<br /><br />　　跟随一旁的仆从连忙献媚说：“大王您说的很对，天下还有哪一国比夜郎更大呢！”多同心里沾沾自喜。<br /><br />　　他们又来到一大片高山前，多同仰起头，看着巍峨的高山说：“天下还找得到比这更高的山吗？”<br /><br />　　随从连忙应和说：“当然找不到，天下哪有比夜郎的山更高的山呢！”<br /><br />　　后来，他们来到一条江边，多同跳下马来，指着滔滔江水说：“你们看，这条江又宽又长，这是世界上最长最大的河了。”<br /><br />　　随从们没有一个不同意的，都齐声说：“那是肯定的。我们夜郎是天下最大的国家。”<br /><br />　　这次出游以后，夜郎国的人更加自大起来。<br /><br />　　汉武帝时候，武帝派使者出使印度，经过夜郎国。<br /><br />　　夜郎的首领多同从没去过中原，根本不知道中原是怎么回事。于是他派人将汉朝使者请进部落帐中。多同问汉朝使者说：“汉和夜郎相比，哪个大些？”<br /><br />　　汉使者听了多同的问话，不禁哈哈大笑起来，他回答说：“夜郎和汉是完全不能相比的。汉朝的州郡就有好几十个，而夜郎的全部地盘还抵不上汉朝一个郡的地盘。你看，哪一个大呢？”<br /><br />　　多同一听，不禁目瞪口呆，满脸羞愧。<br /><br />　　生活中也是这样，见识越广的人越懂得谦虚，而见识愈短浅的人反而愈盲目自大。<br /> <br /><br />【故事二】<br /> <br /><br />　　从前，有一只青蛙住在一口井里。一天，他遇见一只东海来的海龟。他立刻对这只海龟说：“你看，我住的地方多好。如果我高兴，我就跳上去看看天。我要是累了，就找个洞休息。你瞧瞧这些可怜的螃蟹、蝌蚪，他们怎能跟我比？我才是这的主人，我的家是世界上最好最舒服的地方。如果你愿意，你可以到我这来参观。” 青蛙的话打动了这只海龟。他就向青蛙的家爬去。可刚刚开始爬，就绊了一跤。他向青蛙抱怨道：“这地方这么小有什么好，你到我的家东海去看看，你就会知道什么是好地方。那里可大呢！” 可是青蛙从没见过海，根本想象不出海有多大。 后来，人们就用“坐井观天”来比喻一个人的思想狭隘。<br /><br />　　 Long long ago, a frog lived in a well. One day, he met a turtle who came from the Eastern Sea. He boasted to the turtle: "Look, how nice my well is! If I'm in high spirits, I 'll jump on the rim of the well and see the sky. If I 'm tired, I 'll find a hole for a rest. Look at these poor crabs and tadpoles, How can they compare with me? I 'm the master here and my home is the best place in the world. Would you like to have a visit?" The turtle was fascinated by his sweet words. Then the turtle crept to the well. As soon as the turtle began to move, he stumbled over the railing. Then he complained to the frog:" What a narrow place! If you see the vast Easton Sea where I live, you'll know how happy life there can be." The frog could not imagine how vast the sea is, as he has never seen it. Later, people use it to describe the ones who have a very narrow view.<br /> <br /><br />【故事三】<br /> <br /><br />　　赵奢是赵国名将，为赵国屡建战功。可是赵奢的儿子赵括却不像父亲。赵括从小的确读了不少兵书，谈起用兵之道那简直是滔滔不绝，连他父亲都不如他。于是，赵括自以为是，觉得自己是了不起的军事家，他狂妄地认为自己在军事上已经是天下无敌了。然而赵奢却不这么认为，他不但从未赞扬过儿子的夸夸其谈，反而却常常担忧地说：“日后赵国不让赵括带兵便罢，如果让他带兵打仗，那么断送赵国前程的将必是赵括无疑。”<br /><br />　　过了几年，赵奢死去了。<br /><br />　　这一年，秦国对赵国大举进攻，赵国派了年龄很大的将军廉颇率军迎敌。开始，赵军连连失利。在这样的情况下，廉颇改变战略方针，他下令让军队坚守城池，以逸待劳，不要主动出击，保存实力把住阵地从而拖垮秦军。结果真的，秦军由于远道而来，经不住廉颇的拖延，粮草渐渐接不上，快要支撑不下去了，秦军十分恐慌。于是秦军也施展汁谋，派人悄悄潜入赵国散布流言说：“秦军谁都不怕，就怕赵括担任大将。”<br /><br />　　赵王正在为廉颇在军事上毫无进展而闷闷不乐，听到外面流传的那些说法，便撤掉廉颇，要派赵括为大将来统帅军队。赵括的母亲记住丈夫生前的嘱咐，再三向赵王说明情况，极力劝告赵王收回决定，可是赵王哪里听得进去，他真的任命了赵括担任大将来取代廉颇。<br /><br />　　赵括一到前线，便开始胡乱指挥起来。他完全改变了廉颇的策略，大量撤换将官，一时间弄得人心惶惶军心涣散。<br /><br />　　秦军得知赵军这些情况，自然正中下怀。一天深夜，秦军派一支队伍偷袭赵营，刚一交战，便佯装败走。同时，秦军又派兵乘机切断了赵军的粮道。<br /><br />　　赵括不知实情，还以为秦军真的是败逃。他得意地想，取胜即在眼前，这正是表现自己的时候。于是他命令部队紧紧追击。结果，赵军追了一段后即被秦军伏兵将追兵拦腰截断，使赵军首尾不能相顾。然后，秦军一齐杀出，将赵军各个击破，团团围住。<br /><br />　　赵军被秦军围困40多天，粮食早已吃光又没有接应，一时间军心大乱。赵括一筹莫展，满肚子的兵法也不知如何施展。眼看守下去也是活活饿死，便率军仓皇突围。可是怎敌秦军四面掩杀，哪里突得出去。结果赵括被乱箭射死，40万赵军也全军覆没。从此以后赵国就一蹶不振。<br /><br />　　赵括纸上谈兵并无真才实学，而赵王还对他委以重任，结果招致惨痛失败。看来，教条主义的危害是不可轻视的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184364#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:20:39 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184364</link>
        <guid>http://fyjava.javaeye.com/blog/184364</guid>
      </item>
      <item>
        <title>IBM JDK下通过IIOP连接Apusic的问题</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184362" style="color:red;">http://fyjava.javaeye.com/blog/184362</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19317615.html<br /><br />当Apusic运行在IBM JDK下时，因为ORB实现不同，默认采用IBM的ORB实现，导致通过IIOP连接Apusic会出现异常，具体表现为应用不能通过JNDI连接获取远程JVM上的对象，或者Apusic停止脚本不能连上运行中的Apusic实例。<br /><br />解决办法是在Java命令行中，指定参数采用Sun的ORB实现 ，添加：<br /><br />-Djavax.rmi.CORBA.UtilClass=com.apusic.corba.ee.impl.javax.rmi.CORBA.Util<br />-Djavax.rmi.CORBA.StubClass=com.apusic.corba.ee.impl.javax.rmi.CORBA.StubDelegateImpl<br />-Djavax.rmi.CORBA.PortableRemoteObjectClass=com.apusic.corba.ee.impl.javax.rmi.PortableRemoteObject
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184362#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:14:52 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184362</link>
        <guid>http://fyjava.javaeye.com/blog/184362</guid>
      </item>
      <item>
        <title>AOM ELite</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184359" style="color:red;">http://fyjava.javaeye.com/blog/184359</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19198041.html<br /><br />ELite是一门全新的脚本语言，兼容函数式与命令式语言的长处，并实现与Java语言的最自然的交互。官方的描述如下：<br /><br />ELite is an object-oriented programming language that combines functional style and imperative style programming. It has features of functional languages such as first-class functions, list-comprehension, pattern-matching, and lazy-evaluation, etc.<br /><br />ELite的官方网站：http://sourceforge.net/projects/aom-elite/<br /><br />更多关于ELite的中文信息可以在www.operamasks.org网站获取。
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184359#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:11:27 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184359</link>
        <guid>http://fyjava.javaeye.com/blog/184359</guid>
      </item>
      <item>
        <title>修正Java中的时间 </title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184358" style="color:red;">http://fyjava.javaeye.com/blog/184358</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19319658.html<br /><br />某应用运行在Apusic上，因受OS环境的影响，获取到的Java时间迟了8个小时。经查，是OS的时区乱了，解决办法：<br /><br />在Java命令行中加入参数  -Duser.timezone=Asia/Shanghai
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184358#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:08:02 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184358</link>
        <guid>http://fyjava.javaeye.com/blog/184358</guid>
      </item>
      <item>
        <title>在Apusic中输出E文日志提示信息</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184356" style="color:red;">http://fyjava.javaeye.com/blog/184356</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19319781.html<br /><br />Apusic默认输出日志提示信息为中文。在某些环境下，如Linux终端，希望输出日志提示信息为E文。很简单就能做到这一点：<br /><br />在Apusic启动脚本的Java命令行中，加入以下参数 -Duser.language=en<br /><br />顺便嘲笑下chinaunix中某位楼主的看法：“输出日志的中文提示信息会对性能造成影响” ，感觉有点象E文中的F.U.D，真搞呀
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184356#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:06:36 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184356</link>
        <guid>http://fyjava.javaeye.com/blog/184356</guid>
      </item>
      <item>
        <title>在Apusic中根据多核环境进行参数优化</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184355" style="color:red;">http://fyjava.javaeye.com/blog/184355</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19319973.html<br /><br />Apusic IO实现中采用NIO Selector，在多核环境下，可以在Apusic服务中添加NumberSelectors参数，提升多核或多CPU的使用效率：<br /><br />在apusic.conf配置文件的http服务配置片段，加入 NumberSelectors属性，设置其值等于核的数量。<br /><br />Apusic 4.0.3的配置片段<br /><br />&lt;SERVICE<br />    CLASS="com.apusic.servlet.http.WebService"<br />    ><br />    &lt;ATTRIBUTE NAME="ServerPort" VALUE="6888"/><br />    &lt;ATTRIBUTE NAME="MaxWaitingClients" VALUE="500"/><br />    &lt;ATTRIBUTE NAME="WaitingClientTimeout" VALUE="15"/><br /><br />    &lt;ATTRIBUTE NAME="NumberSelectors" VALUE="2"/><br />    &lt;ATTRIBUTE NAME="KeepAlive" VALUE="true"/><br />    &lt;ATTRIBUTE NAME="KeepAliveTimeout" VALUE="75"/><br />    &lt;ATTRIBUTE NAME="MaxKeepAliveRequests" VALUE="500"/><br />    &lt;ATTRIBUTE NAME="MaxKeepAliveConnections" VALUE="1500"/><br />    &lt;ATTRIBUTE NAME="ServletReloadCheckInterval" VALUE="3"/><br />    &lt;ATTRIBUTE NAME="TemporaryDirectory" VALUE="scratch"/><br />    &lt;ATTRIBUTE NAME="EnableLog" VALUE="True"/><br />    &lt;ATTRIBUTE NAME="LogFileName" VALUE="logs/access.log"/><br />    &lt;ATTRIBUTE NAME="LogFileLimit" VALUE="1000000"/><br />    &lt;ATTRIBUTE NAME="LogFileCount" VALUE="10"/><br />&lt;/SERVICE><br /><br />Apusic 5.0的配置片段：<br /><br />&lt;SERVICE<br />    CLASS="com.apusic.web.WebService"<br />    ><br />    &lt;ATTRIBUTE NAME="ServerPort" VALUE="6888"/><br />    &lt;ATTRIBUTE NAME="MaxWaitingClients" VALUE="500"/><br />    &lt;ATTRIBUTE NAME="WaitingClientTimeout" VALUE="5"/><br /><br />    &lt;ATTRIBUTE NAME="NumberSelectors" VALUE="2"/><br />    &lt;ATTRIBUTE NAME="KeepAlive" VALUE="true"/><br />    &lt;ATTRIBUTE NAME="KeepAliveTimeout" VALUE="75"/><br />    &lt;ATTRIBUTE NAME="MaxKeepAliveRequests" VALUE="100"/><br />    &lt;ATTRIBUTE NAME="MaxKeepAliveConnections" VALUE="300"/><br />    &lt;ATTRIBUTE NAME="ServletReloadCheckInterval" VALUE="3"/><br />    &lt;ATTRIBUTE NAME="EnableLog" VALUE="True"/><br />    &lt;ATTRIBUTE NAME="LogFileName" VALUE="logs/access.log"/><br />    &lt;ATTRIBUTE NAME="LogFileLimit" VALUE="1000000"/><br />    &lt;ATTRIBUTE NAME="LogFileCount" VALUE="10"/><br />&lt;/SERVICE>
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184355#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:04:40 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184355</link>
        <guid>http://fyjava.javaeye.com/blog/184355</guid>
      </item>
      <item>
        <title>IBM反对SOA落地，VK反对老毛</title>
        <author>fyjava</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fyjava.javaeye.com">fyjava</a>&nbsp;
          链接：<a href="http://fyjava.javaeye.com/blog/184353" style="color:red;">http://fyjava.javaeye.com/blog/184353</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出自：http://operamasks.blogbus.com/logs/19318839.html<br /><br />同事VK说：SOA别再高高在上，让人感觉在云里雾里那样，摸不着头脑，让SOA落地吧。于是金蝶提出：ESB让SOA落地。并强势推出全新的Apusic ESB产品。<br /><br />业界附和声一片， Forrester Research的结论是：ESB是SOA的主要切入点。<br /><br />IBM一听，急了，跳出来反对：你们可不能把SOA庸俗化了呀。IBM费了这么大劲，这些年一直在折腾SOA，目标可能是让人稀里糊涂地在SOA的旗号下多买IBM软硬件以及不菲的顾问咨询服务，这下可好，让你们把SOA庸俗化了，还叫人活不活呀。<br /><br />于是，IBM SOA资深顾问Bobby Woolf写了篇文章，《以ESB为中心的架构是实施SOA错误的途径》，强烈反对ESB。 IBM中国的老毛新生也用汉语表达了对部分客户的不满：“这些客户在ESB和 SOA之间划了一个等号，或者更准确地说建设SOA就必须建设ESB。”<br /><br />对此，老毛进一步做了一个形象的比喻：“ESB就是道路，试想城市规划时是不是先把所有的道路都修好，然后再去修建筑呢?” <br /><br />VK对此颇为不屑，在中国，有句名言 ：“要想富，先修路”。另外，VK毫不客气地指出老毛在偷换概念，认为ESB不仅是道路，而且是道路规划，并反问老毛：“任何一个城市做规划，哪有不做好道路规划就乱建大楼的？”<br /><br />看来，业界的呼声“ESB让SOA落地”，确实让IBM 感到忐忑不安并开始左右为难了，IBM还会老老实实地推广其ESB产品吗？
          <br/><br/>
          <span style="color:red;">
            <a href="http://fyjava.javaeye.com/blog/184353#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:02:05 +0800</pubDate>
        <link>http://fyjava.javaeye.com/blog/184353</link>
        <guid>http://fyjava.javaeye.com/blog/184353</guid>
      </item>
  </channel>
</rss>