<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>eddie</title>
    <description>J2EE开源软件爱好者,如Spring,Mule,jbossCache,MemCached,CAS等等。</description>
    <link>http://eddie.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>一个简单实际可用的CAS配置日志</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/78490" style="color:red;">http://eddie.javaeye.com/blog/78490</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="MARGIN: auto 0cm auto 21.6pt"><strong><font size="6"><span>1<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>目的</font></strong></div>
<div align="left"><span style="FONT-SIZE: 12pt">撰写本文的目的是记录一个简单、以数据库为验证用户的单点登陆的</span><span style="FONT-SIZE: 12pt">CAS</span><span style="FONT-SIZE: 12pt">配置过程，看过其他文档，要么没有配置过程，要么过于复杂。配置之前建议先仔细研究下相关的参考文档，只有明白了相关原理，配置起来其实很简单。</span></div>
<div style="MARGIN: auto 0cm auto 21.6pt"><strong><font size="6"><span>2<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>名词解说</font></strong></div>
<div align="left" style="LINE-HEIGHT: 17.75pt"><span style="FONT-SIZE: 9pt; COLOR: black">Single Sign On - </span><span style="FONT-SIZE: 9pt; COLOR: black">通过用户登录一次，即可获得需访问系统和应用软件的授权。</span></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: black">Yale CAS - </span><span style="FONT-SIZE: 9pt; COLOR: black">耶鲁大学开发的单点登录（</span><span style="FONT-SIZE: 9pt; COLOR: black">Single Sign On</span><span style="FONT-SIZE: 9pt; COLOR: black">）系统称为</span><span style="FONT-SIZE: 9pt; COLOR: black">CAS</span><span style="FONT-SIZE: 9pt; COLOR: black">（</span><span style="FONT-SIZE: 9pt; COLOR: black">Central Authentication Server</span><span style="FONT-SIZE: 9pt; COLOR: black">）被设计成一个独立的</span><span style="FONT-SIZE: 9pt; COLOR: black">Web</span><span style="FONT-SIZE: 9pt; COLOR: black">应用程序</span><span style="FONT-SIZE: 9pt; COLOR: black">(cas.war)</span><span style="FONT-SIZE: 9pt; COLOR: black">。</span></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: black">CAS </span><span style="FONT-SIZE: 9pt; COLOR: black">网址</span><span style="FONT-SIZE: 9pt; COLOR: blue"><a href="http://www.ja-sig.org/products/cas/index.html"><span style="COLOR: purple">http://www.ja-sig.org/products/cas/index.html</span></a></span></div>
<div style="MARGIN: auto 0cm auto 21.6pt"><strong><font size="6"><span>3<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>参考</font></strong></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue">Keytool</span><span style="FONT-SIZE: 9pt; COLOR: blue">使用指南：</span></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue"><a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html"><span style="COLOR: purple">http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html</span></a></span></div>
<div align="left">&nbsp;</div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue">Tomcat-ssl</span><span style="FONT-SIZE: 9pt; COLOR: blue">配置指南：</span></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue"><a href="http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html"><span style="COLOR: purple">http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html</span></a></span></div>
<div align="left">&nbsp;</div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue">Cas</span><span style="FONT-SIZE: 9pt; COLOR: blue">文档：</span></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue"><a href="http://www.ja-sig.org/products/cas/server/index.html"><span style="COLOR: purple">http://www.ja-sig.org/products/cas/server/index.html</span></a></span></div>
<div style="MARGIN: auto 0cm auto 21.6pt"><strong><font size="6"><span>4<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>安装环境</font></strong></div>
<div align="left"><span style="FONT-SIZE: 9pt; COLOR: blue">WINXP + JDK1.5 + Tomcat 5.5.30&nbsp;+ <a href="http://www.ja-sig.org/downloads/cas/cas-server-3.0.7.zip">CAS Server 3.0.7 + </a><a href="http://www.ja-sig.org/products/cas/client/javaclient/index.html"><span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">Yale CAS Client</span><font color="#800080"> 2.1.1</font></a></span></div>
<div style="MARGIN: auto 0cm auto 21.6pt"><strong><font size="6"><span>5<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>配置过程</font></strong></div>
<div style="MARGIN: auto 0cm auto 28.8pt"><strong><font size="5"><span style="COLOR: blue">5.1<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>安装和配置Tomcat的SSL</font></strong></div>
<div align="left" style="MARGIN: 17pt 0cm 16.5pt"><span style="FONT-SIZE: 12pt; COLOR: black">参考以下帖子-Tomcat SSL配置大全：</span></div>
<div align="left" style="MARGIN: 17pt 0cm 16.5pt"><em><span style="FONT-SIZE: 9pt; COLOR: blue"><a href="http://www.javaeye.com/topic/78274"><font color="#800080">http://www.javaeye.com/topic/78274</font></a></span></em></div>
<div style="MARGIN: auto 0cm auto 28.8pt"><strong><font size="5"><span>5.2<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>配置CAS服务器端</font></strong></div>
<div align="left" style="MARGIN: 17pt 0cm 16.5pt"><span style="FONT-SIZE: 12pt; COLOR: black">解压 cas-server-3.0.6.zip，把 \target\cas.war copy 到 %CATALINA_HOME%\webapps\ 下</span></div>
<div style="MARGIN: auto 0cm auto 28.8pt"><strong><font size="5"><span>5.3<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>配置CAS 客户端</font></strong></div>
<div align="left" style="MARGIN: 17pt 0cm 16.5pt"><span style="FONT-SIZE: 12pt; COLOR: black">我们要将</span><span style="COLOR: black">tomcat</span><span style="COLOR: black">的</span><span style="COLOR: black">jsp-examples </span><span style="COLOR: black">及</span><span style="COLOR: black">servlets-examples2</span><span style="COLOR: black">个应用全部经过</span><span style="COLOR: black">SSO</span><span style="COLOR: black">的验证，</span><span style="COLOR: black">CAS</span><span style="COLOR: black">缺省验证方式的类是：</span><strong><span style="FONT-SIZE: 10pt; COLOR: navy">org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler</span></strong></div>
<div align="left" style="MARGIN: 17pt 0cm 16.5pt"><span style="FONT-SIZE: 12pt; COLOR: black">这种配置只是用于测试目的，只要用户名和密码相同就可以验证通过了。</span></div>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5">5.3.1</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><font size="5">配置应用servlets-examples</font></font></strong></div>
<div><span style="COLOR: black">修改</span><span style="COLOR: black"><!--TALINA_HOM-->\webapps\servlets-examples\WEB-INF\web.xml</span></div>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black">在</span><span style="FONT-SIZE: 10.5pt; COLOR: black"> servlet </span><span style="FONT-SIZE: 10.5pt; COLOR: black">及</span><span style="FONT-SIZE: 10.5pt; COLOR: black"> servlet-mapping </span><span style="FONT-SIZE: 10.5pt; COLOR: black">中间加上以下设置</span><span style="FONT-SIZE: 12pt">：</span></p>
<span style="FONT-SIZE: 12pt">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>CASFilter</span><span class="tag"><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.CASFilter &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.loginUrl &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>https://localhost:8443/cas/login</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.validateUrl &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;https://localhost:8443/cas/proxyValidate &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.serverName &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>localhost:8080</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.serverName2 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>192.168.5.13:8080</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>CASFilter</span><span class="tag"><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>/servlet/*</span><span class="tag"><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>&nbsp;</p>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><strong><span style="COLOR: red">注</span></strong><strong><span style="COLOR: red">: edu.yale.its.tp.cas.client.filter.serverName </span></strong><strong><span style="COLOR: red">是表示需要</span></strong><strong><span style="COLOR: red"> redirect </span></strong><strong><span style="COLOR: red">的网址</span></strong><strong><span style="COLOR: red">，</span></strong><strong><span style="COLOR: red">如果有</span></strong><strong><span style="COLOR: red">1</span></strong><strong><span style="COLOR: red">个以上的网址</span></strong><strong><span style="COLOR: red">, </span></strong><strong><span style="COLOR: red">则可以一直增加上去</span></strong><strong><span style="COLOR: red">，</span></strong><strong><span style="COLOR: red">注意</span></strong><strong><span style="COLOR: red"> param-name </span></strong><strong><span style="COLOR: red">要不一样</span></strong></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><strong><span style="COLOR: red">edu.yale.its.tp.cas.client.filter.loginUrl </span></strong><strong><span style="COLOR: red">是</span></strong><strong><span style="COLOR: red"> redirect </span></strong><strong><span style="COLOR: red">的网址</span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: red">。</span></strong></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><strong><span style="FONT-SIZE: 12pt; COLOR: red"></span></strong>&nbsp;</div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><strong><span style="FONT-SIZE: 12pt; COLOR: red"></span></strong>&nbsp;</div>
<p>&nbsp;</p>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5"><strong><font size="4"><span><font size="5">5.3.2</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span></font></strong></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><font size="5">配置应用<span style="COLOR: black; LINE-HEIGHT: 173%">jsp-examples</span></font></font></strong></div>
<div><span style="FONT-SIZE: 12pt"><font face="Arial">修改%CATALINA_HOME%\webapps\jsp-examples\WEB-INF\web.xml在 servlet 及 servlet-mapping中间加上以下设置：</font></span></div>
<div><span style="FONT-SIZE: 12pt">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>CASFilter</span><span class="tag"><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.CASFilter &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.loginUrl &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>https://localhost:8443/cas/login</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.validateUrl &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;https://localhost:8443/cas/proxyValidate &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.serverName &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>localhost:8080</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edu.yale.its.tp.cas.client.filter.serverName2 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>192.168.5.13:8080</span><span class="tag"><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>CASFilter</span><span class="tag"><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>/*</span><span class="tag"><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
</span></div>
<p>&nbsp;</p>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><strong><span style="COLOR: red">注</span></strong><strong><span style="COLOR: red">: jsp-examples</span></strong><strong><span style="COLOR: red">，</span></strong><strong><span style="COLOR: red">和</span></strong><strong><span style="COLOR: red"> servlets-examples </span></strong><strong><span style="COLOR: red">基本上大同小异</span></strong><strong><span style="COLOR: red">，</span></strong><strong><span style="COLOR: red">唯一不一样就是</span></strong><strong><span style="COLOR: red"> filter-mapping </span></strong><strong><span style="COLOR: red">的</span></strong><strong><span style="COLOR: red"> url-pattern</span></strong><strong><span style="COLOR: red">，</span></strong><strong><span style="COLOR: red">jsp-examples </span></strong><strong><span style="COLOR: red">是</span></strong><strong><span style="COLOR: red"> /*</span></strong><strong><span style="COLOR: red">，</span></strong><strong><span style="COLOR: red">servlets-examples </span></strong><strong><span style="COLOR: red">是</span></strong><strong><span style="COLOR: red"> /servlet/*</span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: red">。</span></strong></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><strong>&nbsp;</strong></div>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5">5.3.3</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><font size="5">设置需要用到的cas-client库</font></font></strong></div>
<div><span style="FONT-SIZE: 12pt; COLOR: black">将casclient-2.1.1.zip改名为casclient-2.1.1.jar， copy </span><span style="FONT-SIZE: 12pt; COLOR: black">到</span><span style="FONT-SIZE: 12pt; COLOR: black">jsp-examples </span><span style="FONT-SIZE: 12pt; COLOR: black">及</span><span style="FONT-SIZE: 12pt; COLOR: black"> servlets-examples</span><span style="FONT-SIZE: 12pt; COLOR: black">的</span><span style="FONT-SIZE: 12pt; COLOR: black">lib</span><span style="FONT-SIZE: 12pt; COLOR: black">下</span><span style="FONT-SIZE: 12pt; COLOR: black">。</span></div>
<div>&nbsp;</div>
<strong>
<div style="MARGIN: auto 0cm auto 28.8pt"><strong><font size="5"><span style="FONT-SIZE: 12pt; COLOR: navy"><span>5.4<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black">测试配置</span></font></strong></div>
<div style="MARGIN: auto 0cm auto 28.8pt"><strong><font size="5"><span style="FONT-SIZE: 12pt; COLOR: black">
<div><span style="FONT-SIZE: 12pt">启动tomcat,访问如下地址：</span></div>
<div><span style="FONT-SIZE: 12pt"><a href="http://localhost:8080/jsp-examples/"><span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">http://localhost:8080/jsp-examples/</span></a></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt">这时，系统会提示你将要访问的是加密网站，并问你接受该网站提供的证书，点接受后，将显示CAS单点登陆页面，地址变成如下：</span></div>
<div><span style="FONT-SIZE: 12pt"><a href="https://localhost:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fjsp-examples%2F"><span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">https://localhost:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fjsp-examples%2F</span></a></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt">输入任意的用户名，密码和用户名相同就可以进入刚才要访问的页面。</span></div>
<div><span style="FONT-SIZE: 12pt">这时再访问servlets-examples 应用下面的任一个servlet,如：</span></div>
<div><span style="FONT-SIZE: 12pt"><a href="http://localhost:8080/servlets-examples/servlet/HelloWorldExample"><span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">http://localhost:8080/servlets-examples/servlet/HelloWorldExample</span></a></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt">访问后，你会发现地址栏的地址变为：</span></div>
<div><span style="FONT-SIZE: 12pt"><a href="http://localhost:8080/servlets-examples/servlet/HelloWorldExample?ticket=ST-3-6EuKFN4M2aLj9cVup6sABykzheEnAnY3Zmb-20"><span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">http://localhost:8080/servlets-examples/servlet/HelloWorldExample?ticket=ST-3-6EuKFN4M2aLj9cVup6sABykzheEnAnY3Zmb-20</span></a></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt">后面增加了?ticket=ST-3-6EuKFN4M2aLj9cVup6sABykzheEnAnY3Zmb-20,这就是CAS的ticket(票据)</span></div>
<span style="FONT-SIZE: 12pt">刚才我们其实配置了2个应用都是需要验证用户的，如果用户先访问servlets-examples应用下面的servlet,同样会提示登陆，再访问jsp-examples，也不会提示登陆了，说明我们的单点登陆配置成功。</span></span></font></strong></div>
<div><span style="COLOR: black"></span></div>
<div><strong><font size="5"><span><font size="3"></font></span></font></strong></div>
<div><strong><font size="5"><span>5.5<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>配置<span>CAS通过数据库验证用户</span></font></strong></div>
<div><strong><font size="5"><span>
<div><span style="FONT-SIZE: 12pt">CAS</span><span style="FONT-SIZE: 12pt">缺省配置只是用于测试目的，实际应用中，通过数据库进行验证用户最为常见，所以，我们现在测试通过数据库验证用户。先停止tomcat.</span></div>
</span></font></strong></div>
<div style="MARGIN: auto 0cm"><strong><font size="5"><span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: DE; mso-bidi-language: AR-SA"><span lang="DE"></span></span></span></font></strong></div>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5">5.5.1</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><font size="5">创建数据库表</font></font></strong></div>
<div>
<div><span style="FONT-SIZE: 12pt">我们测试使用的是oracle数据库，可以选用任何一个支持JDBC的数据库。用scott/tiger登陆sqlplus,输入如下语句创建用户表和输入测试数据：</span></div>
<div><span style="FONT-SIZE: 12pt">create table app_user(username varchar(100), password varchar(100));</span></div>
<div><span style="FONT-SIZE: 12pt">insert into app_user values('tomcat', 'tomcat');</span></div>
<div><span style="FONT-SIZE: 12pt">insert into app_user values('cas', 'cas');</span></div>
<div><span style="FONT-SIZE: 12pt">commit;</span></div>
</div>
<div>&nbsp;</div>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5">5.5.2</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><font size="5">修改CAS 服务器端配置</font></font></strong></div>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><font face="Arial">修改%CATALINA_HOME%\webapps\cas\WEB-INF\ deployerConfigContext.xm把以下的程序代码屏蔽掉：</font></div>
<span style="FONT-SIZE: 12pt; COLOR: black">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>&nbsp;<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">在同一地方加上以下程序代码:</span></p>
<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">
<div class="code_title">xml 代码</div>
</span>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sql&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;select&nbsp;password&nbsp;from&nbsp;app_user&nbsp;where&nbsp;username=?&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>&nbsp;<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">定义</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Comic Sans MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 宋体"> dataSource bean,</span><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">注意，配置的地方应该在</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Comic Sans MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 宋体"></span><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">之前，不要放错了位置，不是和以上验证</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 'Comic Sans MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 宋体">bean</span><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">放在一起。</span></p>
<span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Comic Sans MS'; mso-hansi-font-family: 'Comic Sans MS'; mso-bidi-font-size: 10.0pt">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.jdbc.datasource.DriverManagerDataSource&quot;</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">&quot;close&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverClassName&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>oracle.jdbc.driver.OracleDriver</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>jdbc:oracle:thin:@127.0.0.1:1521:oracle9i</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;username&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>scott</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>tiger</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>&nbsp;</p>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5">5.5.3</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><font size="5">添加CAS 服务器需要用到的jar</font></font></strong></div>
<div style="MARGIN: auto 0cm">
<div><span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: black"></span></div>
<div><font face="Arial">把 cas-server-3.0.6.zip里的 \target\cas-server-jdbc-3.0.6.jar copy 到%CATALINA_HOME%\webapps\cas\WEB-INF\lib下。</font></div>
<div>&nbsp;</div>
<div><font face="Arial">把 Oracle jdbc jar即ojdbc14.jar copy到%CATALINA_HOME%\webapps\cas\WEB-INF\lib下。</font></div>
&nbsp;</div>
<div style="MARGIN: 13pt 0cm 13pt 36pt"><strong><font size="4"><span><font size="5">5.5.4</font><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span><font size="5">再次测试</font></font></strong></div>
<p><span style="FONT-SIZE: 10.5pt">启动</span><span style="FONT-SIZE: 10.5pt">tomcsat,</span><span style="FONT-SIZE: 10.5pt">重复刚才的测试，哈哈，输入</span><span style="FONT-SIZE: 10.5pt">tomcat/tomcat</span><span style="FONT-SIZE: 10.5pt">，可以了。</span></p>
<p><span style="FONT-SIZE: 10.5pt"></span></p>
</span></span></strong></span><font size="3"></font>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/78490#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 May 2007 15:15:00 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/78490</link>
        <guid>http://eddie.javaeye.com/blog/78490</guid>
      </item>
      <item>
        <title>Tomcat SSL配置大全</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/78274" style="color:red;">http://eddie.javaeye.com/blog/78274</a>&nbsp;
          发表时间: 2007年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div><font size="4"><font size="3">由于配置CAS的单点登陆系统，需要先配置</font></font><font size="4"><font size="3">Tomcat的SSL, 在配置tomcat的SSL过程中，我配置的版本是tomcat5.5.20,参考了很多资料，但发现一直不行，后来我换到了5.5.9,结果非常顺利，我于是换了总共4个主要版本，发现SSL的配置还真有些不同，现在我将这些配置记录下来，供下次参考。</font></font></div>
<div><hr />
</div>
<div><strong><u><font size="3"></font></u></strong></div>
<h1><font color="#000000">参考文档</font></h1>
<div><span>Keytool</span><span>使用指南：</span></div>
<div><span style="COLOR: blue"><a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html"><span><font color="#800080">http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html</font></span></a></span></div>
<div>&nbsp;</div>
<div><span>Tomcat-ssl</span><span>配置指南：</span></div>
<div><span></span><span style="COLOR: blue"><a href="http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html"><span><font color="#800080">http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html</font></span></a></span></div>
<div><span style="COLOR: blue"></span></div>
<div><span style="COLOR: blue"></span></div>
<div><span style="COLOR: blue"></span></div>
<div><span style="COLOR: blue"></span></div>
<h1><span style="COLOR: blue"><font color="#000000">配置过程</font></span></h1>
<div><span style="COLOR: blue"><span></span></span></div>
<span style="COLOR: blue"><span>
<h2 style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>生成 server key ：</h2>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000">以命令行方式切换到目录%TOMCAT_HOME%，在command命令行输入如下命令（jdk1.4以上带的工具）：&nbsp;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><font color="#0000ff">keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600</font> </font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000">用户名输入域名，如localhost（开发或测试用）或hostname.domainname(用户拥有的域名)，其它全部以 enter 跳过，最后确认，此时会在%TOMCAT_HOME%下生成server.keystore 文件。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000">注：参数 <span>-validity </span>指证书的有效期(天)，缺省有效期很短，只有90天。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"></font></div>
<h2 style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">2.&nbsp; 将证书导入的JDK的证书信任库中:</h2>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000">这步对于T</font><font color="#000000">omcat的SSL配置不是必须，但对于CAS SSO是必须的，否则会出现如下错误：<span style="COLOR: rgb(0,0,0)"><em><u>edu.yale.its.tp.cas.client.CASAuthenticationException:&nbsp;Unable&nbsp;to&nbsp;validate&nbsp;ProxyTicketValidator。。。</u></em></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: rgb(0,0,0)">导入过程分2步，第一步是导出证书，第二步是导入到证书信任库，命令如下：</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: rgb(0,0,0)"><font color="#0000ff">keytool -export -trustcacerts -alias tomcat -file server.cer -keystore&nbsp;&nbsp;server.keystore -storepass changeit</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: rgb(0,0,0)"><font color="#0000ff">keytool -import -trustcacerts -alias tomcat -file server.cer -keystore&nbsp; %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: rgb(0,0,0)"><font color="#0000ff">如果有提示，输入Y就可以了。</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: rgb(0,0,0)"></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: rgb(0,0,0)"></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: rgb(0,0,0)">其他有用keytool命令（列出信任证书库中所有已有证书，删除库中某个证书）：</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: rgb(0,0,0)"><font color="#0000ff">keytool -list -v -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: rgb(0,0,0)"><font color="#0000ff">keytool -delete -trustcacerts -alias tomcat&nbsp; -keystore&nbsp; D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts -storepass changeit</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: rgb(0,0,0)"></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: rgb(0,0,0)"></span></font></div>
<div><font color="#000000"></font></div>
<div></div>
<div></div>
<h2 style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span style="COLOR: navy"><span>3.<span style="FONT: 7pt 'Times New Roman'">&nbsp; 配置TOMCAT&nbsp;:</span></span></span></h2>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: navy"><span><span style="FONT: 7pt 'Times New Roman'"><font color="#000000"><font face="Arial">修改%TOMCAT_HOME%\conf\server.xml，以文字编辑器打开，查找这一行：</font></font></span></span></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span style="COLOR: navy"><span><span style="FONT: 7pt 'Times New Roman'">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="comments"><!-- Define a SSL HTTP/1.1 Connector on port 8443 --></span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</span></span></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000" face="Arial"><span style="COLOR: navy"><span><span style="FONT: 7pt 'Times New Roman'"></span></span></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span><font face="Arial">将之后的那段的注释去掉，并加上 keystorePass及keystoreFile属性。</font></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span></span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font color="#000000"><span>注意，</span><span>tomcat</span><span>不同版本配置是不同的:</span></font></div>
<h3><span style="COLOR: navy">Tomcat4.1.34</span><span style="COLOR: navy">配置：</span></h3>
<pre><span style="COLOR: navy"><font face="Arial"><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar"></div><ol class="dp-xml"><li class="alt"><span><span class="comments"><!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">Connector</span><span>&nbsp;</span><span class="attribute">className</span><span>=</span><span class="attribute-value">&quot;org.apache.coyote.tomcat4.CoyoteConnector&quot;</span><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">port</span><span>=</span><span class="attribute-value">&quot;8443&quot;</span><span>&nbsp;</span><span class="attribute">enableLookups</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">scheme</span><span>=</span><span class="attribute-value">&quot;https&quot;</span><span>&nbsp;</span><span class="attribute">secure</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">acceptCount</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">useURIValidationHack</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">disableUploadTimeout</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">clientAuth</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">sslProtocol</span><span>=</span><span class="attribute-value">&quot;TLS&quot;</span><span>&nbsp; &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystoreFile</span><span>=</span><span class="attribute-value">&quot;server.keystore&quot;</span><span>&nbsp; &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystorePass</span><span>=</span><span class="attribute-value">&quot;changeit&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li></ol></div></font></span></pre>
<div><font face="Arial"><font color="#000000" face="Arial"><font face="Arial"></font></font></font></div>
<div><font color="#000000"></font></div>
<div><font color="#000000"></font></div>
<div><font color="#000000"></font></div>
<div><font color="#000000"></font></div>
<div><font color="#000000"></font></div>
<h3><span style="COLOR: navy">Tomcat5.5.9</span><span style="COLOR: navy">配置：</span><span style="COLOR: navy"><br />
</span>
<div><font color="#000000">&nbsp;
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="comments"><!-- Define a SSL HTTP/1.1 Connector on port 8443 --></span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">Connector</span><span>&nbsp;</span><span class="attribute">port</span><span>=</span><span class="attribute-value">&quot;8443&quot;</span><span>&nbsp;</span><span class="attribute">maxHttpHeaderSize</span><span>=</span><span class="attribute-value">&quot;8192&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">maxThreads</span><span>=</span><span class="attribute-value">&quot;150&quot;</span><span>&nbsp;</span><span class="attribute">minSpareThreads</span><span>=</span><span class="attribute-value">&quot;25&quot;</span><span>&nbsp;</span><span class="attribute">maxSpareThreads</span><span>=</span><span class="attribute-value">&quot;75&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">enableLookups</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">disableUploadTimeout</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">acceptCount</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;</span><span class="attribute">scheme</span><span>=</span><span class="attribute-value">&quot;https&quot;</span><span>&nbsp;</span><span class="attribute">secure</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">clientAuth</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">sslProtocol</span><span>=</span><span class="attribute-value">&quot;TLS&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystoreFile</span><span>=</span><span class="attribute-value">&quot;server.keystore&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystorePass</span><span>=</span><span class="attribute-value">&quot;changeit&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</font></div>
<h3><span style="COLOR: navy">Tomcat5.5.20</span><span style="COLOR: navy">配置</span><span style="COLOR: navy">(</span><span style="COLOR: navy">此配置同样可用于</span><span style="COLOR: navy">Tomcat6.0)</span><span style="COLOR: navy">：</span><br />
&nbsp;</h3>
<div>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="comments"><!-- Define a SSL HTTP/1.1 Connector on port 8443 --></span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">Connector</span><span>&nbsp;</span><span class="attribute">protocol</span><span>=</span><span class="attribute-value">&quot;org.apache.coyote.http11.Http11Protocol&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">port</span><span>=</span><span class="attribute-value">&quot;8443&quot;</span><span>&nbsp;</span><span class="attribute">maxHttpHeaderSize</span><span>=</span><span class="attribute-value">&quot;8192&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">maxThreads</span><span>=</span><span class="attribute-value">&quot;150&quot;</span><span>&nbsp;</span><span class="attribute">minSpareThreads</span><span>=</span><span class="attribute-value">&quot;25&quot;</span><span>&nbsp;</span><span class="attribute">maxSpareThreads</span><span>=</span><span class="attribute-value">&quot;75&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">enableLookups</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">disableUploadTimeout</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">acceptCount</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;</span><span class="attribute">scheme</span><span>=</span><span class="attribute-value">&quot;https&quot;</span><span>&nbsp;</span><span class="attribute">secure</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">clientAuth</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">sslProtocol</span><span>=</span><span class="attribute-value">&quot;TLS&quot;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystoreFile</span><span>=</span><span class="attribute-value">&quot;server.keystore&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystorePass</span><span>=</span><span class="attribute-value">&quot;changeit&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div></div>
<div><font color="#000000"></font></div>
<div><span style="COLOR: navy"><font color="#000000"></font></span></div>
<div><font color="#000000"><span style="COLOR: navy"></span></font></div>
<h3><span style="COLOR: navy">Tomcat6.0.10</span><span style="COLOR: navy">配置：<br />
</span><span style="COLOR: navy"><font face="Arial"></font></span></h3>
<div class="code_title">xml 代码</div>
<div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">Connector</span><span>&nbsp;</span><span class="attribute">protocol</span><span>=</span><span class="attribute-value">&quot;org.apache.coyote.http11.Http11NioProtocol&quot;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">port</span><span>=</span><span class="attribute-value">&quot;8443&quot;</span><span>&nbsp;</span><span class="attribute">minSpareThreads</span><span>=</span><span class="attribute-value">&quot;5&quot;</span><span>&nbsp;</span><span class="attribute">maxSpareThreads</span><span>=</span><span class="attribute-value">&quot;75&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">enableLookups</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">disableUploadTimeout</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">acceptCount</span><span>=</span><span class="attribute-value">&quot;100&quot;</span><span>&nbsp;&nbsp;</span><span class="attribute">maxThreads</span><span>=</span><span class="attribute-value">&quot;200&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">scheme</span><span>=</span><span class="attribute-value">&quot;https&quot;</span><span>&nbsp;</span><span class="attribute">secure</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;</span><span class="attribute">SSLEnabled</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">clientAuth</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span>&nbsp;</span><span class="attribute">sslProtocol</span><span>=</span><span class="attribute-value">&quot;TLS&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystoreFile</span><span>=</span><span class="attribute-value">&quot;D:/tools/apache-tomcat-6.0.10/server.keystore&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">keystorePass</span><span>=</span><span class="attribute-value">&quot;changeit&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div><span style="COLOR: navy"><font face="Arial">tomcat6支持3种，请参考以下文档：</font></span></div>
<div><span style="COLOR: navy"><font face="Arial"><font face="Arial"><a href="http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html">http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html</a></font></font></span> </div>
<div></div>
<h1><font color="#000000">验证配置</font></h1>
<div><font color="#000000"></font></div>
<div><font color="#000000">访问 </font><a href="https://localhost:8443/"><font color="#000000">https://localhost:8443/</font></a></div>
<div></div>
<div></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span></span></div>
<connector protocol="org.apache.coyote.http11.Http11NioProtocol"></connector></h3>
<font face="Arial">
<div class="code_title"></div>
</font></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/78274#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 May 2007 17:11:39 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/78274</link>
        <guid>http://eddie.javaeye.com/blog/78274</guid>
      </item>
      <item>
        <title>MemCached 压力测试</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/77560" style="color:red;">http://eddie.javaeye.com/blog/77560</a>&nbsp;
          发表时间: 2007年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://eddie.javaeye.com/blog/76990"><font face="Arial">MemCached</font>安装</a>完成后，进行了压力测试，主要参考了<font face="Arial">MemCached</font>的javaclient的 <font face="Arial">类com.danga.MemCached.test.MemCachedTest。它的类主要问题是没有一个总的处理能力的描述。我进行了改写，</font>提供了get和put的总吞吐量的汇总。</p>
<p>测试环境如下，</p>
<p>服务器：RedHat9, 512内存，P4内存，跑2个MemCached实例，运行<font face="Arial">memcached-1.2.1</font></p>
<p>客户端：单独一台机器，和服务器在一个局域网，100M网络带宽，运行<font face="Arial">java_memcached-release_1.5.1, jdk5.0</font></p>
<p>测试代码：</p>
<p>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.danga.MemCached.MemCachedClient; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;com.danga.MemCached.SockIOPool; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestMemCache&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;SockIOPool&nbsp;pool; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;threads;&nbsp;</span><span class="comment">//&nbsp;运行的测试线程数 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;runs;&nbsp;</span><span class="comment">//&nbsp;每个线程运行的次数 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;size;&nbsp;</span><span class="comment">//&nbsp;设置到memcache中的数据包大小，单位k </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;Integer&nbsp;myLock;</span><span class="comment">//&nbsp;锁定以下计数器 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;putTimes&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;</span><span class="comment">//&nbsp;put总时间，单位微秒 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;getTimes&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;</span><span class="comment">//&nbsp;get总时间，单位微秒 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;serverlist&nbsp;=&nbsp;{&nbsp;</span><span class="string">&quot;192.168.0.56:11211&quot;</span><span>,&nbsp;</span><span class="string">&quot;192.168.0.56:11212&quot;</span><span>&nbsp;}; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;initialize&nbsp;the&nbsp;pool&nbsp;for&nbsp;memcache&nbsp;servers </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool&nbsp;=&nbsp;SockIOPool.getInstance(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setServers(serverlist); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setInitConn(</span><span class="number">5</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMinConn(</span><span class="number">5</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaxConn(</span><span class="number">50</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaintSleep(</span><span class="number">30</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setNagle(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.initialize(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(args.length&nbsp;&lt;&nbsp;</span><span class="number">3</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;用法：TestMemCache&nbsp;启动线程数&nbsp;每线程执行测试数量&nbsp;测试数据大小(k)&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads&nbsp;=&nbsp;Integer.parseInt(args[</span><span class="number">0</span><span>]); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runs&nbsp;=&nbsp;Integer.parseInt(args[</span><span class="number">1</span><span>]); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;</span><span class="number">100</span><span>&nbsp;*&nbsp;Integer.parseInt(args[</span><span class="number">2</span><span>]); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLock&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(threads); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;threads;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WorkerThread(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;WorkerThread&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Thread&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;构造函数 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkerThread()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;get&nbsp;client&nbsp;instance </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemCachedClient&nbsp;mc&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MemCachedClient(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc.setCompressEnable(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc.setCompressThreshold(</span><span class="number">0</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;get&nbsp;object&nbsp;to&nbsp;store </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>[]&nbsp;obj&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">int</span><span>[size]; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj[i]&nbsp;=&nbsp;i; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;keys&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[runs]; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;runs;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keys[i]&nbsp;=&nbsp;</span><span class="string">&quot;test_key&quot;</span><span>&nbsp;+&nbsp;i; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;runs;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc.delete(keys[i]); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;runs;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc.set(keys[i],&nbsp;obj); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;time&nbsp;=&nbsp;System.currentTimeMillis()&nbsp;-&nbsp;startTime; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>&nbsp;(myLock)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putTimes&nbsp;+=&nbsp;time; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;runs;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc.get(keys[i]); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;=&nbsp;System.currentTimeMillis()&nbsp;-&nbsp;startTime; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>&nbsp;(myLock)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getTimes&nbsp;+=&nbsp;time; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLock--; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(myLock.equals(</span><span class="number">0</span><span>))&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;测试完成!&nbsp;启动线程数:&quot;</span><span>&nbsp;+&nbsp;threads &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">&quot;,&nbsp;每线程执行测试数量:&nbsp;&quot;</span><span>&nbsp;+&nbsp;runs&nbsp;+&nbsp;</span><span class="string">&quot;,&nbsp;测试数据大小(byte):&quot;</span><span>&nbsp;+&nbsp;size); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;put处理时间:&quot;</span><span>&nbsp;+&nbsp;putTimes &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">&quot;微秒，处理put速度:&nbsp;每秒&nbsp;&quot;</span><span>&nbsp;+&nbsp;runs&nbsp;*&nbsp;threads&nbsp;*&nbsp;</span><span class="number">1000</span><span>&nbsp;/&nbsp;putTimes &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;次&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;get处理时间:&quot;</span><span>&nbsp;+&nbsp;getTimes &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">&quot;微秒，处理get速度:&nbsp;每秒&nbsp;&quot;</span><span>&nbsp;+&nbsp;runs&nbsp;*&nbsp;threads&nbsp;*&nbsp;</span><span class="number">1000</span><span>&nbsp;/&nbsp;getTimes &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;次&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.shutDown(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;测试结果：</p>
<p><font face="Arial">测试完成! 启动线程数:1, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:2515微秒，处理put速度: 每秒 789 次<br />
get处理时间:1266微秒，处理get速度: 每秒 789 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:2, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:3595微秒，处理put速度: 每秒 1471 次<br />
get处理时间:2734微秒，处理get速度: 每秒 1471 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:3, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:6250微秒，处理put速度: 每秒 1846 次<br />
get处理时间:4829微秒，处理get速度: 每秒 1846 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:4, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:8673微秒，处理put速度: 每秒 2063 次<br />
get处理时间:7858微秒，处理get速度: 每秒 2063 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:5, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:10655微秒，处理put速度: 每秒 2352 次<br />
get处理时间:10625微秒，处理get速度: 每秒 2352 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:6, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:14702微秒，处理put速度: 每秒 2042 次<br />
get处理时间:16844微秒，处理get速度: 每秒 2042 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:7, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:18766微秒，处理put速度: 每秒 2502 次<br />
get处理时间:20265微秒，处理get速度: 每秒 2502 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:8, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:23828微秒，处理put速度: 每秒 2586 次<br />
get处理时间:25062微秒，处理get速度: 每秒 2586 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:9, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:29515微秒，处理put速度: 每秒 2654 次<br />
get处理时间:31141微秒，处理get速度: 每秒 2654 次</font></p>
<p><font face="Arial">测试完成! 启动线程数:10, 每线程执行测试数量: 1000, 测试数据大小(byte):1024<br />
put处理时间:37780微秒，处理put速度: 每秒 2285 次<br />
get处理时间:42876微秒，处理get速度: 每秒 2285 次</font></p>
<p>没有测试下去了，看来8~9个线程效率最高，服务端测试的时候，CPU一直使用率很低，最多到5%.</p>
<p>以上测试结果最多到了2500左右，但有位朋友的测试结果非常惊人，一个线程都超过了3300和4800的处理量，他的传输数据量小点，只有0.1k,我测试了下，用这个数据量，顶多也是到3000多的并发。他的测试结果请看如下网址：</p>
<p><a href="http://hi.baidu.com/jabber/blog/category/Memcached">&nbsp;<font face="Arial">http://hi.baidu.com/jabber/blog/category/Memcached</font></a></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/77560#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 May 2007 18:03:00 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/77560</link>
        <guid>http://eddie.javaeye.com/blog/77560</guid>
      </item>
      <item>
        <title>MemCached 安装日志</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/76990" style="color:red;">http://eddie.javaeye.com/blog/76990</a>&nbsp;
          发表时间: 2007年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1、下载<font face="Arial">memcached-1.2.1.tar.gz和<font face="Arial">libevent-1.3b.tar.gz；</font></font></p>
<p>2、安装libevent</p>
<p>tar xvfz&nbsp; <font face="Arial">libevent-1.3b.tar.gz</font></p>
<p>cd <font face="Arial">libevent-1.3b</font></p>
<p><font face="Arial">./configure &amp;&amp; make</font></p>
<p>make install</p>
<p>3、安装memcache</p>
<p>tar xvfz&nbsp; <font face="Arial">memcached-1.2.1.tar.gz</font></p>
<p>cd&nbsp;<font face="Arial"> memcached-1.2.1</font></p>
<p>./configure </p>
<p>make &amp;&amp; make install</p>
<p>4、将libevent安装的/usr/local/lib输出到引用库路径</p>
<p># vi ~/.bash_profile</p>
<p>加入如下一行：</p>
<p><font face="Arial">export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib </font></p>
<p>5、启动(安装后位置：<font face="Arial">/usr/local/bin/memcached</font>)</p>
<p>memcached&nbsp; -d&nbsp; -m&nbsp;128 -l 192.168.0.50&nbsp;-p 11211&nbsp;-u root</p>
<p>即以root用户，分配最大2GM内存启动memcache</p>
<p>memcached&nbsp; -d&nbsp; -m&nbsp;128 -l 192.168.0.50&nbsp;-p 11212&nbsp;-u root</p>
<p>在另外一个端口11212启动另外一个memcache实例</p>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/76990#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 May 2007 15:55:24 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/76990</link>
        <guid>http://eddie.javaeye.com/blog/76990</guid>
      </item>
      <item>
        <title>开源数据集成工具: jitterbit</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/76955" style="color:red;">http://eddie.javaeye.com/blog/76955</a>&nbsp;
          发表时间: 2007年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近，《InfoWorld》选出了15家IT新兴厂商，其中包括：<font face="Arial">jitterbit 请看：</font></p>
<p><font face="Arial"><font face="Arial"><a href="http://www.linux-cn.com/html/linux/beginner/20070422/9519.html">http://www.linux-cn.com/html/linux/beginner/20070422/9519.html</a></font></font></p>
<p>&nbsp;</p>
<p>Jitterbit 是一款集成工具, 用户可以使用Jitterbit 来集成不同的应用, 不同的databases, 以及不同的数据来源.<br />
<br />
</p>
<h2><a name="Jitterbit的使用"></a>Jitterbit的使用 </h2>
<h3><a name="基本原理"></a>基本原理 </h3>
<ul>
    <li>定义消息源（可以是Database表数据，HTTP，FTP上的文件，已共享文件，WebService方法） </li>
    <li>定义目标源（可以是Database表数据，HTTP，FTP上的文件（可定义XML格式、普通文本格式），已共享文件，WebService方法） </li>
    <li>定义Transformation，规定消息源数据如何映射到目标。 </li>
    <li>部署Jitterbit项目到Jitterbit Server，设置调度规则（定时、频率） </li>
</ul>
<p>&nbsp;</p>
<h3><a name="取文件"></a>取文件 </h3>
<ul>
    <li>可以通过HTTP请求、FTP上的文件、已共享文件 </li>
</ul>
<h3><a name="取其它系统的库表"></a>取其它系统的库表 </h3>
<ul>
    <li>通过定义库表的Source </li>
</ul>
<h3><a name="消息通讯的几种方式"></a>消息通讯的几种方式 </h3>
<ul>
    <li>Database表数据 </li>
    <li>HTTP请求 </li>
    <li>FTP上的文件 </li>
    <li>已共享文件 </li>
    <li><span class="twikiNewLink">WebService</span>方法 </li>
</ul>
<h3><a name="交互方式及协议"></a>交互方式及协议 </h3>
<ul>
    <li>在客户端建立工程，上传到服务器即可，工程会在服务器调度执行 </li>
    <li>由Jitterbit服务器控制执行，Jitterbit服务在服务器要一直处于运行状态才能调度系统集成任务！ </li>
</ul>
<h3><a name="常用的功能"></a>常用的功能 </h3>
<ul>
    <li>Database表数据，HTTP，FTP上的文件（可定义XML格式、普通文本格式），已共享文件，WebService方法 之间的交互 </li>
</ul>
<p>&nbsp;</p>
<h2>个人评价：</h2>
<ul>
    <li><font size="2">支持常用的对数据库、文件、FTP、WebService,HTTP的数据源的访问，基本满足了中小企业数据转换需要。</font> </li>
    <li><font size="2">IDE使用JAVA开发，调度器采用C开发；</font> </li>
    <li><font size="2">流程较清晰，使用起来极为方便，用户不需要了解更多技术细节；</font> </li>
    <li><font size="2">但不支持JMS、TCP等企业常用数据源，也不支持脚本扩展，如果想支持这些恐怕很难，后端采用的C开发的，你如果自己想支持，需要同时会JAVA和C；</font> </li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/76955#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 May 2007 11:11:58 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/76955</link>
        <guid>http://eddie.javaeye.com/blog/76955</guid>
      </item>
      <item>
        <title>开源ETL：Kettle</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/76952" style="color:red;">http://eddie.javaeye.com/blog/76952</a>&nbsp;
          发表时间: 2007年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原作者：<font face="Arial">tiger119</font></p>
<p>引用地址：<font face="Arial"><a href="http://blog.csdn.net/tiger119/archive/2007/01/21/1489062.aspx">http://blog.csdn.net/tiger119/archive/2007/01/21/1489062.aspx</a></font></p>
<p>现在是一个Google的时代，而对于开发者，开源已成为最重要的参考书。对于某课题，不管你是深入研究还是初窥门径。估且google一把，勾一勾同行的成就，你必会获益良多。 </p>
<p>&nbsp;&nbsp;&nbsp; 说到ETL开源项目，Kettle当属翘首，因此，偶决定花点时间了解一下。<br />
&nbsp;&nbsp;&nbsp; 项目名称很有意思，水壶。按项目负责人Matt的说法：把各种数据放到一个壶里，然后呢，以一种你希望的格式流出。呵呵，外国人都很有联想力。<br />
&nbsp;&nbsp;&nbsp; 看了提供的文档，然后对发布程序的简单试用后，可以很清楚得看到Kettle的四大块：<br />
&nbsp;&nbsp;&nbsp; Chef&mdash;&mdash;工作(job)设计工具 (GUI方式)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><strong> 注：kettle</strong><strong>2.4.0以后已经被spoon代替</strong></font><font color="#ff0000"><br />
</font>&nbsp;&nbsp;&nbsp; Kitchen&mdash;&mdash;工作(job)执行器 (命令行方式)<br />
&nbsp;&nbsp;&nbsp; Spoon&mdash;&mdash;转换(transform)设计工具 (GUI方式)<br />
&nbsp;&nbsp;&nbsp; Span&mdash;&mdash;转换(trasform)执行器 (命令行方式)</p>
<p>&nbsp;&nbsp;&nbsp; <font face="Arial">Carte&mdash;&mdash;远程执行转换(trasform)的web服务器，通过内置jetty实现.</font></p>
<p><br />
<br />
&nbsp;&nbsp;&nbsp; 嗯，厨师已经在厨房里，勺子和盘子一应俱全，且看能做出如何的大餐？</p>
<p>&nbsp;&nbsp;&nbsp; <strong>一：Chef&mdash;&mdash;工作(job)设计器<br />
</strong>&nbsp;&nbsp;&nbsp; 这是一个GUI工具，操作方式主要通过拖拖拉拉，勿庸多言，一看就会。<br />
&nbsp;&nbsp;&nbsp; 何谓工作？ 多个作业项，按特定的工作流串联起来，开成一项工作。正如：我的工作是软件开发。我的作业项是：设计、编码、测试！先设计，如果成功，则编码，否则继续设计，编码完成则开始设计，周而复始，作业完成。<br />
&nbsp;&nbsp;&nbsp; 来，看看Chef中的作业项：<br />
&nbsp;&nbsp;&nbsp; 1.1： 转换：指定更细的转换任务，通过Spoon生成。通过Field来输入参数。<br />
&nbsp;&nbsp;&nbsp; 1.2： SQL：sql语句执行，<br />
&nbsp;&nbsp;&nbsp; 1.3： FTP：下载ftp文件。 <br />
&nbsp;&nbsp;&nbsp; 1.4： 邮件：发送邮件。 <br />
&nbsp;&nbsp;&nbsp; 1.5： 检查表是否存在，<br />
&nbsp;&nbsp;&nbsp; 1.6： 检查文件是否存在，<br />
&nbsp;&nbsp;&nbsp; 1.7： 执行shell脚本。如：dos命令。<br />
&nbsp;&nbsp;&nbsp; 1.8： 批处理。(注意：windows批处理不能有输出到控制台)。 <br />
&nbsp;&nbsp;&nbsp; 1.9： Job包。作为嵌套作业使用。<br />
&nbsp;&nbsp;&nbsp; 1.10：JavaScript执行。这个比较有意思，我看了一下源码，如果你有自已的Script引擎，可以很方便的替换成自定义Script，来扩充其功能。 <br />
&nbsp;&nbsp;&nbsp; 1.11：SFTP：安全的Ftp协议传输。 <br />
&nbsp;&nbsp;&nbsp; 1.12：HTTP方式的上/下传。 </p>
<p>&nbsp;&nbsp;&nbsp; 好了，看看工作流： <br />
&nbsp;&nbsp;&nbsp; 如上文所述，工作流是作业项的连接方式。分为三种：无条件，成功，失败。这个没啥好说的，从名字就能知道它的意图。<br />
&nbsp;&nbsp;&nbsp;嗯，为了方便工作流使用，提供了几个辅助结点单元(你也可将其作为简单的作业项)： <br />
&nbsp;&nbsp;&nbsp; 1：Start单元，任务必须由此开始。设计作业时，以此为起点。<br />
&nbsp;&nbsp;&nbsp; 2：OK单元：可以编制做为中间任务单元，且进行脚本编制，用来控制流程。 <br />
&nbsp;&nbsp;&nbsp; 3：ERROR单元：用途同上。<br />
&nbsp;&nbsp;&nbsp; 4：DUMMY单元：啥都不做，主要是用来支持多分支的情况。文档中有例子，不再多说。</p>
<p>&nbsp;&nbsp;&nbsp; 存储方式： <br />
&nbsp;&nbsp;&nbsp; 支持XML存储，或存储到指定数据库中。<br />
&nbsp;&nbsp;&nbsp; 一些默认的配置(如数据库存储位置&hellip;&hellip;)，在系统的用户目录下，单独建立了一个.Kettle目录，用来保存用户的这些设置。&nbsp; <br />
&nbsp;&nbsp;&nbsp; LogView：可查看执行日志。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>二：Kitchen&mdash;&mdash;作业执行器 <br />
</strong>&nbsp;&nbsp;&nbsp; 是一个作业执行引擎，用来执行作业。这是一个命令行执行工具，没啥可讲的，就把它的参数说明列一下。<br />
&nbsp;&nbsp;&nbsp; -rep&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Repository name&nbsp;&nbsp; 任务包所在存储名<br />
&nbsp;&nbsp;&nbsp; -user&nbsp;&nbsp;&nbsp;&nbsp; : Repository username&nbsp;&nbsp; 执行人<br />
&nbsp;&nbsp;&nbsp; -pass&nbsp;&nbsp;&nbsp;&nbsp; : Repository password&nbsp;&nbsp; 执行人密码<br />
&nbsp;&nbsp;&nbsp; -job&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : The name of the job to launch 任务包名称<br />
&nbsp;&nbsp;&nbsp; -dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : The directory (don't forget the leading / or \) <br />
&nbsp;&nbsp;&nbsp; -file&nbsp;&nbsp;&nbsp;&nbsp; : The filename (Job XML) to launch <br />
&nbsp;&nbsp;&nbsp; -level&nbsp;&nbsp;&nbsp; : The logging level (Basic, Detailed, Debug, Rowlevel, Error, Nothing) 指定日志级别 <br />
&nbsp;&nbsp;&nbsp; -log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : The logging file to write to&nbsp; 指定日志文件 <br />
&nbsp;&nbsp;&nbsp; -listdir&nbsp; : List the directories in the repository 列出指定存储中的目录结构。 <br />
&nbsp;&nbsp;&nbsp; -listjobs : List the jobs in the specified directory 列出指定目录下的所有任务 <br />
&nbsp;&nbsp;&nbsp; -listrep&nbsp; : List the defined repositories 列出所有的存储<br />
&nbsp;&nbsp;&nbsp; -norep&nbsp;&nbsp;&nbsp; : Don't log into the repository&nbsp; 不写日志<br />
&nbsp;&nbsp;&nbsp;<u> 嗯，居然不支持调度。看了一下文档，建议使用操作系统提供的调度器来实现调度，比如：Windows可以使用它的任务计划工具。</u></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">注：其实是支持调度的，在job的start单元，可以设置调度的时间。</font></p>
<p>&nbsp;&nbsp;&nbsp; <strong>三：Spoon&mdash;&mdash;转换过程设计器<br />
</strong>&nbsp;&nbsp;&nbsp; GUI工作，用来设计数据转换过程，创建的转换可以由Pan来执行，也可以被Chef所包含，作为作业中的一个作业项。<br />
&nbsp;&nbsp;&nbsp; 下面简单列举一下所有的转换过程。(简单描述，详细的可见Spoon文档)</p>
<p>&nbsp;&nbsp;&nbsp; 3.1：Input-Steps：输入步骤 <br />
&nbsp;&nbsp;&nbsp; 3.1.1：Text file input：文本文件输入，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以支持多文件合并，有不少参数，基本一看参数名就能明白其意图。<br />
&nbsp;&nbsp;&nbsp; 3.1.2：Table input：数据表输入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实际上是视图方式输入，因为输入的是sql语句。当然，需要指定数据源(数据源的定制方式在后面讲一下)<br />
&nbsp;&nbsp;&nbsp; 3.1.3：Get system info：取系统信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就是取一些固定的系统环境值，如本月最后一天的时间，本机的IP地址之类。<br />
&nbsp;&nbsp;&nbsp; 3.1.4：Generate Rows：生成多行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个需要匹配使用，主要用于生成多行的数据输入，比如配合Add sequence可以生成一个指定序号的数据列。<br />
&nbsp;&nbsp;&nbsp; 3.1.5：XBase Input： <br />
&nbsp;&nbsp;&nbsp; 3.1.6：Excel Input： <br />
&nbsp;&nbsp;&nbsp; 3.1.7：XML Input： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这三个没啥可讲的，看看参数就明了。</p>
<p>&nbsp;&nbsp;&nbsp; 3.2：Output-Steps： 输出步聚<br />
&nbsp;&nbsp;&nbsp; 3.2.1：Text file output：文本文件输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个用来作测试蛮好，呵呵。很方便的看到转换的输出。<br />
&nbsp;&nbsp;&nbsp; 3.2.2：Table output：输出到目的表。<br />
&nbsp;&nbsp;&nbsp; 3.2.3：Insert/Update：目的表和输入数据行进行比较，然后有选择的执行增加，更新操作。<br />
&nbsp;&nbsp;&nbsp; 3.2.4：Update：同上，只是不支持增加操作。<br />
&nbsp;&nbsp;&nbsp; 3.2.5：XML Output： </p>
<p>&nbsp;&nbsp;&nbsp; 3.3：Look-up：查找操作<br />
&nbsp;&nbsp;&nbsp; DataBase: <br />
&nbsp;&nbsp;&nbsp; Stream：<br />
&nbsp;&nbsp;&nbsp; Procedure：<br />
&nbsp;&nbsp;&nbsp; Database join：<br />
&nbsp;&nbsp;&nbsp; 很简单，看看参数就明白了。</p>
<p>&nbsp;&nbsp;&nbsp; 3.4：Transform&nbsp; 转换 (嗯，重点)<br />
&nbsp;&nbsp;&nbsp; 3.4.1：Select values： 对输入的行记录数据 的字段进行更改 (更改数据类型，更改字段名或删除) <br />
&nbsp;&nbsp; 数据类型变更时，数据的转换有固定规则，可简单定制参数。可用来进行数据表的改装。 <br />
&nbsp;&nbsp;&nbsp; 3.4.2： Filter rows： 对输入的行记录进行 指定复杂条件 的过滤。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用途可扩充sql语句现有的过滤功能。但现有提供逻辑功能超出标准sql的不多。 <br />
&nbsp;&nbsp;&nbsp; 3.4.3：Sort rows：对指定的列以升序或降序排序，当排序的行数超过5000时需要临时表。 <br />
&nbsp;&nbsp;&nbsp; 3.4.4：Add sequence：为数据流增加一个序列，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个配合其它Step(Generate rows, rows join)，可以生成序列表，如日期维度表(年、月、日)。<br />
&nbsp;&nbsp;&nbsp; 3.4.5：Dummy：不做任何处理，主要用来作为分支节点。<br />
&nbsp;&nbsp;&nbsp; 3.4.6：Join Rows：对所有输入流做笛卡儿乘积。<br />
&nbsp;&nbsp;&nbsp; 3.4.7：Aggregate：聚合，分组处理，<font color="#ff0000">不推荐使用了，被Group by代替<br />
</font>&nbsp;&nbsp;&nbsp; 3.4.8：Group by：分组<br />
&nbsp;&nbsp; 用途可扩充sql语句现有的分组，聚合函数。但我想可能会有其它方式的sql语句能实现。 <br />
&nbsp;&nbsp;&nbsp; 3.4.9：Java Script value：使用mozilla的rhino作为脚本语言，并提供了很多函数，用户可以在脚本中使用这些函数。 <br />
&nbsp;&nbsp;&nbsp; 3.4.10. Row Normaliser：该步骤可以从透视表中还原数据到事实表，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过指定维度字段及其分类值，度量字段，最终还原出事实表数据。 <br />
&nbsp;&nbsp;&nbsp; 3.4.11. Unique rows：去掉输入流中的重复行<br />
&nbsp;&nbsp; 在使用该节点前要先排序，否则只能删除连续的重复行。&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3.4.12. Calculator：提供了一组函数对列值进行运算，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所介绍，使用该方式比用户自定义JAVA SCRIPT脚本速度更快。<br />
&nbsp;&nbsp;&nbsp; 3.4.13. Merge Rows：用于比较两组输入数据，一般用于更新后的数据重新导入到数据仓库中。<br />
&nbsp;&nbsp;&nbsp; 3.4.14. Add constants：增加常量值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个我没弄明白它的用法？？？<br />
&nbsp;&nbsp;&nbsp; 3.4.15. Row denormaliser：同Normaliser过程相反。<br />
&nbsp;&nbsp;&nbsp; 3.4.16. Row flattener：表扁平化处理 <br />
&nbsp; 指定需处理的字段和扃平化后的新字段，将其它字段做为组合Key进行扃平化处理。 </p>
<p>&nbsp;&nbsp;&nbsp; 3.5：Extra：除了上述基本节点类型外还定义了扩展节点类型&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3.5.1：SPLIT FIELDS， 按指定分隔符拆分字段 <br />
&nbsp;&nbsp;&nbsp; 3.5.2：EXECUTE SQL SCRIPT，执行SQL语句<br />
&nbsp;&nbsp;&nbsp; 3.5.3：CUBE INPUT， <br />
&nbsp;&nbsp;&nbsp; 3.5.4：CUBE OUTPUT等。 <br />
&nbsp;&nbsp;&nbsp; 这两个没明白是啥意思。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3.6：其它 <br />
&nbsp;&nbsp;&nbsp; 存储方式： 与Chef相同。<br />
&nbsp;&nbsp;&nbsp; 数据源(Connection)；见后。<br />
&nbsp;&nbsp;&nbsp; Hops：setp连接起来，形成Hops。<br />
&nbsp;&nbsp;&nbsp; Plugin step types等节点：这个没仔细看，不知如何制作Plugin step。<br />
&nbsp;&nbsp;&nbsp; LogView：可查看执行日志。</p>
<p><strong>&nbsp;&nbsp;&nbsp; 四：Pan&mdash;&mdash;转换的执行工具<br />
</strong>&nbsp;&nbsp;&nbsp; 命令行执行方式，可以执行由Spoon生成的转换任务。<br />
&nbsp;&nbsp;&nbsp; 同样，不支持调度。<br />
&nbsp;&nbsp;&nbsp; 参数与Kitchen类似，可参见Pan的文档。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>五：其它<br />
</strong>&nbsp;&nbsp;&nbsp; Connection： <br />
&nbsp;&nbsp;&nbsp; 可以配置多个数据源，在Job或是Trans中使用，这意味着可以实现跨数据库的任务。<br />
&nbsp;&nbsp;&nbsp; 支持大多数市面上流行的数据库。</p>
<p>&nbsp;&nbsp;&nbsp; <strong><font color="#ff0000">个人感觉：(本人不成熟的看法)<br />
</font></strong>&nbsp;&nbsp;&nbsp; 1：转换功能全，使用简洁。作业项丰富，流程合理。<br />
&nbsp;&nbsp;&nbsp; 2：java代码，支持的数据源范围广，所以，跨平台性较好。<br />
&nbsp;&nbsp;&nbsp; 3：从实际项目的角度看，和其它开源项目类似，主要还是程序员的思维，缺少与实际应用项目(专业领域)的更多接轨，当然，项目实施者的专注点可能在于一个平台框架，而非实际应用(实际应用需要二次开发)。<br />
&nbsp;&nbsp;&nbsp; 4：看过了大多数源码，发现源码的可重用性不是太好(缺少大粒度封装)，有些关键部分好象有Bug。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如：个别class过于臃肿，线程实现的同步有问题。<br />
&nbsp;&nbsp;&nbsp; 5：提供的工具有些小错，如参数的容错处理。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;好，对Kettle有了浅浅的了解，其它的容后再说。<br />
<br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/76952#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 May 2007 10:43:54 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/76952</link>
        <guid>http://eddie.javaeye.com/blog/76952</guid>
      </item>
      <item>
        <title>rosifox关于tomcat集群和treecache的文章</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/52025" style="color:red;">http://eddie.javaeye.com/blog/52025</a>&nbsp;
          发表时间: 2007年02月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"></font></p>
<p><font face="Arial">http://www.blogcn.com/u2/38/21/ayufox/index.html</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/52025#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 03 Feb 2007 19:38:14 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/52025</link>
        <guid>http://eddie.javaeye.com/blog/52025</guid>
      </item>
      <item>
        <title>jbosscache1.4 invalidation模式的疑问</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/51907" style="color:red;">http://eddie.javaeye.com/blog/51907</a>&nbsp;
          发表时间: 2007年02月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>项目中需要用jbosscache解决分布式cache问题。我们想实现如下cache模式：</p>
<p>假设集群有2个节点，分别是node1和node2，我们要缓存的对象叫test.table1,</p>
<p>1、node1 检索test.table1的id为&ldquo;id1&rdquo;的值, 这时，由于缓存中没有相应数据，它会先访问数据库，然后缓存在本地，即调用类似treecache.put(&quot;/test/table1&quot;,&quot;id1&quot; &quot;value1&quot;)的语法保存在缓存中；这时其他节点的cache不受影响；下次node1再次访问该值，就会从缓存中取到该值。</p>
<p>2、同样，node2访问test.table1的id为&ldquo;id1&rdquo;的值，这时缓存中也没有该值，同样访问数据库，然后放到缓存中。</p>
<p>3、node1修改了test.table1的id为&ldquo;id1&rdquo;的值，这时，应该调用treecache的remove方法，将改对象清除出缓存，并向node2发送invalidation通知，使node2也清除相应的对象。</p>
<p>我们在考察了jbosscache支持的4种同布方法（<font face="Arial">REPL_ASYNC，<font face="Arial">REPL_SYNC，<font face="Arial">INVALIDATION_ASYNC，<font face="Arial">INVALIDATION_SYNC</font></font></font></font>）后，觉得<font face="Arial">INVALIDATION_SYNC这种方式满足我们的需求。即各个节点都单独保留自己的cache数据，在查询数据库后，保存在本地的缓存中，这时不同步数据到其他节点。但当某个节点修改了缓存中的数据，这时需要发送</font></p>
<p>invalidation消息到其他节点，使得其他节点删除相应的缓存。</p>
<p>&nbsp;</p>
<p>在通过1个下午的测试后，结果和我们设想的有很大出入，以下就是测试结果：</p>
<p>1.node1 加入新的数据 /test1，正常，node2相应的缓存没有变化；</p>
<p>2.node2加入新的数据/test1，奇怪的事情发生了，node1的 /test1节点不见了，我看日志，确认它受到了Eviction消息，即数据失效消息；</p>
<p>3、同样，我们再次在node1加入数据/test1，结果，node2的/test1数据不见了，同样是收到了相应的数据失效消息。</p>
<p>&nbsp;</p>
<p>以上现象，会导致node1到数据库取数据，更新缓存，node2的缓存中相应数据会因此失效，下次node2取同样的数据时，由于数据失效，还要去数据库取，再次更新node2缓存后，此时，node1将收到缓存失效消息。这样循环往复，实际上缓存一点也没有起到分布式的作用。 </p>
<p>实际上，应该是node1和node2分别保存自己的缓存，只有在我们更新的数据或删除了数据时，这时才能发送invalidation消息，其他节点清除相应缓存数据。</p>
<p>&nbsp;</p>
<p>有没有朋友用过<font face="Arial">INVALIDATION</font>模式，帮我解答下这个问题，谢谢！</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://eddie.javaeye.com/blog/51907#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Feb 2007 20:53:55 +0800</pubDate>
        <link>http://eddie.javaeye.com/blog/51907</link>
        <guid>http://eddie.javaeye.com/blog/51907</guid>
      </item>
      <item>
        <title>jbosscache1.4 invalidation模式下put会导致发送invalidation的问题</title>
        <author>eddie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://eddie.javaeye.com">eddie</a>&nbsp;
          链接：<a href="http://eddie.javaeye.com/blog/51887" style="color:red;">http://eddie.javaeye.com/blog/51887</a>&nbsp;
          发表时间: 2007年02月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;我们在项目中使用jbosscache来做分布式缓存部分数据库数据。打算用<font face="Arial">INVALIDATION_SYNC来将remove的数据失效掉，</font></p>
<p>但令人失望的是，我们在put数据的时候，发现它也会广播<font face="Arial">invalidation消息，导致数据失效。这样的结果是，只有1台服务器有</font></p>
<p>缓存数据，其他服务器从数据库取到相同数据put到缓存时，就会导致其他服务器缓存失效，但这个操作实际上没有修改数据。</p>
<p>实在是不合理。可能是我们的使用方式有问题，或者有其他配置方法，请有这方面的朋友能帮助下，谢谢！</p>
<p>&nbsp;</p>
<p>配置文件如下（就是标准的那个<font face="Arial">invalidationSync-service.xml文件</font>）：</p>
<p><font face="Arial"><!--l version="1.0" encoding="UTF-8--></font></p>
<p><font face="Arial"><!-- ===================================================================== --><br />
<!--                                                                       --><br />
<!--  Sample TreeCache Service Configuration                               --><br />
<!--                                                                       --><br />
<!-- ===================================================================== --></font></p>
<p><font face="Arial"><server></server></font></p>
<p><font face="Arial">&nbsp;&nbsp; <classpath archives="jboss-cache.jar, jgroups.jar" codebase="./lib"></classpath></font></p>
<font face="Arial">
<p><br />
&nbsp;&nbsp; <!-- ==================================================================== --><br />
&nbsp;&nbsp; <!-- Defines TreeCache configuration                                      --><br />
&nbsp;&nbsp; <!-- ==================================================================== --></p>
<p>&nbsp;&nbsp; <mbean code="org.jboss.cache.CacheImpl"></mbean>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name=&quot;jboss.cache:service=TreeCache&quot;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <depends></depends>jboss:service=Naming<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <depends></depends>jboss:service=TransactionManager</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
          Configure the TransactionManager<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="TransactionManagerLookupClass"></attribute>org.jboss.cache.DummyTransactionManagerLookup</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
          Isolation level : SERIALIZABLE<br />
                            REPEATABLE_READ (default)<br />
                            READ_COMMITTED<br />
                            READ_UNCOMMITTED<br />
                            NONE<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="IsolationLevel"></attribute>REPEATABLE_READ</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
           Valid modes are LOCAL<br />
                           REPL_ASYNC<br />
                           REPL_SYNC<br />
                           INVALIDATION_ASYNC<br />
                           INVALIDATION_SYNC<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="CacheMode"></attribute>INVALIDATION_SYNC</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
      Just used for async repl: use a replication queue<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="UseReplQueue"></attribute>false</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
          Replication interval for replication queue (in ms)<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="ReplQueueInterval"></attribute>0</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
          Max number of elements which trigger replication<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="ReplQueueMaxElements"></attribute>0</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!-- Name of cluster. Needs to be the same for all TreeCache nodes in a<br />
           cluster in order to find each other.<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="ClusterName"></attribute>JBossCache-Cluster</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--Uncomment next three statements to enable JGroups multiplexer.<br />
This configuration is dependent on the JGroups multiplexer being<br />
registered in an MBean server such as JBossAS.  --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--<br />
      <depends>jgroups.mux:name=Multiplexer</depends><br />
      <attribute name="MultiplexerService">jgroups.mux:name=Multiplexer</attribute><br />
      <attribute name="MultiplexerStack">fc-fast-minimalthreads</attribute><br />
      --></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!-- JGroups protocol stack properties.<br />
         ClusterConfig isn't used if the multiplexer is enabled and successfully initialized.<br />
      --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <attribute name="ClusterConfig"></attribute><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <config></config><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!-- UDP: if you have a multihomed machine,<br />
            set the bind_addr attribute to the appropriate NIC IP address, e.g bind_addr="192.168.0.2"<br />
            --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!-- UDP: On Windows machines, because of the media sense feature<br />
      being broken with multicast (even after disabling media sense)<br />
      set the loopback attribute to true --><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <udp mcast_port="48866" mcast_addr="228.1.2.3"></udp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip_ttl=&quot;64&quot; ip_mcast=&quot;true&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mcast_send_buf_size=&quot;150000&quot; mcast_recv_buf_size=&quot;80000&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucast_send_buf_size=&quot;150000&quot; ucast_recv_buf_size=&quot;80000&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loopback=&quot;false&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<ping timeout="2000" num_initial_members="3"></ping>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up_thread=&quot;false&quot; down_thread=&quot;false&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <merge2 min_interval="10000" max_interval="20000"></merge2><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--        <FD shun="true" up_thread="true" down_thread="true" />--><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <fd_sock></fd_sock><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <verify_suspect timeout="1500"></verify_suspect>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up_thread=&quot;false&quot; down_thread=&quot;false&quot;/&gt;<br />
&nbs