<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>山下的人</title>
    <description>沿華洗盡，歲月崢嶸……</description>
    <link>http://wenson.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>Grails连接不到MSSQL2000的问题</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/211743" style="color:red;">http://wenson.javaeye.com/blog/211743</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天做了个Grails连接MSSQL2000的简单测试</p>
<p>使用jtds.jar驱动，放到lib文件夹下</p>
<p>DataSource.groovy里配置参数正确</p>
<p>但是运行的时候老是抛出找不到driver的异常</p>
<p>多次检查测试之后</p>
<p>发现是我新安装的MSSQL2000没有升级SP4</p>
<p>于是下补丁重新测试，一切OK！</p>
<p>记录一下，以后别疏忽。。。。。<img src="../../images/smiles/icon_mad.gif" alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/211743#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 17:58:36 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/211743</link>
        <guid>http://wenson.javaeye.com/blog/211743</guid>
      </item>
      <item>
        <title>配置mysql odbc出现錯誤</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/211297" style="color:red;">http://wenson.javaeye.com/blog/211297</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="bold">出现&ldquo;Client does not support authentication protocol requested by server&rdquo;？</span><br /></p>
<div style="font-size: 12px;">安装Mysql4.1以上版本出现&ldquo;Client does not support authentication protocol requested by server&rdquo;.<br /><br />Mysql 4.1及以上版本使用了新的密码算法,而PHP不支持新算法,因此在新增用户后,还需要用下面的方法解决PHP无法连接登录Mysql的问题: (其中some_user,some_host,newpwd分别是您数据库的用户名,主机,密码)<br /><br />第一种解决方法:<br />mysql&gt; SET PASSWORD FOR<br />-&gt; 'some_user'@'some_host' = OLD_PASSWORD('newpwd');<br /><br />比方说数据库用户是admin,主机localhost，密码是123456<br /><br />这时候输入的命令应该是：<br /><br />mysql&gt; SET PASSWORD FOR admin@localhost=OLD_PASSWORD('123456');<br /><br />第二种解决方法:<br /><br />mysql&gt; UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')<br />-&gt; WHERE Host = 'some_host' AND User = 'some_user';<br />mysql&gt; FLUSH PRIVILEGES;<br /><br /><br />第三种解决方法(不推荐)<br /><br />用 --old-passwords 选项启用 mysqld,然后用上面的方法更改原有用户 </div>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/211297#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 01:44:07 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/211297</link>
        <guid>http://wenson.javaeye.com/blog/211297</guid>
      </item>
      <item>
        <title>Apache+Tomcat负载平衡设置方法详细解析</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/210574" style="color:red;">http://wenson.javaeye.com/blog/210574</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="a14c" id="zoom">&nbsp;
<p style="text-indent: 2em;">一、简介： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">每个Tomcat worker是一个服务于web server、等待执行servlet的Tomcat实例。例如我们经常使用像Apache之类的web server转发sevlet请求给位于其后面的一个Tomcat进程（也就是前面所说的worker）。本文详细介绍了如何配置各种类型worker和loadbalance，并说明了各种类型worker的特性和loadbalance配置的原理。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">二、为什么使用Tomcat workers： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">上文描述了一个非常简单的结构，事实上能够配置多个Tomcat workers来处理web server转发的servlet请求。而这样配置的理由不外乎以下几种假想环境： </p>
<p style="text-indent: 2em;">* 我们在开发环境中发布不同的Tomcat workers为各自不同的应用服务。当然在开发环境中的开发者共享同一个web server，但是每个Tomcat worke服务于拥有它的开发者。 </p>
<p style="text-indent: 2em;">* 我们在不同的Tomcat进程上定义各自的虚拟主机，这样不同的公司可以使用各自的web site，从而使他们的web site得到了合理的分割。 </p>
<p style="text-indent: 2em;">* 我们提供负载平衡的web site，也就意味着同时使用多个Tomcat workers，而每个Tomcat worker具有独立的主机并且在workers之间要分配通过web server转发来的请求。 </p>
<p style="text-indent: 2em;">当然，这些假想情况也许并不能涵盖使用多个workers的所有状况。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">三、workers.properties配置说明： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">定义Tomcat workers的方法是在apache的conf目录下编写一个名为&ldquo;workers.properties&rdquo;的属性文件。本文将详细解释如何进行配置的： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">1.定义Workers列表： </p>
<p style="text-indent: 2em;">定义workers的方法就是在apache的conf目录下编写一个workers.properties文件，使其作为apache的插件来发挥作用。 </p>
<p style="text-indent: 2em;">定义workers列表的格式： </p>
<p style="text-indent: 2em;">worker.list =&lt;使用&ldquo;,&rdquo;分割的worker 名字列表&gt; </p>
<p style="text-indent: 2em;">例如： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.list= worker1, worker2 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">当apache启动时，workers.properties作为插件将初始化出现在worker.list列表中的workers。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">2.定义Workers的类型： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">每个被命名的worker都应有一些关于其自身的附加信息。这些信息包括了worker的类型和其它相关信息。这里讨论的是JK1.2.5中定义的workers类型。 </p>
<p style="text-indent: 2em;">定义worker类型的格式： </p>
<p style="text-indent: 2em;">worker . worker名字. type = </p>
<p style="text-indent: 2em;">worker名字的命名最好遵循java的命名规范。 </p>
<p style="text-indent: 2em;">worker类型取值于下面的表格： </p>
<p style="text-indent: 2em;">定义一个名为&ldquo;local&rdquo;的worker，其使用ajpv12协议与Tomcat 进程通讯： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.local.type=ajp12 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">定义一个名为&ldquo;remote&rdquo;的worker，其使用ajpv13协议与Tomcat 进程通讯： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.remote.type=ajp13 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">定义一个名为&ldquo;fast&rdquo;的worker，其使用JNI的方式与Tomcat 进程通讯： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.fast.type=jni </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">定义一个名为&ldquo;loadbalancer&rdquo;的worker，其作为对多个Tomcat 进程的负载平衡使用： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.loadbalancer.type=lb </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">各个类型具有不同的行为，我们在下文中会详细解释。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">3.设置Worker属性： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">在定义worker之后，还需要提供各个worker的属性，这些属性的定义使用下面的方式： </p>
<p style="text-indent: 2em;">worker..&lt;属性&gt;=&lt;属性值&gt; </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">3-1 ajp12类型的Worker属性：. </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">ajp12类型的worker工作时使用基于TCP/IP socket的ajpv12协议转发请求给&ldquo;进程外&rdquo;Tomcat worker。 </p>
<p style="text-indent: 2em;">ajp12 worker属性如下： </p>
<p style="text-indent: 2em;">host： </p>
<p style="text-indent: 2em;">侦听ajp12请求的Tomcat worker主机。 </p>
<p style="text-indent: 2em;">port： </p>
<p style="text-indent: 2em;">Tomcat worker主机的侦听端口。 </p>
<p style="text-indent: 2em;">lbfactor： </p>
<p style="text-indent: 2em;">当此Tomcat worker被用于一个负载平衡worker使用时，此属性将被使用。它定义了此worker的负载平衡权值。 </p>
<p style="text-indent: 2em;">例如：下面的&ldquo;worker1&rdquo;定义了一个位于www.x.com主机上的Tomcat，它使用8007端口侦听apache发来的请求，并具有2.5的负载权值 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker1.host=www.x.comworker.worker1.port=8007worker.worker1.lbfactor=2.5 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">注意：在ajpv12协议中，针对每个请求都要一个连接建立、使用、关闭。其默认侦听端口为8007。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">3-2 ajp13类型的Worker属性： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">ajp13类型的worker工作时使用基于TCP/IP socket的ajpv13协议转发请求给&ldquo;进程外&rdquo;Tomcat worker。 </p>
<p style="text-indent: 2em;">ajpv13协议与ajpv12协议的主要不同： </p>
<p style="text-indent: 2em;">* ajpv13具有更丰富的二进制协议，它使用将频繁使用的字符串编码为小整数的方式对请求数据进行压缩。 </p>
<p style="text-indent: 2em;">* ajpv13重用打开的socket并保留这些打开的socket以处理将来的请求。这在apache与Tomcat之间具有防火墙的网络环境下是必要的。 </p>
<p style="text-indent: 2em;">* ajpv13具有对SSL信息的处理能力，以致容器能够实现SSL的相关方法（如isSecure()）。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">注意：ajp13当前只能用于支持&ldquo;进程外&rdquo;协议的Tomcat 4.0.x, 4.1.x and 5。 </p>
<p style="text-indent: 2em;">下表描述了ajp13worker接受的属性： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">host： </p>
<p style="text-indent: 2em;">侦听ajp13请求的Tomcat worker主机。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">port： </p>
<p style="text-indent: 2em;">Tomcat worker主机的侦听端口。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">lbfactor： </p>
<p style="text-indent: 2em;">当此Tomcat worker被用于一个负载平衡worker使用时，此属性将被使用。它定义了此worker的负载平衡权值。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">cachesize： </p>
<p style="text-indent: 2em;">当在多线程的web server（例如apache2.0、IIS 、Netscape）中使用JK时，此属性是有效的。如果将cachesize的值设置为较高的值，这些支持多线程的web server将获得很好的处理能力。如果此属性不被设置，则连接cache特性将失效。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">cache_timeout： </p>
<p style="text-indent: 2em;">本属性用于声明JK在cache中保留一个打开的socket的时间，它对减少web serer的线程数有所帮助。 </p>
<p style="text-indent: 2em;">使用cache_timeout的原因： </p>
<p style="text-indent: 2em;">周所周知，一个身背重负的web server（例如apache）建立childs/threads来处理负载，而当负载减少时它将销毁无用的childs/threads。每个child在转发请求给Tomcat时要打开一个ajp13连接，而在Tomcat那一端也将建立一个ajp13线程与之通讯。但是问题出现在一个ajp13连接建立完成后，child没有及时的释放那个ajp13连接，由于web server1将保持它的childs/threads运行已处理高负载，即使childs/threads处理快速的静态内容，在Tomcat端也将积累很多的无用ajp13线程。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">socket_keepalive： </p>
<p style="text-indent: 2em;">当防火墙位于web server与Tomcat之间时，防火墙将尝试断开未激活的网络连接。此属性将告诉操作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置，一般为120秒)，这样将防止防火墙切断未激活的网络连接。 </p>
<p style="text-indent: 2em;">但此设置并不是万能钥匙，它对于某些防火墙也无能为力。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">socket_timeout： </p>
<p style="text-indent: 2em;">此属性说明连接在未激活的状况下持续多久，web server将主动切断之。这是一个使Tomcat端的陈旧线程不致过多的好方法，但是也带来了在下一次请求到来时需要重新打开socket的开销。此属性与cache_timeout有类似的功效，但是它工作在non-cache模式。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">connect_timeout： </p>
<p style="text-indent: 2em;">web server在连接建立后将一个PING请求发送到ajp13协议的连接上。 此属性说明了web server等待PONG回应的时间（以ms为单位）。此属性在jk 1.2.6版本被增加进来，以求避免Tomcat的死机，Tomcat 3.3.2+, 4.1.28+ and 5.0.13+实现了对使用ajp13的 ping/pong的支持。此属性默认为失效的。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">prepost_timeout： </p>
<p style="text-indent: 2em;">web server在转发一个请求后将一个PING请求发送到ajp13协议的连接上。此属性说明了web server等待PONG回应的时间（以ms为单位）。此属性在jk 1.2.6版本被增加进来，以求避免Tomcat的死机，Tomcat 3.3.2+, 4.1.28+ and 5.0.13+实现了对使用ajp13的 ping/pong的支持。此属性默认为失效的。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">reply_timeout： </p>
<p style="text-indent: 2em;">此属性告诉web server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间。默认情况下web server将永远等待。属性值为web server要等待回应的时间（以ms为单位），所以如果具有运行时间较长的servlet时设置其值要小心。此属性在jk 1.2.6版本被增加进来，以求避免Tomcat的死机和在支持ajp13的servlet引擎上发生的问题。此属性默认为失效的。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">recovery_options： </p>
<p style="text-indent: 2em;">此属性说明了web server在检测到Tomcat失败后如何进行恢复工作。默认情况下，web server将转发请求给处于负载平衡模式中的另一个Tomcat。属性值为0，说明全部恢复；属性值为1，说明如果在Tomcat接到请求后出现失败状况，则不进行恢复；属性值为2，说明如果在Tomcat发送http头给客户端后出现失败状况，则不进行恢复；属性值为3，说明如果在Tomcat接到请求后出现失败状况或者在Tomcat发送http头给客户端后出现失败状况，则不进行恢复。此属性在jk 1.2.6版本被增加进来，以求避免Tomcat的死机和在支持ajp13的servlet引擎上发生的问题。此属性默认为全部恢复。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">例如：一个名为&ldquo;worker2&rdquo;的worker的配置： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<table cellspacing="0" border="1" align="center" width="400" cellpadding="2">
<tbody>
<tr>
<td class="code" bgcolor="#e6e6e6" style="font-size: 9pt;">
<pre>worker.worker2.host
=www2.x.comworker.worker2.port=
8009worker.worker2.lbfactor
=3.5worker.worker2.cachesize
=10worker.worker2.cache_timeout
=600worker.worker2.socket_keepalive
=1worker "worker2" want ajp13 connection to be dropped after 
5mn (timeout)worker.worker2.socket_timeout=300</pre>
</td>
</tr>
</tbody>
</table>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">说明：上例中的worker要求操作系统在连接上发送KEEP-ALIVE信号。 </p>
<p style="text-indent: 2em;">注意：在ajpv13协议中默认端口为8009。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">4.设置lb Worker属性： </p>
<p style="text-indent: 2em;">负载平衡类型的worker并不与Tomcat worker通讯，它负责管理这些Tomcat worker。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">其管理范围如下： </p>
<p style="text-indent: 2em;">* 初始化在web server的worker列表中定义的worker。 </p>
<p style="text-indent: 2em;">* 使用worker的负载平衡权值，执行基于权值的负载平衡，将数量多的请求发送到负载平衡权值高（在web server看来就是更加健壮的）的worker。 </p>
<p style="text-indent: 2em;">* 维护在同一个Tomcat worker上的同一个session的请求，使其发送到同一个Tomcat worker上。以达到Tomcat worker上的session一致性、持续性。 </p>
<p style="text-indent: 2em;">* 标识已经失败的Tomcat workers，悬空发向它们的请求，在被lb worker管理的其它workers上寻找可以失败恢复的worker。 </p>
<p style="text-indent: 2em;">被同一个lb worker管理多个worker之间的负载平衡的（基于它们的lbfactor和当前用户session），也可以尽量避免由于单一的Tomcat进程死掉而造成这个网站被&ldquo;杀&rdquo;的不良反应。 </p>
<p style="text-indent: 2em;">下表说明了lb worker接受的属性： </p>
<p style="text-indent: 2em;">* balanced_workers：一个由&ldquo;，&rdquo;分割的worker列表，用来声明lb worker需要被管理的workers。这些workers不应出现在worker.list属性中。 </p>
<p style="text-indent: 2em;">* sticky_session：表述是否将对SESSION ID的请求路由回到相同的Tomcat worker。如果属性值不为0，它将被设置为JK_TRUE，session将是粘性的，即SESSION ID的请求路由回到相同的Tomcat worker；当Tomcat正使用能够跨越多个Tomcat实例持久化session数据的Session Manager时，它将被设置为JK_FALSE。属性默认值为JK_TRUE。 </p>
<p style="text-indent: 2em;">例如：worker balance1管理着两个workers：worker1、worker2： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.balance1.balanced_workers=worker1, worker2 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">5.高级lb Worker属性： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">JK 1.2.x版本通过增加两个新的属性：local_worker_only 和 local_worker 为lb worker增添了新的负载平衡和容错支持。 </p>
<p style="text-indent: 2em;">下面让我们举一个实际的环境作为example： </p>
<p style="text-indent: 2em;">一个集群具有两个节点(worker1+worker2)，一个web server与tomcat workers一前一后，一个负载平衡器（lb Worker）位于节点的前面、web server的后面。 </p>
<p style="text-indent: 2em;">配置如下： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<table cellspacing="0" border="1" align="center" width="400" cellpadding="2">
<tbody>
<tr>
<td class="code" bgcolor="#e6e6e6" style="font-size: 9pt;">
<pre>worker.list=router# Define a 'local_worker'
 worker using ajp13worker.worker1.port=8009worker.worker1.host
=node1.domain.orgworker.worker1.type=ajp13worker.worker1.lbfactor
=1worker.worker1.local_worker=1# Define another 'local_worker' 
worker using ajp13worker.worker2.port=8009worker.worker2.host
=node2.domain.orgworker.worker2.type=ajp13worker.worker2.lbfactor
=1worker.worker2.local_worker=0# Define the LB 
workerworker.router.type=lbworker.router.balanced_workers
=worker1,worker2worker.router.local_worker_only=1</pre>
</td>
</tr>
</tbody>
</table>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">在worker1和worker2上的local_worker标志告诉lb_worker哪个连接属于本地worker。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">如果local_worker值为非0，则它将被设置为JK_TRUE，用来标记&ldquo;local worker&rdquo;，而JK_FALSE的情况则相反。如果至少一个worker被标记为local worker，则lb_worker将工作于local worker模式。这种模式下，所有的local workers将被移到在lb_worker中的内部worker列表的头部。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">这意味着一个带有session id的请求到达lb_worker时，相应的worker（根据权值排序，权值最大的那个worker）将被确定作为此请求的接受/处理者。如果这个worker死掉/当机，请求将被发送到处于非错误状态的第一个local worker；如果一个没有session id的请求到达lb_worker时，此请求将被路由到第一个local worker。如果所有的local worker均处于错误状态，则这时&ldquo;local_worker_only&rdquo;标志显得尤其重要。如果local_worker_only的属性值为非0，则它被设置为 JK_TRUE，否则被设置为 JK_FALSE。当它被设置为 JK_TRUE时，这个没有session id的请求将得到一个错误作为回应，否则lb_worker将尝试将请求路由到其它的被管理的worker上。如果其中的一个worker处于错误状态，并且恢复会话的工作并没有任何改变，local worker将查找这个没有session id的请求（因为在local worker中保存有这个请求的session），而其它的worker只能查找带有session id的请求。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">注意：local_worker默认值是0，local_worker_only默认值也是0。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">6.为什么需要这么复杂的过程吗？ </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">因为我们对于一个关闭的节点需要一个具有灵性的维护。 </p>
<p style="text-indent: 2em;">在节点前面的平衡器周期性的对每个节点的特定端口进行查询。如果我们从集群中移走一个节点，我们就会隐性的关闭掉这个特定的端口。由于负载平衡器不能连接它，这个节点将被标记为down。但是我们没有移动在那个关闭的节点上的session到其它的节点上。在这个环境下，如果平衡器发送一个没有session id的请求到一个端口被关掉的节点，那么一个错误将发生。如果平衡器测试到一个节点被标记为down的状态，而没有其它的节点允许发送没有session id的请求。这样这些陈旧的session请求就只有路由到那个被关闭的节点才能被接受。在一段时间后，这些陈旧的session将超时。由于所有的陈旧的session过期，那个不可达（被关闭）的节点将失去这个请求。同时也会导致我们的servlet系统发送一个没有session id的重定向回应给浏览器。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">但是可能被关闭的节点将会up，重新加入到集群中来，在它上面仍将保留着陈旧的session。所以在最后一个session超时后，更新节点能够为陈旧的session的恢复带来希望，而不是杀掉sessions或者把它们移到其它节点上。而且有时如果那些陈旧的session中有许多big的对象，那么移动它们也将花费许多时间。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">7.jni类型的Worker属性： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">jni worker会在web server进程中打开一个JVM，并在其中执行Tomcat，这叫做&ldquo;进程内&rdquo;worker。来往于JVM的消息将通过调用JNI方法被传递，这使jni worker比那些需要使用ajp消息通讯的&ldquo;进程外&rdquo;worker执行的更快。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">注意：由于JVM是多线程的，jni worker应该只被用于在支持对线程的web server（AOLServer, IIS, Netscape and Apache 2.0）上。同时还应该确认在web server上使用的线程方案是否与被使用的JK web server插件相匹配。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">由于jni worker 打开了一个JVM，它将接受一些属性（例如classpath等）并将其传递给JVM： </p>
<p style="text-indent: 2em;">worker.worker名.class_path：&ldquo;进程内&rdquo;的JVM要使用的classpath。它将包括所有的Tomcat的jar文件和class、配置文件等。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">为了获得JSP编译器的支持，我们需要将Javac添加到classpath中。当然对于Java2需要添加tools.jar到classpath，而对于JDK1.xx则要添加classes.zip到classpath。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.class_path：用于以多行的形式声明多个classpath。JK环境将用&ldquo;：&rdquo;或者&ldquo;；&rdquo;把这些classpath；连接起来。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">例如：给名为&ldquo;wrkjni&rdquo;的worker设置classpath。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.class_path=/var/tomcat3/lib/tomcat.jarworker.wrkjni.class_path=/opt/IBMJava2-131/lib/tools.jar </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.bridge：用于标识将通过JNI方式被使用的Tomcat的类型。此属性目前有两个属性值：tomcat32 or tomcat33。Tomcat 3.2.x虽然已经过时，但是被提供用于发布在一些类似iSeries系统上。此属性的默认值为tomcat33。 </p>
<p style="text-indent: 2em;">例如：给&ldquo;wrkjni&rdquo;设置bridge类型为tomcat3.3。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.bridge=tomcat33 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.cmd_line： 此属性提供了在Tomcat启动代码执行的命令行。使用时将命令行的命令、参数分解为多个cmd_line属性。JK环境通过在各个cmd_line属性值之间添加空格将这些cmd_line连接在一起。 </p>
<p style="text-indent: 2em;">例如：设置&ldquo;wrkjni&rdquo;的cmd_line属性。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.cmd_line=-configworker.wrkjni.cmd_line=/etc/tomcat3/conf/alt-server.xmlworker.wrkjni.cmd_line=-homeworker.wrkjni.cmd_line=/var/tomcat3 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">上面例子中的第一行声明了-config参数名，而第二行声明了与之对应的参数值。第三行与第四行同理。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.jvm_lib：用于声明JVM的实现库的完整路径。Jni worker使用这个路径动态装载JVM。 </p>
<p style="text-indent: 2em;">例如：设置&ldquo;wrkjni&rdquo;的JVM shared lib (IBM SDK on Linux)。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.jvm_lib=/opt/IBMJava2-131/jre/bin/classic/libjvm.so </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">例如：设置&ldquo;wrkjni&rdquo;的JVM shared lib (Sun SDK on Windows)。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.jvm_lib=c:\JDK\1.3.1\jre\bin\classic </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.stdout：设置JVM写它的System.out的完整路径位置。 </p>
<p style="text-indent: 2em;">例如：将&ldquo;wrkjni&rdquo;的JVM系统输出路径设置为/var/log/http/jk-jvm-out.log。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.stdout=/var/log/http/jk-jvm-out.log </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.stderr：设置JVM写它的System.err的完整路径位置。 </p>
<p style="text-indent: 2em;">例如：将&ldquo;wrkjni&rdquo;的JVM系统错误输出路径设置为/var/log/http/jk-jvm-err.log </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.stderr=/var/log/http/jk-jvm-out.log </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.ms：设置JVM的初始堆大小。 </p>
<p style="text-indent: 2em;">例如：设置&ldquo;wrkjni&rdquo;的JVM的初始堆为64M。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.ms=64 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.mx：设置JVM的最大的堆大小。 </p>
<p style="text-indent: 2em;">例如：设置&ldquo;wrkjni&rdquo;的JVM堆最大为128M </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.mx=128 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.sysprops：设置JVM的系统属性。 </p>
<p style="text-indent: 2em;">例如：设置&ldquo;wrkjni&rdquo;的JVM使用法语。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.wrkjni.sysprops=-Duser.region=FR </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.worker名.ld_path：设置附加的动态链接库路径(类似于LD_LIBRARY_PATH) </p>
<p style="text-indent: 2em;">例如：添加一些动态链接库路径到&ldquo;wrkjni&rdquo;的java环境中。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<table cellspacing="0" border="1" align="center" width="400" cellpadding="2">
<tbody>
<tr>
<td class="code" bgcolor="#e6e6e6" style="font-size: 9pt;">
<pre>worker.wrkjni.ld_path=/opt/IBMJava2-131/jre/bin/worker.wrkjni.ld_path
=/opt/IBMJava2-131/jre/bin/classic</pre>
</td>
</tr>
</tbody>
</table>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">注意：在Linux下，上面的ld_path并不能更新LD_LIBRARY_PATH，所以需要在执行web server之前手动更新LD_LIBRARY_PATH,。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">8.属性文件宏： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">我们可以在属性文件中定义&ldquo;宏&rdquo;。这些宏让我们定义属性，并在以后使用它们来构建其它的属性文件。当我们修改Java Home、Tomcat Home、系统路径分隔符时这是很有用的。 </p>
<p style="text-indent: 2em;">例如：定义了属性workers.tomcat_home、workers.java_home。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">workers.tomcat_home=d:\tomcatworkers.java_home=d:\sdk\jdk1.2.2 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">在定义worker.inprocess.class_path时就可以使用前面定义的workers.tomcat_home。 </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">9.一个简单而完整的worker.properties： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">文件中定义了比较完整的结构，可以做为参考模版： </p>
<p style="text-indent: 2em;">* 一个位于localhost的使用8007端口的ajp12 worker； </p>
<p style="text-indent: 2em;">* 一个位于localhost的使用8008端口的ajp13 worker； </p>
<p style="text-indent: 2em;">* 一个jni worker； </p>
<p style="text-indent: 2em;">* 一个lb worker：负责ajp12 worker、ajp13 workers的负载平衡。 </p>
<p style="text-indent: 2em;">文件内容如下： </p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<table cellspacing="0" border="1" align="center" width="400" cellpadding="2">
<tbody>
<tr>
<td class="code" bgcolor="#e6e6e6" style="font-size: 9pt;">
<pre># Define some propertiesworkers.apache_log=/var/log/httpd/workers.tomcat_home
=/var/tomcat3workers.java_home=/opt/IBMJava2-131/ps
=/# Define 4 workers, 3 real workers using ajp12, ajp13, jni,
 the last one being a loadbalancing workerworker.list
=worker1, worker2, worker3, worker4# Set properties for worker1 (ajp12)
worker.worker1.type=ajp12worker.worker1.host
=locahostworker.worker1.port=8007worker.worker1.lbfactor
=5# Set properties for worker2 (ajp13)worker.worker2.type
=ajp13worker.worker2.host
=locahostworker.worker2.port=8009worker.worker2.lbfactor
=50worker.worker2.cachesize=10worker.worker2.cache_timeout
=600worker.worker2.socket_keepalive=1worker.worker2.socket_timeout
=300# Set properties for worker3 (jni)worker.worker3.type
=jni# Set worker3 bridge type, here Tomcat 3.3worker.worker3.bridge
=tomcat33# Set worker3 classpathworker.worker3.class_path
=$(workers.tomcat_home)$(ps)classesworker.worker3.class_path
=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar# 
Set worker3 tomcat command lineworker.worker3.cmd_line
=-homeworker.worker3.cmd_line
=$(workers.tomcat_home)# Set worker3 Tomcat/JVM 
settingsworker.worker3.jvm_lib=$(workers.java_home)$(ps)
jre$(ps)bin$(ps)classic$(ps)libjvm.soworker.worker3.stdout
=$(workers.apache_log)$(ps)inprocess.stdoutworker.worker3.stderr
=$(workers.apache_log)$(ps)inprocess.stderrworker.worker3.sysprops
=tomcat.home=$(workers.tomcat_home)# Set properties for worker4 (lb) 
which use worker1 and worker2worker.worker4.balanced_workers=worker1,worker2</pre>
</td>
</tr>
</tbody>
</table>
<p style="text-indent: 2em;">（责任编辑：云子） </p>
</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/210574#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:11:03 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/210574</link>
        <guid>http://wenson.javaeye.com/blog/210574</guid>
      </item>
      <item>
        <title>轻松实现Apache,Tomcat集群和负载均衡</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/210568" style="color:red;">http://wenson.javaeye.com/blog/210568</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>作者:罗代均 ldj_work#126.com,转载请保持完整性</p>
<p><strong>0， 环境说明</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache&nbsp; :apache_2.0.55&nbsp;&nbsp;&nbsp;&nbsp; 1 个</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tomcat:&nbsp; apache-tomcat-5.5.17 (zip版) 2个</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mod_jk:: mod_jk-apache-2.0.55.so&nbsp; 1个</p>
<p><strong>第一部分：负载均衡</strong></p>
<p>&nbsp;&nbsp;&nbsp; 负载均衡，就是apache将客户请求均衡的分给tomcat1,tomcat2....去处理</p>
<p><strong>&nbsp;&nbsp; 1.安装apche,tomcat</strong></p>
<p>&nbsp;&nbsp; <a href="http://httpd.apache.org/">http://httpd.apache.org/</a>&nbsp;下载Apache 2.0.55</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://tomcat.apache.org/download-55.cgi">http://tomcat.apache.org/download-55.cgi</a>&nbsp;下载tomcat5.5 zip版本（解压即可，绿色版）</p>
<p>&nbsp;&nbsp; <a href="http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/">http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/</a>&nbsp; 下载mod_jk,注意和&nbsp; apache版本匹配</p>
<p>&nbsp;&nbsp; 按照jdk,我的路径为:E:\ide\apache\Apache2</p>
<p>&nbsp;&nbsp; 解压两份Tomcat, 路径分别为 E:\ide\tomcat1,E:\ide\tomcat2</p>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/9d61f003d5034eec09fa935b.jpg" border="0" alt="" /></div>
<p>下载mod_jk</p>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/52855e82373a3ea20df4d224.jpg" border="0" alt="" /></div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/46899c50d44e3b628435245b.jpg" border="0" alt="" /></div>
<p><strong>2.修改Apache配置文件http.conf</strong></p>
<p>&nbsp;&nbsp; 在apache安装目录下conf目录中找到http.conf</p>
<p>&nbsp;&nbsp; 在文件最后加上下面一句话就可以了</p>
<p>&nbsp; include "E:\ide\apache\Apache2\conf\mod_jk.conf"</p>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/d1c28cd49b8d6901a08bb720.jpg" border="0" alt="" /></div>
<div><strong>2. http.conf 同目录下新建mod_jk.conf文件，内容如下</strong></div>
<div>&nbsp;&nbsp; </div>
<div>#加载mod_jk Module<br />LoadModule jk_module modules/mod_jk-apache-2.0.55.so</div>
<div>#指定 workers.properties文件路径<br />JkWorkersFile conf/workers.properties</div>
<div>#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器</div>
<div>JkMount /*.jsp controller</div>
<div><strong>3.在http.conf同目录下新建 workers.properties文件，内容如下</strong></div>
<div>&nbsp;</div>
<div>worker.list = controller,tomcat1,tomcat2&nbsp; #server 列表</div>
<div>#========tomcat1========</div>
<div>worker.tomcat1.port=8009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ajp13 端口号，在tomcat下server.xml配置,默认8009<br />worker.tomcat1.host=localhost&nbsp; #tomcat的主机地址，如不为本机，请填写ip地址<br />worker.tomcat1.type=ajp13<br />worker.tomcat1.lbfactor = 1&nbsp;&nbsp; #server的加权比重，值越高，分得的请求越多</div>
<div>#========tomcat2========</div>
<div>worker.tomcat2.port=9009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ajp13 端口号，在tomcat下server.xml配置,默认8009<br />worker.tomcat2.host=localhost&nbsp; #tomcat的主机地址，如不为本机，请填写ip地址<br />worker.tomcat2.type=ajp13<br />worker.tomcat2.lbfactor = 1&nbsp;&nbsp; #server的加权比重，值越高，分得的请求越多</div>
<div><br />#========controller,负载均衡控制器========<br />worker.controller.type=lb<br />worker.controller.balanced_workers=tomcat1,tomcat2&nbsp;&nbsp; #指定分担请求的tomcat<br />worker.controller.sticky_session=1</div>
<div><strong>4.修改tomcat配置文件server.xml</strong></div>
<div>如果你在不同电脑上安装tomcat,tomcat的安装数量为一个，可以不必修改tomcat配置文件</div>
<div>我这里是在同一台电脑上安装两个tomcat，所以需要更改其中一个的设置</div>
<div>打开tomcat2/conf/server.xml文件</div>
<div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/a3d133a8ed4063b1ca130c36.jpg" border="0" alt="" />
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/8c3cae7727b25d1bb151b937.jpg" border="0" alt="" /></div>
<div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/56b04b085ba7f3950b7b8230.jpg" border="0" alt="" /></div>
<div><strong>5.编写一个测试jsp</strong></div>
<div>建立一个目录test.里面新建一个test.jsp,内容为</div>
<div>&lt;% <br />&nbsp;&nbsp; System.out.println("===========================");<br />%&gt;<br /></div>
<div>把test放到tomcat1,tomcat2的webapps下</div>
<div><strong>6.启动apache,tomcat1,tomcat2,进行测试</strong></div>
<div>通过 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a>&nbsp;访问，查看tomcat1的窗口，可以看到打印了一行"=========="</div>
<div>再刷新一次，tomcat2也打印了一条，再刷新，可以看到请求会被tomcat1,tomcat2轮流处理,实现了负载均衡</div>
<div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/acf2fcf2c8b77d13b17ec53d.jpg" border="0" alt="" /></div>
<div><strong>第二部分，配置集群</strong></div>
<div>&nbsp;&nbsp; 只配置负载均衡还不行，还要session复制，也就是说其中任何一个tomcat的添加的session，是要同步复制到其它tomcat， 集群内的tomcat都有相同的session</div>
<div><strong>1. 修改tomcat1, tomcat2的server.xml</strong>,将集群部分配置的在注释符删掉,并将tomcat2的4001端口改为4002，以避免与tomcat冲突，当然，如果是两台电脑，是不用改端口的，去掉注释符即可</div>
<div>&nbsp;&nbsp;
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/aa4ab5fb0f3582224f4aeab2.jpg" border="0" alt="" /></div>
<div>
<div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/89b84c3627ecc1dda3cc2b92.jpg" border="0" alt="" /></div>
</div>
<div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/cc4b858b603d47d3fd1f10b2.jpg" border="0" alt="" /></div>
<div><strong>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/52dfdac4bc506ecb38db4959.jpg" border="0" alt="" /></div>
</strong></div>
<div><strong></strong></div>
<div><strong>2，修改测试项目test</strong></div>
<div>修改test.jsp,内容如下</div>
<div>&nbsp; &lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />&lt;%@ page import="java.util.*" %&gt;<br />&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />&lt;body&gt;<br />Server Info:<br />&lt;%<br />out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />&lt;%<br />&nbsp; out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");</div>
<div>&nbsp; // 如果有新的 Session 属性设置<br />&nbsp; String dataName = request.getParameter("dataName");<br />&nbsp; if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp; String dataValue = request.getParameter("dataValue");<br />&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute(dataName, dataValue);<br />&nbsp; }</div>
<div>&nbsp; out.print("&lt;b&gt;Session 列表&lt;/b&gt;");</div>
<div>&nbsp; Enumeration e = session.getAttributeNames();<br />&nbsp; while (e.hasMoreElements()) {<br />&nbsp;&nbsp;&nbsp;&nbsp; String name = (String)e.nextElement();<br />&nbsp;&nbsp;&nbsp;&nbsp; String value = session.getAttribute(name).toString();<br />&nbsp;&nbsp;&nbsp;&nbsp; out.println( name + " = " + value+"&lt;br&gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( name + " = " + value);<br />&nbsp;&nbsp; }<br />%&gt;<br />&nbsp; &lt;form action="index.jsp" method="POST"&gt;<br />&nbsp;&nbsp;&nbsp; 名称:&lt;input type=text size=20 name="dataName"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />&nbsp;&nbsp;&nbsp; 值:&lt;input type=text size=20 name="dataValue"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type=submit&gt;<br />&nbsp;&nbsp; &lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div>
<div>然后在test 新建WEB-INF目录，WEB-INF下新建web.xml,内容如下</div>
<div>&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>" version="2.4"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #ff0000;"> &lt;distributable/&gt;</span></strong><br />&lt;/web-app&gt;</div>
<div>注意：在你的应用的web.xml加入&nbsp;<span style="color: #ff0000;"><strong> &lt;distributable/&gt;</strong> </span><span style="color: #000000;">即可</span></div>
<div>ok,讲test复制到tomcat1,tomcat2的webapps下，重启apache,tomcat1,tomcat2,</div>
<div>输入网址 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a>&nbsp;&nbsp; </div>
<div>新建一个 名称为 xiaoluo&nbsp; ,值为 cdut 的session,提交查询，新开一个ie窗口，再提交查询，如图，可以看到，两个tomcat 是负载均衡，并且session同步的</div>
<div>
<div><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/79a9317af99aa5ed2e73b385.jpg" border="0" alt="" /></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/210568#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:04:15 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/210568</link>
        <guid>http://wenson.javaeye.com/blog/210568</guid>
      </item>
      <item>
        <title>java字符串转换器</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/209980" style="color:red;">http://wenson.javaeye.com/blog/209980</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;<br />&nbsp;&nbsp;&nbsp; 无论是对程序的本地化还是国际化，都会涉及到字符编码的转换的问题。尤其在web应用中常常需要处理中文字符，这时就需要进行字符串的编码转换，将字符串编码转换为GBK或者GB2312。</p>
<p>一、关键技术点：<br />&nbsp;&nbsp;&nbsp; 1、当前流行的字符编码格式有：US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等，其中GBK、GB2312是专门处理中文编码的。<br />&nbsp;&nbsp;&nbsp; 2、String的getBytes方法用于按指定编码获取字符串的字节数组，参数指定了解码格式，如果没有指定解码格式，则按系统默认编码格式。<br />&nbsp;&nbsp;&nbsp; 3、String的&ldquo;String(bytes[] bs, String charset)&rdquo;构造方法用于把字节数组按指定的格式组合成一个字符串对象<br />&nbsp;&nbsp;&nbsp; <br />二、实例演示：&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="java">package book.String;

import java.io.UnsupportedEncodingException;

/** *//**
 * 转换字符串的编码
 * @author joe
 *
 */

public class ChangeCharset {
    /** *//** 7位ASCII字符，也叫作ISO646-US、Unicode字符集的基本拉丁块      */
    public static final String US_ASCII = "US-ASCII";
    /** *//** ISO拉丁字母表 No.1，也叫做ISO-LATIN-1     */
    public static final String ISO_8859_1 = "ISO-8859-1";
    /** *//** 8 位 UCS 转换格式     */
    public static final String UTF_8 = "UTF-8";
    /** *//** 16 位 UCS 转换格式，Big Endian(最低地址存放高位字节）字节顺序     */
    public static final String UTF_16BE = "UTF-16BE";
    /** *//** 16 位 UCS 转换格式，Litter Endian（最高地址存放地位字节）字节顺序     */
    public static final String UTF_16LE = "UTF-16LE";
    /** *//** 16 位 UCS 转换格式，字节顺序由可选的字节顺序标记来标识     */
    public static final String UTF_16 = "UTF-16";
    /** *//** 中文超大字符集     **/
    public static final String GBK = "GBK";
    
    public static final String GB2312 = "GB2312";
    
    /** *//** 将字符编码转换成US-ASCII码     */
    public String toASCII(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str, US_ASCII);
    }
    
    /** *//** 将字符编码转换成ISO-8859-1     */
    public String toISO_8859_1(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str, ISO_8859_1);
    }
    
    /** *//** 将字符编码转换成UTF-8     */
    public String toUTF_8(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str, UTF_8);
    }
    
    /** *//** 将字符编码转换成UTF-16BE     */
    public String toUTF_16BE(String str) throws UnsupportedEncodingException{
        return this.changeCharset(str, UTF_16BE);
    }
    
    /** *//** 将字符编码转换成UTF-16LE     */
    public String toUTF_16LE(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str, UTF_16LE);
    }
    
    /** *//** 将字符编码转换成UTF-16     */
    public String toUTF_16(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str, UTF_16);
    }
    
    /** *//** 将字符编码转换成GBK     */
    public String toGBK(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str, GBK);
    }
    
    /** *//** 将字符编码转换成GB2312     */
    public String toGB2312(String str) throws UnsupportedEncodingException {
        return this.changeCharset(str,GB2312);
    }
    
    /** *//**
     * 字符串编码转换的实现方法
     * @param str    待转换的字符串
     * @param newCharset    目标编码
     */
    public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException ...{
        if(str != null) {
            //用默认字符编码解码字符串。与系统相关，中文windows默认为GB2312
            byte[] bs = str.getBytes();
            return new String(bs, newCharset);    //用新的字符编码生成字符串
        }
        return null;
    }
    
    /** *//**
     * 字符串编码转换的实现方法
     * @param str    待转换的字符串
     * @param oldCharset    源字符集
     * @param newCharset    目标字符集
     */
    public String changeCharset(String str, String oldCharset, String newCharset) throws UnsupportedEncodingException {
        if(str != null) {
            //用源字符编码解码字符串
            byte[] bs = str.getBytes(oldCharset);
            return new String(bs, newCharset);
        }
        return null;
    }
    
    public static void main(String[] args) throws UnsupportedEncodingException {
        ChangeCharset test = new ChangeCharset();
        String str = "This is a 中文的 String!";
        System.out.println("str：" + str);
        
        String gbk = test.toGBK(str);
        System.out.println("转换成GBK码：" + gbk);
        System.out.println();
        
        String ascii = test.toASCII(str);
        System.out.println("转换成US-ASCII：" + ascii);
        System.out.println();
        
        String iso88591 = test.toISO_8859_1(str);
        System.out.println("转换成ISO-8859-1码：" + iso88591);
        System.out.println();
        
        gbk = test.changeCharset(iso88591, ISO_8859_1, GBK);
        System.out.println("再把ISO-8859-1码的字符串转换成GBK码：" + gbk);
        System.out.println();
        
        String utf8 = test.toUTF_8(str);
        System.out.println();
        System.out.println("转换成UTF-8码：" + utf8);
        String utf16be = test.toUTF_16BE(str);
        System.out.println("转换成UTF-16BE码：" + utf16be);
        gbk = test.changeCharset(utf16be, UTF_16BE, GBK);
        System.out.println("再把UTF-16BE编码的字符转换成GBK码：" + gbk);
        System.out.println();
        
        String utf16le = test.toUTF_16LE(str);
        System.out.println("转换成UTF-16LE码：" + utf16le);
        gbk = test.changeCharset(utf16le, UTF_16LE, GBK);
        System.out.println("再把UTF-16LE编码的字符串转换成GBK码：" + gbk);
        System.out.println();
        
        String utf16 = test.toUTF_16(str);
        System.out.println("转换成UTF-16码：" + utf16);
        String gb2312 = test.changeCharset(utf16, UTF_16, GB2312);
        System.out.println("再把UTF-16编码的字符串转换成GB2312码：" + gb2312);
    }

}</pre>
<p>&nbsp;</p>
<p>輸出結果：</p>
<p>&nbsp;</p>
<pre name="code" class="java">str：This is a 中文的 String!
转换成GBK码：This is a 中文的 String!

转换成US-ASCII：This is a ?????? String!

转换成ISO-8859-1码：This is a ?????? String!

再把ISO-8859-1码的字符串转换成GBK码：This is a 中文的 String!


转换成UTF-8码：This is a ????? String!
转换成UTF-16BE码：周楳?猠愠????瑲楮朡
再把UTF-16BE编码的字符转换成GBK码：This is a 中文的 String!

转换成UTF-16LE码：桔獩椠?????匠牴湩Ⅷ
再把UTF-16LE编码的字符串转换成GBK码：This is a 中文的 String!

转换成UTF-16码：周楳?猠愠????瑲楮朡
再把UTF-16编码的字符串转换成GB2312码：?This is a 中文的 String!</pre>
<p>&nbsp;</p>
<p>三、源码分析：<br />&nbsp;&nbsp;&nbsp; 更改字符串编码的步骤为:<br />&nbsp;&nbsp;&nbsp; 1、调用String的getByte方法对字符串进行解码，得到字符串的字节数组（字节数组不携带任何有关编码格式的信息，只有字符才有编码格式）<br />&nbsp;&nbsp;&nbsp; 2、根据字节数组和新的字符编码构造一个新的String对象，得到的就是按照新的字符编码生成的字符串<br /><br /><br />此文转自：<a href="http://blog.csdn.net/zhouyong80/archive/2007/11/24/1900100.aspx">http://blog.csdn.net/zhouyong80/archive/2007/11/24/1900100.aspx</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/209980#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 01:13:20 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/209980</link>
        <guid>http://wenson.javaeye.com/blog/209980</guid>
      </item>
      <item>
        <title>Groovy的一些中文资料</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/202611" style="color:red;">http://wenson.javaeye.com/blog/202611</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>IMB的资料&mdash;&mdash;</p>
<p>精通Groovy：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/index.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/index.html</a></p>
<p>Groovy的循环：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section7.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section7.html</a></p>
<p>Groovy集合：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section8.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section8.html</a></p>
<p>Groovy映射：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section9.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section9.html</a></p>
<p>Groovy闭包：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section10.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section10.html</a><a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section9.html"></a></p>
<p>Groovy的类：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section11.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section11.html</a></p>
<p>Groovy的单元测试：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section12.html">https://www6.software.ibm.com/developerworks/cn/education/java/j-groovy/section12.html</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/202611#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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, 12 Jun 2008 20:05:09 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/202611</link>
        <guid>http://wenson.javaeye.com/blog/202611</guid>
      </item>
      <item>
        <title>linux下网络配置——ip配置</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/161963" style="color:red;">http://wenson.javaeye.com/blog/161963</a>&nbsp;
          发表时间: 2008年02月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我在这只介绍字符模式下配置ip.<br />第一种方法:<br />配置ip<br />[root@tpwb ~]# ifconfig eth0 192.168.0.5 <br />配置网关<br />[root@tpwb ~]# route add default gw 192.168.0.1<br /><br />配置完成后要<br />[root@tpwb ~]# ifconfig eth0 down<br />[root@tpwb ~]# ifconfig eth0 up<br />或<br />[root@tpwb ~]# service network restart<br />开启etho端口<br />但这种配置只能在当前模式下生效,重起后就会丢失.<br />第二种方法:<br />[root@tpwb ~]# cd /etc/sysconfig/network-scripts/<br />[root@tpwb network-scripts]# ls<br />ifcfg-eth0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifdown-isdn&nbsp;&nbsp;&nbsp;&nbsp; ifup-ib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-plusb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init.ipv6-global<br />ifcfg-lo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifdown-post&nbsp;&nbsp;&nbsp;&nbsp; ifup-ippp&nbsp;&nbsp;&nbsp;&nbsp; ifup-post&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; network-functions<br />ifdown&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifdown-ppp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-ipsec&nbsp;&nbsp;&nbsp; ifup-ppp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; network-functions-ipv6<br />ifdown-aliases&nbsp;&nbsp;&nbsp; ifdown-sit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-ipv6&nbsp;&nbsp;&nbsp;&nbsp; ifup-routes<br />ifdown-ippp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifdown-sl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-ipx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-sit<br />ifdown-ipsec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-isdn&nbsp;&nbsp;&nbsp;&nbsp; ifup-sl<br />ifdown-ipv6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifup-aliases&nbsp;&nbsp;&nbsp; ifup-plip&nbsp;&nbsp;&nbsp;&nbsp; ifup-wireless<br />[root@tpwb network-scripts]# vi ifcfg-eth0<br />DEVICE=eth0 端口名称<br />BOOTPROTO=static <br />BROADCAST=192.168.0.255 广播地址<br />HWADDR=网卡MAC地址<br />IPADDR=192.168.0.5 IP地址<br />NETMASK=255.255.255.0 子网掩码<br />NETWORK=192.168.0.0 网段<br />GATEWAY=192.168.0.1 网关<br />ONBOOT=yes 开机自动加载<br />TYPE=Ethernet 端口类型<br />~<br />保存退出<br />大家可以看一下我的配置来对照自己的配置一下<br />一样和第一种方法开启eth0端口<br /><br />配置DNS<br /><br />[root@tpwb etc]# vi /etc/resolv.conf&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/161963#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 12 Feb 2008 19:38:55 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/161963</link>
        <guid>http://wenson.javaeye.com/blog/161963</guid>
      </item>
      <item>
        <title>说说Java接口的通俗理解</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/157707" style="color:red;">http://wenson.javaeye.com/blog/157707</a>&nbsp;
          发表时间: 2008年01月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div id="preview"><p>今天在Chinajavaworld中看到一则对Java接口理解的讨论，理解观点比较经典，现把主要内容摘录下来：</p><p>&nbsp;</p><p>&nbsp;</p><p>接口就是给出一些没有内容的方法，到具体用的时候再由用的方法自己定义内容 <br />要注意的是想用接口必须实现接口的所有方法&nbsp;</p><p>&nbsp;</p><p>举例，比如一台电脑：</p><p>主板上的PCI插槽就是现实中的接口 <br />你可你把声卡，显卡，网卡都插在PCI插槽上，而不用担心那个插槽是专门插哪个的 <br />原因是做主板的厂家和做各种卡的厂家都遵守了统一的规定 <br />包括尺寸，排线等等 <br />但是各种卡的内部结构是一样的么？答案必然是否定的！ <br />我们来模拟一下： <br />interface PCI <br />{ <br />&nbsp;&nbsp;void start(); <br />&nbsp;&nbsp;void stop(); <br />} <br />//这是接口，相当于主板上的PCI插槽 </p><p>class NetworkCard implements PCI <br />{ <br />&nbsp;&nbsp;public void start() <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Send...&quot;); <br />&nbsp;&nbsp;} <br />&nbsp;&nbsp;public void stop() <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Network stop!&quot;); <br />&nbsp;&nbsp;} <br />} <br />//网卡 <br />class SoundCard implements PCI <br />{ <br />&nbsp;&nbsp;public void start() <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Du du...&quot;); <br />&nbsp;&nbsp;} <br />&nbsp;&nbsp;public void stop() <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;Sound stop!&quot;); <br />&nbsp;&nbsp;} <br />} <br />//声卡 <br />class MainBoard <br />{ <br />&nbsp;&nbsp;public void usePCICard(PCI p) <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;p.start(); <br />&nbsp;&nbsp;&nbsp;&nbsp;p.stop(); <br />&nbsp;&nbsp;} <br />} <br />//主板调用接口的运行方法，也就是调用PCI的函数 <br />public class Assembler <br />{ <br />&nbsp;&nbsp;public static void main(String[] args) <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;MainBoard mb=new MainBoard(); <br />&nbsp;&nbsp;&nbsp;&nbsp;NetworkCard nc=new NetworkCard(); <br />&nbsp;&nbsp;&nbsp;&nbsp;mb.usePCICard(nc); <br />&nbsp;&nbsp;&nbsp;&nbsp;SoundCard sc=new SoundCard(); <br />&nbsp;&nbsp;&nbsp;&nbsp;mb.usePCICard(sc); <br />&nbsp;&nbsp;} <br />} <br />//这是运行 </p><p>&nbsp;</p><p>在上面所举的例子中，我发现即使不定义借口，各个类给出方法体，产生各自的行为，也可以实现相应的功能。那么，接口的意义到底在于什么地方呢？</p><p>&nbsp;</p><p>&nbsp;</p><p>这是个不错的问题，即使不定义接口我们还是一样写代码，一样的做 <br />可是企业级的开发可不是三两个人一天两天就能干完的 <br />几百人月的项目出来了，一个小公司干不了，就要把软件拆开分到很多小公司做 <br />那怎么能保证各个公司做的代码最后和到一起能像我们想得那样运行呢 <br />这里接口就体现了巨大的作用！ <br />我分给你的任务，我不管你内部具体怎么实现，只要你按着我给你定义好的接口写 <br />到我要用的时候统一调用就不会出现众多人写的代码和不到一起去的情况 <br />我这说的只是接口最浅显的用处，当然在编程中接口对于带代码的可重用性，安全性， <br />健壮性，可维护性等有着至关重要作用！ <br />所以有了新名词&mdash;&mdash;&ldquo;面向接口的编程&rdquo;。</p><p>&nbsp;</p><p>更俗一点的说法&mdash;&mdash;</p><p>接口就是只有定义没有实现的东东..要用的时候再来实现他.打个比方说就像是电脑后面的显示器接口一样,它只说了他能接上一个显示器.只有当接上显示器的时候它才能实现功能</p></div>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/157707#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Jan 2008 02:52:19 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/157707</link>
        <guid>http://wenson.javaeye.com/blog/157707</guid>
      </item>
      <item>
        <title>Remoting by NetConnection</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/156509" style="color:red;">http://wenson.javaeye.com/blog/156509</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一般在使用Flash Remoting功能的時候<br />都是安裝Remoting Library AS1、AS2 Component來用<br />其實是可以直接用NetConnection呼叫Remoting的</p><span class="fullpost"><p>因為AMF在Flash Player中的Serialize、Deserialize動作<br />都是透過NetConnection於底層完成，並非寫在AS<br />就是因為寫在底層，所以AMF會比其他格式來得更有效率</p><p>NetConnection具有兩種連線方式，決定於要連線URL通訊協定<br />對FlashCom RTMP連線是像Socket持續性即時連線<br />對Remoting Server HTTP則是非持續性連線</p><p>不過兩者都是以AMF格式作序列化</p><p>以下示範用NetConnection呼叫Remoting方式：</p><p>ActionScript Code：</p><div class="dp-highlighter"><div class="content" style="height: auto"><ol class="dp-as"><li class="alt"><span><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;nc:NetConnection&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">new</span></span><span>&nbsp;NetConnection();</span></span></li><li><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;url:</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #990000">&quot;http://192.168.0.10:8084/FlashRemoting/gateway&quot;</span></span><span>;</span></li><li class="alt"><span>nc.onResult&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">function</span></span><span>(data)&nbsp;{</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;onResult&nbsp;:&nbsp;&quot;</span></span><span>+data);</span></li><li class="alt"><span>};</span></li><li><span>nc.onStatus&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">function</span></span><span>(info)&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;onStatus&nbsp;:&nbsp;&quot;</span></span><span>+info);</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">for</span></span><span>&nbsp;(</span><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;i&nbsp;</span><span class="keyword"><span style="color: #0033ff">in</span></span><span>&nbsp;info)&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;info[&quot;</span></span><span>+i+</span><span class="string"><span style="color: #990000">&quot;]&nbsp;:&nbsp;&quot;</span></span><span>+info[i]);</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li class="alt"><span>};</span></li><li><span>nc.connect(url);</span></li><li class="alt"><span>nc.call(</span><span class="string"><span style="color: #990000">&quot;swl.NewClass.Test&quot;</span></span><span>,&nbsp;nc,&nbsp;11);</span></li><li><em><span style="color: #009900"><span class="comment">//output:&nbsp;onResult&nbsp;:&nbsp;Test()&nbsp;with&nbsp;Number&nbsp;:&nbsp;11.0</span></span></em></li></ol></div></div></span><pre name="code" class="as3">&nbsp;</pre>Java Class Code： <div class="dp-highlighter"><div class="content" style="height: auto"><ol class="dp-as"><li class="alt"><span><span class="definition"><strong><span style="color: #9900cc">package</span></strong></span><span>&nbsp;swl;</span></span></li><li><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="definition"><strong><span style="color: #9900cc">class</span></strong></span><span>&nbsp;NewClass&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;NewClass()&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;java.util.Map&nbsp;Test(java.util.Map&nbsp;map)&nbsp;{</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;map;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;Test(java.util.ArrayList&nbsp;arraylist)&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;</span><span class="string"><span style="color: #990000">&quot;Test()&nbsp;with&nbsp;ArrayList&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;arraylist;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;Test(</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;str)&nbsp;{</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;</span><span class="string"><span style="color: #990000">&quot;Test()&nbsp;with&nbsp;String&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;str;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;Test(</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>[]&nbsp;str)&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;</span><span class="string"><span style="color: #990000">&quot;Test()&nbsp;with&nbsp;String&nbsp;Array&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;str;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;Test(</span><span class="keyword"><span style="color: #0033ff">Number</span></span><span>&nbsp;num)&nbsp;{</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;</span><span class="string"><span style="color: #990000">&quot;Test()&nbsp;with&nbsp;Number&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;num;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;Test(boolean&nbsp;bo)&nbsp;{</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;</span><span class="string"><span style="color: #990000">&quot;Test()&nbsp;with&nbsp;boolean&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;bo;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;Test()&nbsp;{</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;</span><span class="string"><span style="color: #990000">&quot;Test()&nbsp;no&nbsp;arguments&quot;</span></span><span>;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></li><li><span>}</span></li></ol></div><p>&nbsp;</p><p><span>此文收藏自Ticore&lsquo;s Blog: <a href="http://ticore.blogspot.com/2005/09/remoting-by-netconnection.html">http://ticore.blogspot.com/2005/09/remoting-by-netconnection.html</a></span></p></div>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/156509#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 16 Jan 2008 15:43:56 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/156509</link>
        <guid>http://wenson.javaeye.com/blog/156509</guid>
      </item>
      <item>
        <title>OpenAMF - Custom Class Mapping</title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/156499" style="color:red;">http://wenson.javaeye.com/blog/156499</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small"><span><span style="font-size: x-small"><span style="font-family: 宋体"><span style="color: #333333"><span style="font-size: small; font-family: 宋体">要看这篇文章，先要对Remoting有些概念 <br />Remoting是可以让Flash AS程序与异质(heterogeneric)程序语言直接沟通的接口 <br />也就是让AS可以直接与其它程序语言进行沟通、呼叫、传递对象 <br />可以省去大量的数据解析的动作.</span></span></span></span></span></span></p><p><span style="font-size: small"><span><span style="font-size: x-small"><span style="font-family: 宋体"><span style="color: #333333"><span style="font-size: small; font-family: 宋体">由于不同程序语言的基础型别都不太一样<br />所以会有一个对象对照表<br />方便数据在不同程序中传递时进行转换的动作 <br />默认的对象对照仅包含基础型别的对象与常用的容器型别传递其它类别对象的时候<br />仍然必须自行作少量的数据解析动作 <br />自订类别转换可以补足此一缺憾因为OpanAMF是开放原始码的计划 <br />而且又是连结Java平台接口<br />功能远比其它版本的Remoting来得强大以下就用OpenAMF介绍自订类别转换的功能</span></span></span></span></span></span></p><p>&nbsp;</p><p><span><span style="font-size: x-small"><span style="font-size: small"><strong><span style="color: #333333; font-family: Georgia">1.</span></strong><span style="font-family: 宋体"><strong><span style="color: #333333">设定类别对照</span></strong></span></span></span></span></p><p><span><span style="font-size: x-small"><span style="font-size: small"><span style="color: #333333"><span style="font-family: 宋体">找出</span></span><span style="color: #333333; font-family: Georgia">OpenAMF</span><span style="color: #333333"><span style="font-family: 宋体">设定档</span></span><span style="color: #333333; font-family: Georgia"> </span></span></span></span></p><p><span><span style="font-size: x-small"><span style="font-size: small"><span style="color: #333333; font-family: Georgia">[WebApp]/WEB-INF/openamf-config.xml </span><span style="color: #333333"><span style="font-family: 宋体">在</span></span><span style="color: #333333; font-family: Georgia">config</span><span style="color: #333333"><span style="font-family: 宋体">结点内加入以下</span></span><span style="color: #333333; font-family: Georgia">XML</span><span style="color: #333333"><span style="font-family: 宋体">设定：</span></span></span></span></span></p><p><span style="color: #333333"><span><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: small">&lt;custom-class-mapping&gt;</span></span></span></span></span></p><p><span style="color: #333333"><span><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span>&lt;java-class&gt;idv.swl.remoting.myClass&lt;/java-class&gt;</span></span></span></span></span></p><p><span style="color: #333333"><span><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span>&lt;custom-class&gt;idv.swl.remoting.myClass&lt;/custom-class&gt;</span></span></span></span></span></p><p><span style="color: #333333"><span><span style="font-family: 宋体"><span style="font-size: x-small"><span style="font-size: small">&lt;/custom-class-mapping&gt;</span></span></span></span></span></p><p><span><span style="font-size: x-small"><span style="font-size: small"><span style="color: #333333"><span style="font-family: 宋体">这样就可以将</span></span><span style="color: #333333; font-family: Georgia">Server</span><span style="color: #333333"><span style="font-family: 宋体">端的</span></span></span></span></span><span><span style="font-size: x-small"><span style="font-size: small"><span style="color: #333333; font-family: Georgia">Java Class: idv.swl.remoting.myClass <br /></span><span style="color: #333333"><span style="font-family: 宋体">与</span></span><span style="color: #333333; font-family: Georgia">Flash</span><span style="color: #333333"><span style="font-family: 宋体">端的</span></span><span style="color: #333333; font-family: Georgia">AS Class:idv.swl.remoting.myClass</span><span style="font-family: 宋体"><span style="color: #333333">完成对照</span></span></span></span></span></p><p>&nbsp;</p><p><span style="font-size: small"><span><span style="font-size: x-small"><strong><span style="color: #333333; font-family: Georgia">2.</span></strong><strong><span style="color: #333333"><span style="font-family: 宋体">撰写</span></span></strong><strong><span style="color: #333333; font-family: Georgia">Flash AS Class</span></strong></span></span> </span></p><p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left"><span><span style="font-size: x-small"><span style="font-size: small"><span style="color: #333333; font-family: Georgia">myClass.as</span><span style="color: #333333"><span style="font-family: 宋体">：</span></span></span></span></span></p><span><span style="color: #333333"><ol><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span class="definition"><strong><span style="color: #9900cc">class</span></strong></span><span>&nbsp;idv.swl.remoting.myClass&nbsp;{</span></span></span></span></li><li><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;count:</span><span class="keyword"><span style="color: #0033ff">Number</span></span><span>;</span></span></span></li><li class="alt"><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;log:</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>;</span></span></span></li><li><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">function</span></span><span>&nbsp;myClass()&nbsp;{</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;}</span></span></span></li><li><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">function</span></span><span>&nbsp;doTrace()&nbsp;{</span></span></span></li><li class="alt"><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;count&nbsp;:&nbsp;&quot;</span></span><span>+count);</span></span></span></li><li><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;log&nbsp;:&nbsp;&quot;</span></span><span>+log);</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;}</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">}</span></span></span></li></ol><p><span style="color: #333333; font-family: Georgia"><span><span style="font-size: x-small"><span style="font-size: small"><strong><span style="color: #333333; font-family: Georgia">3.</span></strong><strong><span style="color: #333333"><span style="font-family: 宋体">撰写</span></span></strong><strong><span style="color: #333333; font-family: Georgia">Server Java Class</span></strong></span></span></span></span></p></span></span><span style="color: #333333; font-family: Georgia"><span><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: 宋体"><span style="font-size: small"><span style="color: #333333; font-family: Georgia">Java Class</span><span style="color: #333333"><span style="font-family: 宋体">要依循</span></span><span style="color: #333333; font-family: Georgia">JavaBean</span><span style="color: #333333"><span style="font-family: 宋体">的撰写规范</span></span></span></span></span></span></span><span style="color: #333333; font-family: Georgia"><span style="font-size: x-small"><span style="font-size: small"><span style="font-size: small; font-family: 宋体"> </span></span></span><span><br /></span></span><span style="font-size: small"><span><span style="font-family: 宋体"><span style="font-size: x-small"><span style="color: #333333"><span style="font-size: small; font-family: 宋体">才能进行序列化、反序列化的动作</span></span></span></span></span> </span></span><span style="color: #333333; font-family: Georgia"><p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left"><span><span style="font-size: x-small"><span style="font-size: small"><span style="color: #333333; font-family: Georgia">myClass.java</span><span style="color: #333333"><span style="font-family: 宋体">：</span></span></span></span></span></p><span><span style="color: #333333"><ol><li class="alt"><span><span><span style="font-size: x-small"><span style="font-size: small"><span class="definition"><strong><span style="color: #9900cc">package</span></strong></span><span>&nbsp;idv.swl.remoting;</span></span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="definition"><strong><span style="color: #9900cc">class</span></strong></span><span>&nbsp;myClass&nbsp;</span><span class="keyword"><span style="color: #0033ff">implements</span></span><span>&nbsp;java.io.Serializable&nbsp;{</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">int</span></span><span>&nbsp;count;</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;log;</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;myClass()&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">void</span></span><span>&nbsp;setCount(</span><span class="keyword"><span style="color: #0033ff">int</span></span><span>&nbsp;count)&nbsp;{</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">this</span></span><span>.count&nbsp;=&nbsp;count;</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">int</span></span><span>&nbsp;getCount()&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;count;</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">void</span></span><span>&nbsp;setLog(</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;log)&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">this</span></span><span>.log&nbsp;=&nbsp;log;</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">String</span></span><span>&nbsp;getLog()&nbsp;{</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;log;</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">void</span></span><span>&nbsp;doTrace()&nbsp;{</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string"><span style="color: #990000">&quot;count&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;count);</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string"><span style="color: #990000">&quot;log&nbsp;:&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;log);</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">}</span></span></span></li></ol></span><p class="alt">&nbsp;</p><p><span><span><span style="font-size: x-small"><span style="font-size: small"><strong><span style="color: #333333; font-family: Georgia">4.</span></strong><span style="font-family: 宋体"><strong><span style="color: #333333">撰写测试程序</span></strong></span></span></span></span></span></p><span><span><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: 宋体"><span style="font-size: small"><span style="color: #333333"><span style="font-family: 宋体">以下的测试程序是将自订类别</span></span><span style="color: #333333; font-family: Georgia">(myClass)</span><span style="color: #333333"><span style="font-family: 宋体">对象在</span></span><span style="color: #333333; font-family: Georgia">Client-Server</span><span style="color: #333333"><span style="font-family: 宋体">之间互丢</span></span></span></span></span></span></span><span style="color: #333333; font-family: Georgia"><br /></span><span style="font-size: small"><span style="font-family: 宋体"><span style="font-size: small"><span><span style="font-size: x-small"><span style="color: #333333"><span style="font-family: 宋体">并执行</span></span><span style="color: #333333; font-family: Georgia">myClass for Java and AS</span><span style="color: #333333"><span style="font-family: 宋体">的</span></span><span style="color: #333333; font-family: Georgia">function </span><span style="color: #333333"><span style="font-family: 宋体">直到</span></span><span style="color: #333333; font-family: Georgia">myClass.count</span><span style="color: #333333"><span style="font-family: 宋体">计数器累加到</span></span><span style="color: #333333; font-family: Georgia">3</span></span></span><span><span style="font-size: x-small"><span style="color: #333333; font-family: Georgia">Server Class</span><span style="color: #333333"><span style="font-family: 宋体">：</span></span></span></span></span></span> </span></span><span><ol class="dp-as"><li class="alt"><span><span><span style="font-size: x-small"><span style="font-size: small"><span class="definition"><strong><span style="color: #9900cc">package</span></strong></span><span>&nbsp;idv.swl.remoting;</span></span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="definition"><strong><span style="color: #9900cc">class</span></strong></span><span>&nbsp;server&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">public</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">static</span></span><span>&nbsp;myClass&nbsp;process(myClass&nbsp;obj)&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.count++;</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.log&nbsp;+=&nbsp;</span><span class="string"><span style="color: #990000">&quot;java&nbsp;processing&nbsp;at&nbsp;&quot;</span></span><span>&nbsp;+&nbsp;</span><span class="keyword"><span style="color: #0033ff">new</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">Date</span></span><span>()&nbsp;+&nbsp;</span><span class="string"><span style="color: #990000">&quot;n&quot;</span></span><span>;</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.doTrace();</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">return</span></span><span>&nbsp;obj;</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">}</span></span></span></li></ol></span><p class="alt"><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;Flash AS in Frame 1： </span></span></span></p><span><ol class="dp-as"><li class="alt"><span><em><span style="color: #009900"><span><span style="font-size: x-small"><span class="comment"><span style="font-size: small">//==================================================</span></span></span></span></span></em></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span class="keyword"><span style="color: #0033ff">import</span></span><span>&nbsp;idv.swl.remoting.myClass;</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span class="keyword"><span style="color: #0033ff">Object</span></span><span>.registerClass(</span><span class="string"><span style="color: #990000">&quot;idv.swl.remoting.myClass&quot;</span></span><span>,&nbsp;idv.swl.remoting.myClass);</span></span></span></span></li><li><em><span style="color: #009900"><span><span style="font-size: x-small"><span class="comment"><span style="font-size: small">//==================================================</span></span></span></span></span></em></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;nc:NetConnection&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">new</span></span><span>&nbsp;NetConnection();</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>nc.onResult&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">function</span></span><span>(data)&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;onResult&nbsp;:&nbsp;&quot;</span></span><span>);</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;data.doTrace();</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">if</span></span><span>&nbsp;(data.count&lt;3)&nbsp;{</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;data.log&nbsp;+=&nbsp;</span><span class="string"><span style="color: #990000">&quot;Flash&nbsp;processing&nbsp;at&nbsp;&quot;</span></span><span>+</span><span class="keyword"><span style="color: #0033ff">new</span></span><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">Date</span></span><span>()+</span><span class="string"><span style="color: #990000">&quot;n&quot;</span></span><span>;</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;nc.call(</span><span class="string"><span style="color: #990000">&quot;idv.swl.remoting.server.process&quot;</span></span><span>,&nbsp;nc,&nbsp;data);</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;}</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">};</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>nc.onStatus&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">function</span></span><span>(data)&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(</span><span class="string"><span style="color: #990000">&quot;onStatus&nbsp;:&nbsp;&quot;</span></span><span>);</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;</span><span class="keyword"><span style="color: #0033ff">for</span></span><span>&nbsp;(</span><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;i&nbsp;</span><span class="keyword"><span style="color: #0033ff">in</span></span><span>&nbsp;data)&nbsp;{</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>&nbsp;&nbsp;</span><span class="keyword"><span style="color: #0033ff">trace</span></span><span>(i+</span><span class="string"><span style="color: #990000">&quot;&nbsp;:&nbsp;&quot;</span></span><span>+data[i]);</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">&nbsp;}</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small">};</span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span>nc.connect(</span><span class="string"><span style="color: #990000">&quot;http://localhost:8084/RemotingTest/gateway&quot;</span></span><span>);</span></span></span></span></li><li class="alt"><em><span style="color: #009900"><span><span style="font-size: x-small"><span class="comment"><span style="font-size: small">//==================================================</span></span></span></span></span></em></li><li><span><span style="font-size: x-small"><span style="font-size: small"><span class="variable"><strong><span style="color: #6699cc">var</span></strong></span><span>&nbsp;obj:myClass&nbsp;=&nbsp;</span><span class="keyword"><span style="color: #0033ff">new</span></span><span>&nbsp;myClass();</span></span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>obj.log&nbsp;=&nbsp;</span><span class="string"><span style="color: #990000">&quot;&quot;</span></span><span>;</span></span></span></span></li><li><span><span style="font-size: x-small"><span style="font-size: small">obj.count&nbsp;=&nbsp;0;</span></span></span></li><li class="alt"><span><span style="font-size: x-small"><span style="font-size: small"><span>nc.call(</span><span class="string"><span style="color: #990000">&quot;idv.swl.remoting.server.process&quot;</span></span><span>,&nbsp;nc,&nbsp;obj);</span></span></span></span></li></ol></span></span><span style="font-size: small"><span style="color: #333333; font-family: Georgia"><span style="font-size: x-small">Flash Output： </span></span>&nbsp;</span><span style="color: #333333; font-family: Georgia"><span style="font-size: small"> </span><table border="0" style="background-color: #d6d6d6"><tbody><tr><td><span style="font-size: small"><span style="font-size: x-small">&nbsp;</span> </span><p><span style="color: #333333; font-family: Georgia"><span style="font-size: x-small"><span style="font-size: small">onResult : <br />count : 1<br />log : java processing at Mon Apr 04 14:55:03 CST 2005<br /><br />onResult : <br />count : 2<br />log : java processing at Mon Apr 04 14:55:03 CST 2005<br />Flash processing at Mon Apr 4 14:55:03 GMT+0800 2005<br />java processing at Mon Apr 04 14:55:03 CST 2005<br /><br />onResult : <br />count : 3<br />log : java processing at Mon Apr 04 14:55:03 CST 2005<br />Flash processing at Mon Apr 4 14:55:03 GMT+0800 2005<br />java processing at Mon Apr 04 14:55:03 CST 2005<br />Flash processing at Mon Apr 4 14:55:03 GMT+0800 2005<br />java processing at Mon Apr 04 14:55:03 CST 2005</span></span></span></p></td></tr></tbody></table><p>&nbsp;</p><p>&nbsp;</p><p><span style="font-size: small">此文章收藏自Ticore's blog:http://ticore.blogspot.com/2005/09/openamf.html</span></p></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://wenson.javaeye.com/blog/156499#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jan 2008 15:29:44 +0800</pubDate>
        <link>http://wenson.javaeye.com/blog/156499</link>
        <guid>http://wenson.javaeye.com/blog/156499</guid>
      </item>
      <item>
        <title>Apache安装配置与优化 </title>
        <author>wenson</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wenson.javaeye.com">wenson</a>&nbsp;
          链接：<a href="http://wenson.javaeye.com/blog/156298" style="color:red;">http://wenson.javaeye.com/blog/156298</a>&nbsp;
          发表时间: 2008年01月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>&nbsp;出處：<a href="http://www.blogjava.net/zpuser/archive/2007/04/29/114548.html">http://www.blogjava.net/zpuser/archive/2007/04/29/114548.html</a></span></p><p>&nbsp;</p><p><span>本文</span>针对apache&nbsp; web服务器的安装配置收集有效的一些经验和方法，用于交流。 </p><p>&nbsp;</p><p><span style="font-family: 黑体"><span style="font-size: small"><strong><span><span>1.</span></span><span>Apache</span><span style="font-family: 宋体">安装配置</span></strong></span></span></p><p class="MsoNormal"><span>Apache</span><span style="font-family: 宋体">的安装，考虑只用于</span><span>Tomcat</span><span style="font-family: 宋体">的前段代理，处理图片和静态文件的请求，并把动态请求转发到</span><span>tomcat</span><span style="font-family: 宋体">服务处理。本文使用编译安装方式，把跟需求无关的模块关闭，只使用最小的模块编译，提高软件性能。</span></p><p class="MsoNormal"><span style="font-family: 宋体">配置编译命令请参考：</span></p><p class="MsoNormal"><span><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/install.html#configure">http://www.uplinux.com/download/doc/apache/ApacheManual/install.html#configure</a></span></p><p class="MsoNormal"><span style="font-family: 宋体">编译参数说明：</span></p><p class="MsoNormal"><span style="font-family: 宋体">编译和包含是两个不同的概念。编译是指这个模块被编译了，要想使用它，只用简单的修改</span><span>httpd.conf</span><span style="font-family: 宋体">加上</span><span>LoadModule xxx_module<span>&nbsp; </span>libexec/mod_xxx.so </span><span style="font-family: 宋体">明确指出。</span></p><p class="MsoNormal"><span style="font-family: 宋体">用以前命令可以查看缺省时已编译和包含进去的模块。不用显式的</span><span>--enable-MODULE[=shared] </span><span style="font-family: 宋体">和</span><span>LoadModule </span><span style="font-family: 宋体">操作。就已经可以使用的。</span></p><ol><li><span>core.c</span><span style="font-family: 宋体">：</span><span>Apache HTTP </span><span style="font-family: 宋体">服务器提供的核心功能。必须要有的。</span> </li><li><span>mod_access.c</span><span style="font-family: 宋体">：安全认证大大降低访问速度，建议</span><span>disable it .</span> </li><li><span>mod_auth.c </span><span style="font-family: 宋体">：安全认证大大降低访问速度，建议</span><span>disable it .</span> </li><li><span>mod_include.c</span><span style="font-family: 宋体">：</span><span>server side include</span><span style="font-family: 宋体">已经过时了，建议</span><span>disable it .</span> </li><li><span>mod_log_config.c</span><span style="font-family: 宋体">：用于定制</span><span>log</span><span style="font-family: 宋体">格式</span><span>.</span><span style="font-family: 宋体">最好保留</span><span>.</span> </li><li><span>mod_env.c</span><span style="font-family: 宋体">：修改传送到</span><span> CGI </span><span style="font-family: 宋体">脚本和</span><span> SSI </span><span style="font-family: 宋体">页面的系统环境（变量）。一般说来，可以不需要。</span> </li><li><span>mod_setenvif.c </span><span style="font-family: 宋体">：用户设置环境变量和认证相关，如果没有使用压缩输出，建议</span><span>disable it .</span> </li><li><span>prefork.c</span><span style="font-family: 宋体">：</span><span>Implements a non-threaded, pre-forking web server</span><span style="font-family: 宋体">。参考下面的</span><span>mpm</span><span style="font-family: 宋体">介绍。</span> </li><li><span>http_core.c</span><span style="font-family: 宋体">：</span><span>Apache HTTP </span><span style="font-family: 宋体">服务器提供的核心功能。必须要有的。</span> </li><li><span>mod_mime.c</span><span style="font-family: 宋体">：用于增加文件应用的关联。最好保留。</span> </li><li><span>mod_status.c</span><span style="font-family: 宋体">：</span><span>Provides information on server activity and performance </span><span style="font-family: 宋体">。一般说来，可以不需要。</span> </li><li><span>mod_autoindex.c</span><span style="font-family: 宋体">：不需要将没有缺省</span><span>index</span><span style="font-family: 宋体">文件的目录下所有文件列出，建议</span><span>disable it .</span> </li><li><span>mod_asis.c</span><span style="font-family: 宋体">：尽量不使用</span><span>CGI</span><span style="font-family: 宋体">：一直是</span><span>Apache</span><span style="font-family: 宋体">安全问题最多的地方，建议</span><span>disable it .</span> </li><li><span>mod_cgi.c</span><span style="font-family: 宋体">：尽量不使用</span><span>CGI</span><span style="font-family: 宋体">：一直是</span><span>Apache</span><span style="font-family: 宋体">安全问题最多的地方，建议</span><span>disable it .</span> </li><li><span>mod_negotiation.c </span><span style="font-family: 宋体">：内容协商，</span><span style="font-family: 宋体">以根据浏览器提供的设置选择不同媒介类型、语言、字符集和编码的最佳表现，</span><span style="font-family: 宋体">还有对来自浏览器的不完整内容协商信息作智能处理的能力。一般说来，可以不需要。</span> </li><li><span>mod_dir.c</span><span style="font-family: 宋体">：用于缺省</span><span>index</span><span style="font-family: 宋体">文件：</span><span>index.php</span><span style="font-family: 宋体">等。我们现在的应用不需要这个。看情况而定。</span> </li><li><span>mod_imap.c</span><span style="font-family: 宋体">：尽量不使用</span><span>CGI</span><span style="font-family: 宋体">：一直是</span><span>Apache</span><span style="font-family: 宋体">安全问题最多的地方，建议</span><span>disable it .</span> </li><li><span>mod_actions.c</span><span style="font-family: 宋体">：尽量不使用</span><span>CGI</span><span style="font-family: 宋体">：一直是</span><span>Apache</span><span style="font-family: 宋体">安全问题最多的地方，建议</span><span>disable it </span></li><li><span>mod_userdir.c</span><span style="font-family: 宋体">：比如：需要在</span><span>~/username/</span><span style="font-family: 宋体">下调试</span><span>php.</span><span style="font-family: 宋体">可用可不用</span><span>.</span><span style="font-family: 宋体">建议</span><span>disable it .</span> </li><li><span>mod_alias.c</span><span style="font-family: 宋体">：比如：需要将以前的</span><span>URL</span><span style="font-family: 宋体">进行转向或者需要使用</span><span>CGI script-alias.</span><span style="font-family: 宋体">建议</span><span>disable it .</span> </li><li><span>mod_so.c </span><span style="font-family: 宋体">：如果编译中包含有任何动态模块，则</span><span>mod_so</span><span style="font-family: 宋体">模块会被自动包含进核心。如果希望核心能够装载</span><span>DSO</span><span style="font-family: 宋体">，而不实际编译任何动态模块，需要明确指定</span><span>--enable-so</span><span style="font-family: 宋体">。我们的应用使用静态编译，不需要它。建议</span><span>disable it .</span> </li><li><span>CC=&quot;pgcc&quot; CFLAGS=&quot;-O2&quot; </span><span style="font-family: 宋体">：编译器参数优化</span> </li><li><span>--profix</span><span style="font-family: 宋体">：</span><span>apache</span><span style="font-family: 宋体">的安装目录，默认是安装在</span><span>/usr/local/apache</span></li></ol><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000">$&nbsp;cd&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">tools<br />$&nbsp;tar&nbsp;&ndash;xzvf&nbsp;apache</span><span style="color: #000000">-</span><span style="color: #000000">2.0</span><span style="color: #000000">.</span><span style="color: #000000">59</span><span style="color: #000000">.tar.gz<br />$&nbsp;cd&nbsp;httpd2.</span><span style="color: #000000">0.59</span><span style="color: #000000"><br />$&nbsp;CC</span><span style="color: #000000">=</span><span style="color: #800000">&quot;</span><span style="color: #800000">pgcc</span><span style="color: #800000">&quot;</span><span style="color: #000000">&nbsp;CFLAGS</span><span style="color: #000000">=</span><span style="color: #800000">&quot;</span><span style="color: #800000">-O2</span><span style="color: #800000">&quot;</span><span style="color: #000000">&nbsp;\<br />.</span><span style="color: #000000">/</span><span style="color: #000000">configure&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">prefix</span><span style="color: #000000">=/</span><span style="color: #000000">usr</span><span style="color: #000000">/</span><span style="color: #000000">apache</span><span style="color: #000000">-</span><span style="color: #000000">2.0</span><span style="color: #000000">.</span><span style="color: #000000">59</span><span style="color: #000000">&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">access&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">auth&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">include&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">env&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">status&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">autoindex&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">asis&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">cgi&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">negotiation&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">imap&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">actions&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</span><span style="color: #000000">-</span><span style="color: #000000">userdir&nbsp;\<br /></span><span style="color: #000000">--</span><span style="color: #000000">disable</spa