<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Java初体验</title>
    <description></description>
    <link>http://jiangyongyuan.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>php mysql apache 服务器VertrigoServ</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/214472" style="color:red;">http://jiangyongyuan.javaeye.com/blog/214472</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <li>包括：</li>
<li>Apache <span class="red">2.0.59</span> </li>
<li>PHP <span class="red">5.2.3</span> </li>
<li>Mysql <span class="red">5.0.41</span> </li>
<li>SQLite <span class="red">3.4.0</span> </li>
<li>PhpMyAdmin <span class="red">2.10.2</span> </li>
<li>SQLiteManager <span class="red">1.2.0</span> </li>
<li>ZendOptimizer <span class="red">3.2.8</span> </li>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/214472#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 09:48:55 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/214472</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/214472</guid>
      </item>
      <item>
        <title>css</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/213837" style="color:red;">http://jiangyongyuan.javaeye.com/blog/213837</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">/***------------此效果为表格隐藏数据后显示....-------------***/
//表格
.carhome .shortMessage{
	margin-left:10px;
	width:600px;
	table-layout: fixed;
}

//title,自己设置
.carhome .shortMessage .title{
	height:30px;
	color:#050357;
	font-weight:bold;
	line-height:20px;
	border-bottom:1px #8F8F8F solid;
	
}

//表格的td
.carhome .shortMessage td{
	height:30px;
	line-height:30px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}</pre>
<p>&nbsp;</p>
<pre name="code" class="java">//给表格添加横线border-top
.EwRecordComponent .bottomborder{
	height:37px;
	line-height:37px;
	border-top:1px #8F8F8F solid;
	text-align:right;
}</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/213837#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, 11 Jul 2008 11:20:57 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/213837</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/213837</guid>
      </item>
      <item>
        <title>web模式下spring中获得webroot路径</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/213107" style="color:red;">http://jiangyongyuan.javaeye.com/blog/213107</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">		WebApplicationContext context = (WebApplicationContext) servletConfig
				.getServletContext()
				.getAttribute(
						WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

			webrootDir = context.getResource("/").getFile().getAbsolutePath();</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>servlet中做法：</p>
<pre name="code" class="java">getServletContext().getRealPath("/");</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/213107#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 Jul 2008 14:35:19 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/213107</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/213107</guid>
      </item>
      <item>
        <title>htmlunit解析页面</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/209607" style="color:red;">http://jiangyongyuan.javaeye.com/blog/209607</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>htmlunit相当于java的一个浏览器，可以分析页面,获得页面数据</p>
<p>&nbsp;</p>
<pre name="code" class="java">import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequestSettings;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTable;
import com.gargoylesoftware.htmlunit.html.HtmlTableRow;</pre>
<pre name="code" class="java">final WebClient wc = new WebClient();
		wc.setJavaScriptEnabled(false);
		WebRequestSettings settings = new WebRequestSettings(new URL(
				QUERY_FORM_URL + "&amp;cph=" + vehicleNo + "&amp;cx=" + vehicleColor));
		settings.setCharset("gb2312");
		HtmlPage page =  (HtmlPage) wc.getPage(settings);

		List&lt;HtmlTable&gt; tables = page.getDocumentHtmlElement()
				.getHtmlElementsByTagName("table");
</pre>
<p>&nbsp;</p>
<p>先关连接：</p>
<p><a href="http://htmlunit.sourceforge.net/">http://htmlunit.sourceforge.net/</a></p>
<p><a href="http://htmlparser.sourceforge.net/">http://htmlparser.sourceforge.net/</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/209607#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, 30 Jun 2008 09:51:53 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/209607</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/209607</guid>
      </item>
      <item>
        <title>GWT Hosted模式运行原理</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/203271" style="color:red;">http://jiangyongyuan.javaeye.com/blog/203271</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>hosted模式运行原理,对源码的理解应该是这样的</p>
<p><img src="http://lh4.ggpht.com/yongyuan.jiang/SFOPLtjOEiI/AAAAAAAAA88/bEzcJ-4bHdw/s800/gwt%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86.JPG" height="537" alt="GWT Hosted运行原理" width="606" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/203271#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, 14 Jun 2008 17:32:57 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/203271</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/203271</guid>
      </item>
      <item>
        <title>HTMLTemplatePanel使用</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/197701" style="color:red;">http://jiangyongyuan.javaeye.com/blog/197701</a>&nbsp;
          发表时间: 2008年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>新增功能</p>
<p>1.直接获得html页面元素，无需实例化对象，如：Image imgButton = (Image)super.getGwtWidget("imageBt")</p>
<p>2.相同流程页面，写在同一个模板，通过templateElementId变换显示的Div,用于一个流程，不需定义两三个html对象与页面</p>
<p>&nbsp;</p>
<p>模拟JAVA代码</p>
<pre name="code" class="java">                //定义使用login2.html页面，显示的div为gwtid=LoginPopPanel
                public LoginPopPanel() {
		super("login_template/login2.htm", "LoginPopPanel");

	}

	/**
	 * 获得页面对象的引用
	 */
	protected void beforeFlushChildren() {
		txtVehicleNo =  (TextBox) super.getGwtWidget("txtVehicleNo");
		txtPsw = (PasswordTextBox) super.getGwtWidget("txtPsw");
               }

                /*
                * 模板装载完成，
                */
	protected void afterTemplateLoaded() {
                                //使用模板页面的另外一个Div，免除页面跳转
                     changeDiv("LoginSuccessDiv");
                }



</pre>
<p>新旧模板保持这样的写法是兼容的。兼容组建构造方式。</p>
<p>changeDiv(ElementId)是旧模板的方法，新模板则使用setHtml替换页面</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/197701#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 May 2008 01:20:52 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/197701</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/197701</guid>
      </item>
      <item>
        <title>refresh JPanel &amp; print Image in JPanel</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/191235" style="color:red;">http://jiangyongyuan.javaeye.com/blog/191235</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">//刷新JPanel
public void refresh() {
		contentPanel.validate();
		contentPanel.revalidate();
		contentPanel.updateUI();
               contentPanel.repaint();
	}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>JPanel里面画背景图片:</p>
<pre name="code" class="java">@Override
	protected void paintComponent(Graphics g){
		paintBackLeftImg(g);
		paintBackCentertImg(g);
		this.setOpaque(false);//!!!
	}

	private void paintBackCentertImg(Graphics g) {
		ImageIcon bg = new ImageIcon(&quot;pic/yct/backYCTWaitCard.jpg&quot;);
		g.drawImage(bg.getImage(), getBackgroudLeft().getWidth(), 0,
				Color.green, null);
	}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>sun forums :</p>
<pre name="code" class="java">cPane=new JPanel() {
  public void paintComponent(Graphics g)
  {
    ImageIcon icon=new ImageIcon(ClassLoader.getSystemResource(&quot;test.jpg&quot;));
    Rectangle rect=g.getClipBounds();
    g.fillRect(rect.x, rect.y, rect.width, rect.height);
    g.drawImage(icon.getImage(), 0, 0, Color.green, null);
  }
};
cPane.setOpaque(false);
</pre>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/191235#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 22:20:19 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/191235</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/191235</guid>
      </item>
      <item>
        <title>spring osgi helloworld</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/189002" style="color:red;">http://jiangyongyuan.javaeye.com/blog/189002</a>&nbsp;
          发表时间: 2008年05月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ol>
<li><strong><span style="font-size: medium;">1.准备环境：</span>
</strong>
</li>
</ol>
<p>&nbsp;</p>
<p>下载felix,</p>
<p>运行felix.jar：org.apache.felix.main.Main函数</p>
<pre name="code" class="java">如何加入spring osgi
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/slf4j-api-1.4.3.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/jcl104-over-slf4j-1.4.3.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/spring-core-2.5.1.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/spring-beans-2.5.1.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/spring-context-2.5.1.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/spring-aop-2.
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/lib/aopalliance.osgi-1.0-SNAPSHOT.jar5.1.jar

-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/dist/spring-osgi-core-1.0.2.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/dist/spring-osgi-extender-1.0.2.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/dist/spring-osgi-io-1.0.2.jar



test (the spring samples service):以下测试见2，3步骤
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/src/samples/simple-service/simple-service-bundle/target/simple-service-bundle-1.0.2.jar
-&gt; start file:///home/jiangyy/workspace/spring-osgi-1.0.2/src/samples/simple-service/simple-service-bundle/target/simple-service-bundle-1.0.2.test.jar</pre>
&nbsp;
<p>&nbsp;</p>
<p><span style="font-size: medium;"></span>
<strong><span style="font-size: medium;">2.定义服务：</span>
</strong>
</p>
<p>下载spring-osgi包，找到sample/simpleservice,到src相对应目录下，运行：</p>
<p>mvn clean install，打包后将生成：</p>
<p>simple-service-bundle-1.0.2.jar</p>
<p>这个可以注册了</p>
<p>&nbsp;</p>
<p><span style="font-size: medium;"><strong>3.在其他jar 服务中注入服务</strong>
</span>
</p>
<p>如何在其他jar中注入MyService实现:</p>
<p>写了个类，相当于spring bean，然后把刚才打好的包拷贝，改成以下的class文件，</p>
<pre name="code" class="java">package org.springframework.osgi.samples.simpleservicetest;

import org.springframework.osgi.samples.simpleservice.MyService;

public class MyTest {
     public void setMyService(MyService service) {
    	 System.out.println(&quot;invokeing&quot;);
    	 System.out.println(service.stringValue());
    	 System.out.println(&quot;end&quot;);
     }
}
</pre>
<p><span style="font-family: Courier; color: #666699;"><span style="font-family: Courier; color: #666699;"><span style="color: #000000;">在</span>
</span>
<span style="color: #000000;">MANIFEST.MF中引入</span>
<span style="font-family: Courier; color: black;">需要的包</span>
</span>
。在META-INF中添加<span class="hilite1">spring</span>
/bean.xml，并定义该<span class="hilite3">测试</span>
类：</p>
<p><span style="font-family: Courier; color: #666699;"><span style="font-family: Courier; color: black;">
<div class="dp-highlighter">
<div class="bar"><span><span><span style="font-family: Courier; color: #666699;"><span style="font-family: Courier; color: black;">xml 代码</span>
</span>
</span>
</span>
 <br />
</div>
<pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;

  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;

  xmlns:osgi=&quot;http://www.springframework.org/schema/osgi&quot;

  xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                      http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd&quot;&gt;



&lt;osgi:reference id=&quot;simpleServiceOsgi&quot; interface=&quot;org.springframework.osgi.samples.simpleservice.MyService&quot;/&gt; 
&lt;bean id=&quot;testEntityRegister&quot; class=&quot;org.springframework.osgi.samples.simpleservicetest.MyTest&quot;&gt;
   &lt;property name=&quot;myService&quot; ref=&quot;simpleServiceOsgi&quot; /&gt;
&lt;/bean&gt;


&lt;/beans&gt;
</pre>
</div>
<div class="dp-highlighter">&nbsp;
    修改.MF文件，然后在Felix中start:</div>
<div class="dp-highlighter"><br />
</div>
<div class="dp-highlighter"><br />
</div>
<div class="dp-highlighter"><span style="font-size: medium;"><strong>4.附录</strong>
</span>
</div>
</span>
</span>
</p>
<p>spring sampleservice的MANIFEST.MF文件：</p>
<pre name="code" class="xml">Bundle-Version: 1.0
Bundle-SymbolicName: org.springframework.osgi.samples.simpleservice
Bundle-Name: Simple-Service-Sample
Bundle-Vendor: Spring Framework
Export-Package: org.springframework.osgi.samples.simpleservice
Bundle-ManifestVersion: 2</pre>
<p>META-INF/springsample.xml文件：</p>
<pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

  &lt;!-- regular spring configuration file defining simple service
       bean. We've kept the osgi definitions in a separate 
       configuration file so that this file can easily be used
       for testing outside of an OSGi environment --&gt;

  &lt;bean name=&quot;simpleService&quot; class=&quot;org.springframework.osgi.samples.simpleservice.impl.MyServiceImpl&quot; /&gt;

  &lt;osgi:service id=&quot;simpleServiceOsgi&quot; ref=&quot;simpleService&quot;
    interface=&quot;org.springframework.osgi.samples.simpleservice.MyService&quot; /&gt;

&lt;/beans&gt;</pre>
&nbsp;
<p>&nbsp;</p>
<p><span style="font-family: Courier; color: #666699;"><span style="font-family: Courier; color: black;">
</span>
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/189002#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 May 2008 00:30:06 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/189002</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/189002</guid>
      </item>
      <item>
        <title>svn操作手册</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/179978" style="color:red;">http://jiangyongyuan.javaeye.com/blog/179978</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          创建项目：<br />svnadmin create /svn/projects/test<br /><br />Check out 版本：<br />svn co http://ip/svn/test/ test<br />svn co file:///svn/projects/test/ test<br /><br />import 文件：<br />svn import -m "msg" . file:///svn/project/test/dir<br />svn import -m "msg" . http://ip/svn/test/dir<br /><br />svn提供多个访问方式，通过http浏览：<br />http://ip/svn/projectname<br />file:///projectdir<br /><br />查看日志：<br />示例文件：helloWorld.html<br />svn log helloWorld.html  显示文件版本<br />svn log --verbose helloWorld.html  显示修改内容
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/179978#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 Apr 2008 09:14:09 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/179978</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/179978</guid>
      </item>
      <item>
        <title>mysql字符集最终解决</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/178380" style="color:red;">http://jiangyongyuan.javaeye.com/blog/178380</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          装confluence，使用mysql乱码，查出是mysql编码设置问题：<br /> <br />最终解决方案：<br />mysql UTF8设置：<br /> <br />vi /etc/my.cnf <br />[mysqld]<br />datadir=/var/lib/mysql<br />socket=/var/lib/mysql/mysql.sock<br />default-character-set=utf8  (数据库缺省以utf8存储)<br />init_connect='SET NAMES utf8' （设定连接mysql数据库时使用utf8编码，以让mysql数据库为utf8运行）<br /> <br />[client] <br />default-character-set=utf8 (客户端缺省以utf8存储)<br /><br />重启mysql<br /><br />登陆mysql，查看：<br />show variables like 'character%'; <br /><br />+--------------------------+----------------------------+ <br />| Variable_name | Value | <br />+--------------------------+----------------------------+ <br />| character_set_client | utf8 | <br />| character_set_connection | utf8 | <br />| character_set_database | utf8 | <br />| character_set_filesystem | binary | <br />| character_set_results | utf8 | <br />| character_set_server | utf8 | <br />| character_set_system | utf8 | <br />| character_sets_dir | /usr/share/mysql/charsets/ | <br />+--------------------------+----------------------------+
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/178380#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>Tue, 01 Apr 2008 13:37:01 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/178380</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/178380</guid>
      </item>
      <item>
        <title>tomcat自启动脚本</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/177981" style="color:red;">http://jiangyongyuan.javaeye.com/blog/177981</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、	将该文件放在 /etc/init.d目录下，以后就可以使用service tomcat start/stop/status/restart等命令了<br /><br />2、	在/etc/rc.d/rc3.d目录下，执行 ln –s /etc/init.d/tomcat /etc/rc.d/rc3.d/S99tomcat<br />这样，开机就会自动启动Tomcat了。<br /><br />3.如果不能运行，请检查<br />chmod 755 /etc/init.d/tomcat<br />chmod 755 apache-tomcat-5.5.25/<br />vi /etc/passwd<br />修改启动用户如<br />apache 的/sbin/nologin 为/bin/bash<br /><br />4、 脚本<br />#!/bin/sh<br />#<br /># Start staff.macaufly.net webserver<br /># Currently installed under /home/jira and should moved to /home/tomcat later<br />#<br /><br />TOMCAT_BIN=/home/tomcat6/bin<br />TOMCAT_USER=apache<br /><br />start() {<br /><br />	stop<br />	su - $TOMCAT_USER -c $TOMCAT_BIN/startup.sh <br />	sleep 10<br />	if netstat -an | grep 8080 >/dev/null<br />	then<br />		echo "Tomcat is running"<br />		return 0<br />	else<br />		return 1<br />	fi<br />}<br /><br />stop() {<br />	if netstat -an | grep 8080 | grep LISTEN >/dev/null<br />	then<br />		# try to shutdown the server first<br />		echo "Now Shutdown the server..."<br />		su - $TOMCAT_USER -c  $TOMCAT_BIN/shutdown.sh <br />	else<br />		echo "Tomcat is not running"<br />		return 0<br />	fi<br /><br />	if netstat -an | grep 8080 | grep LISTEN<br />	then<br />		sleep 10<br />		echo "Now kill it"<br />		ps -ef | grep java | grep $TOMCAT_USER | awk '{print "kill -9 ", $2;}' | sh<br />	fi<br /><br />	if netstat -an | grep 8080 | grep LISTEN >/dev/null<br />	then<br />		return 1 # still alive<br />	else<br />		echo "Tomcat is stopped"<br />		return 0<br />	fi<br />}<br /><br />case "$1" in<br />  start)<br />	start<br />	;;<br /><br />  stop)<br />	stop<br />	;;<br /><br />  restart)<br />	start<br />	;;<br /><br />  status)<br />  	if netstat -an |grep 8080|grep LISTEN >/dev/null<br />	then<br />		echo "Tomcat is Running"<br />	else<br />		echo "Tomcat is Not Running"<br />	fi<br />	;;<br /><br />  *)<br />	echo $"Usage: $0 {start|stop|restart|status}"<br />	exit 1<br />esac<br /><br />exit 0
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/177981#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 11:51:12 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/177981</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/177981</guid>
      </item>
      <item>
        <title>svn安装使用</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/177978" style="color:red;">http://jiangyongyuan.javaeye.com/blog/177978</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          auther: yongyuan.jiang<br />email:yongyuan.jiang@gmail.com<br /><br /><strong>1. svn配置<br />2. svn整合apache:<br />3. svn使用mysql用户登陆<br />4. svn: Can't create directory<br />5. svn安装</strong><br /><br />1. svn配置<br /><br />1.1 创建svn项目svnadmin create /svn/projects/test<br /><br />1.2 赋予测试用户权限vi /svn/conf/auth<br />[groups]<br />Tester=test,admin<br />Developer=admin<br />[test:/]<br />@Tester = rw<br />*=r<br /> <br /><br />2. svn整合apache:<br /><br />vi httpd.conf:<br />LoadModule dav_svn_module     modules/mod_dav_svn.so<br />LoadModule authz_svn_module   modules/mod_authz_svn.so<br /><br /> &lt;Location /svn><br />   DAV svn<br />        SVNParentPath /subversion/project  (此处配置你的版本库根目录)  <br />        AuthType Basic<br />        AuthName "Subversion repository"  （此处字符串内容修改为提示对话框标题）<br />      AuthUserFile /subversion/passwd     (此处修改为访问版本库用户的文件，用apache 的 htpasswd命令生成)<br />        AuthzSVNAccessFile /subversion/auth （此处修改为访问版本库权限的文件）<br />        Require valid-user<br />  &lt;/Location><br /><br />添加用户验证：<br /># /usr/local/apache2/bin/htpasswd –cm /subversion/passwd dyf （第一次添加用户需先创建文件，所以有参数-c，以后添加用户可以不用添加参数）<br /><br /><br /><br />3. svn使用mysql用户登陆<br /><br />vi httpd.conf:<br />	&lt;Location /svn><br />		DAV svn<br />		SVNParentPath /repository       #这个就是SVN的父级目录,如果你只有一个库可以写成SVNPath /path<br />		AuthzSVNAccessFile /repository/auth/authz     #权限验证文件<br />		AuthName "Please Login.."<br />		AuthType Basic<br />		AuthMYSQLEnable on<br />		AuthMySQLUser authuser               #访问mysql的用户名<br />		AuthMySQLPassword "Your Password Here"    #访问mysql的密码<br />		AuthMySQLDB auth<br />		AuthMySQLUserTable users                   #用户验证的数据库<br />		AuthMySQLNameField user_name           #用户验证数据库的用户名字段<br />		AuthMySQLPasswordField user_passwd    #用户验证数据库的密码字段<br />		require valid-user<br />	&lt;/Location><br /><br />4. svn: Can't create directory '/svn/projects/test/db/transactions/0-1.txn': Permission denied<br />SELinux的东西在捣鬼，运行“setenforce 0”停止它，问题解决。修改/etc/sysconfig/selinux，把SELINUX设定为disable，下次启动系统后将不会自动启动SElinux。<br /><br />5. svn安装<br />5.1 <br />redhad5 安装<br />使用源文件下载后安装：wget http://ip/LinuxSource/<br /><br />5.2	自行安装：<br />5.2.1 安装apache httpd<br />	#  tar xzvf httpd-2.2.6.tar.gz<br />	#  ./configure --prefix=/usr/local/apache2 --enable-dav --enable-modules=so --enable-maintainer-mode --enable-rewrite --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config<br />	#  make；make  install<br />	# vi /usr/local/apache2/conf/httpd.conf<br />	ServerName www.example.com:80<br />	ServerName localhost:80<br />5.2.2 安装subversion<br />	# tar xvzf subversion-1.4.5.tar.gz<br />	# tar xvzf subversion-deps-1.4.5.tar.gz<br />	# cd subversion-1.4.5<br />	# rm -rf apr<br />	# rm -rf apr-util<br />	#./configure --with-apxs=/usr/local/apache2/bin/apxs --prefix=/usr/local/subversion --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-ssl --with-zlib --enable-maintainer-mode<br />	# make；make install<br />5.2.3 svn整合apache(见2. svn整合apache:)<br /><br /><br />如果是自己装apache,参考资料：<br />http://bbs.iusesvn.com/thread-2208-1-2.html
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/177978#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 11:47:32 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/177978</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/177978</guid>
      </item>
      <item>
        <title>linux中tomcat使用文档</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174279" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174279</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>linux中tomcat使用文档</strong><br /><br />作者：江永源<br />email:yongyuan.jiang@gmail.com<br /><br /><br />根据目录搜索，目录先后顺序与安装配置顺序无关。<br /><br />目录：<br />1.apache httpd 与 tomcat 代理方式整合<br />2.tomcat自启动配置<br />3.补充：jre安装、tomcat安装<br />4.发布应用、添加日志<br />5.设置内存、使用gbk编码启动<br />6.添加classpath目录,达到配置文件与发布文件分离<br /><br /><strong>1.apache httpd 与 tomcat 代理方式整合</strong><br />修改httpd.conf文件<br />（/etc/httpd/conf/httpd.conf或/usr/local/apache2）<br /><br />添加LoadModule:<br /><br />LoadModule proxy_module modules/mod_proxy.so<br />LoadModule proxy_balancer_module modules/mod_proxy_balancer.so<br />LoadModule proxy_ftp_module modules/mod_proxy_ftp.so<br />LoadModule proxy_http_module modules/mod_proxy_http.so<br />LoadModule proxy_connect_module modules/mod_proxy_connect.so<br /><br />在最后添加：<br />ProxyRequests Off<br /><br />&lt;Proxy *><br />Order deny,allow<br />Allow from all<br />&lt;/Proxy><br /><br />ProxyPass /foo http://127.0.0.1：8080/foo<br />ProxyPassReverse /foo http://127.0.0.1:8080/foo <br /><br />'Permission denied: proxy' error：<br />setsebool httpd_can_network_connect true<br /><br /><strong>2.tomcat自启动配置</strong><br /><br />tomcat提供自启动的包，需要安装，最后添加到/etc/init.d中。<br /><br />以下是我们的自启动脚本，不用直接使用即可。<br /><br />保存成tomcat,放在/etc/init.d/tomcat<br /><br />保存成功后测试：<br />service tomcat start<br />service tomcat status<br />service tomcat restart<br />service tomcat stop<br /><br />如果测试失败，可能是文件是DOS格式：<br />#vi tomcat<br />:set fileformat unix<br /><br />测试成功，设置自动启动：<br />ln –s /etc/init.d/tomcat /etc/rc.d/rc3.d/S99tomcat<br /><br />S99tomcat意思：start tomcat ,优先级排在99位<br />如果是图形界面：<br />ln –s /etc/init.d/tomcat /etc/rc.d/rc5.d/S99tomcat<br /><br />重启测试：<br />init 6<br /><br />以下是脚本<br /><pre name="code" class="java">
#!/bin/sh
#
# Start webserver
#

TOMCAT_BIN=/home/tomcat6/bin
TOMCAT_USER=apache

start() {

	stop
	su - $TOMCAT_USER -c $TOMCAT_BIN/startup.sh 
	sleep 10
	if netstat -an | grep 8080 >/dev/null
	then
		echo "Tomcat is running"
		return 0
	else
		return 1
	fi
}

stop() {
	if netstat -an | grep 8080 | grep LISTEN >/dev/null
	then
		# try to shutdown the server first
		echo "Now Shutdown the server..."
		su - $TOMCAT_USER -c  $TOMCAT_BIN/shutdown.sh 
	else
		echo "Tomcat is not running"
		return 0
	fi

	if netstat -an | grep 8080 | grep LISTEN
	then
		sleep 10
		echo "Now kill it"
		ps -ef | grep java | grep $TOMCAT_USER | awk '{print "kill -9 ", $2;}' | sh
	fi

	if netstat -an | grep 8080 | grep LISTEN >/dev/null
	then
		return 1 # still alive
	else
		echo "Tomcat is stopped"
		return 0
	fi
}

case "$1" in
  start)
	start
	;;

  stop)
	stop
	;;

  restart)
	start
	;;

  status)
  	if netstat -an |grep 8080|grep LISTEN >/dev/null
	then
		echo "Tomcat is Running"
	else
		echo "Tomcat is Not Running"
	fi
	;;

  *)
	echo $"Usage: $0 {start|stop|restart|status}"
	exit 1
esac

exit 0
</pre><br /><br /><strong>3.补充：jre安装、tomcat安装</strong><br />3.1 安装jre或jdk<br />#chmod  u+x  ./j2sdk-1_4_2_04-linux-i586-rpm.bin  <br />#./j2sdk-1_4_2_04-linux-i586-rpm.bin  <br /># rpm  -ivh  j2sdk-1_4_2_04-linux-i586-rpm  <br /><br /><br />3.2 jdk安装的环境变量设置：<br /><br />#  vi  /home/username/.bashrc  或<br />#  vi  /etc/profile  <br /><br />JRE_HOME=/usr/java/jre6<br />CLASSPATH=$CLASSPATH:$JAVA_HOME/jre/lib  <br />PATH=$PATH:$JRE_HOME/bin<br /><br />export JRE_HOME CLASSPATH<br /><br />3.3 安装tomcat<br />#tar zxvf tomcat.tar.gz<br /><br /><br /><strong>4.发布应用、添加日志</strong><br />4.1 tomcat 发布应用：<br />在$CATALINA_HOME/conf/Catailna/localhost/随便写一个xml文件，配置应用<br />#vi app.xml <br />&lt;Context path="/test" docBase="/home/webapp">&lt;/Context><br /><br /><br />4.2 日志记录：<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE log4j:configuration >

&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
	debug="true">

	&lt;appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		&lt;layout class="org.apache.log4j.PatternLayout">
			&lt;param name="ConversionPattern"
				value="%d{MM-dd HH:mm:ss} %p [%t] %C{2} (%F:%L) - %m%n" />
		&lt;/layout>
	&lt;/appender>
	
	&lt;appender name="log"
		class="org.apache.log4j.DailyRollingFileAppender">
		&lt;param name="File"
			value="/home/tomcat6/webapps/jira/log.htm" />
		&lt;param name="Append" value="true" />
		&lt;layout class="org.apache.log4j.PatternLayout">
			&lt;param name="ConversionPattern"
				value="%d{MM-dd HH:mm:ss} %p [%t] %C{2} (%F:%L) - %n%m%n" />
		&lt;/layout>
	&lt;/appender>
	
	&lt;root>
		&lt;level value="INFO" />
		&lt;appender-ref ref="STDOUT" />
		&lt;appender-ref ref="log" />
	&lt;/root>

&lt;/log4j:configuration>
</pre><br /><br /><br /><strong>5.设置内存、使用gbk编码启动</strong><br />5.1 添加内存<br />修改catalina.sh,找到JAVA_OPTS并在使用前添加：<br />JAVA_OPTS="-Xmx512m"<br /><br />5.2 使用gbk编码启动tomcat:<br />修改catalina.sh，在-Djava的地方，添加:<br />-Dfile.encoding=GBK <br /><br /><br /><strong>6.添加classpath目录,达到配置文件与发布文件分离</strong><br />修改catalina.sh:<br />找到CLASSPATH的赋值地方，在后面添加你要的文件夹,如$CATALINA_HOME"/resource：<br />CLASSPATH="$CLASSPATH":"$JSSE_HOME"/lib/jcert.jar:"$JSSE_HOME"/lib/jnet.jar:"$JSSE_HOME"/lib/jsse.jar:"$CATALINA_HOME"/resource
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174279#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 19:28:59 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174279</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174279</guid>
      </item>
      <item>
        <title>GWT服务端抛出前端异常</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174236" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174236</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在后台抛出异常，并在前端能够捕获<br /><br />方法很简单：要抛出的AppcliationException 继承SerializableException,并实现IsSerializable接口<br /><br /><br /><pre name="code" class="java">
//need The default constructor
//gwt服务端抛出错误：

import com.google.gwt.user.client.rpc.IsSerializable;
import com.google.gwt.user.client.rpc.SerializableException;

public class ApplicationException extends SerializableException implements IsSerializable{}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174236#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:38:47 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174236</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174236</guid>
      </item>
      <item>
        <title>Gwt 服务端使用hiberante 问题解决</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174232" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174232</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Gwt 服务端使用hiberante 问题解决<br /><br /><br />使用hibernate，在返回前端时，会出现一些错误，如lazy装载、还有就是hibernate对实体类的多种状态，在返回前端都会出错。<br /><br />下面是List的解决方法<br /><br /><br /><pre name="code" class="java">
package com.google.gwt.user.client.rpc.core.org.hibernate.collection;

import java.util.Iterator;

import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;

/**
 * Custom field serializer for { @linkorg.hibernate.collection.PersistentList}.
 */
public final class PersistentBag_CustomFieldSerializer {

 public static void deserialize(SerializationStreamReader streamReader,
   org.hibernate.collection.PersistentBag instance)
   throws SerializationException {
  int size = streamReader.readInt();
  for (int i = 0; i &lt; size; ++i) {
   Object obj = streamReader.readObject();
   instance.add(obj);
  }
 }

 public static void serialize(SerializationStreamWriter streamWriter,
   org.hibernate.collection.PersistentBag instance)
   throws SerializationException {
  int size = instance.size();
  streamWriter.writeInt(size);
  Iterator iter = instance.iterator();
  while (iter.hasNext()) {
   Object obj = iter.next();
   streamWriter.writeObject(obj);
  }
 }

}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174232#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:36:27 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174232</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174232</guid>
      </item>
      <item>
        <title>CAS应用实践</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174222" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174222</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          keystool生成，导入：<br />keytool -genkey -alias tomcat -keyalg RSA<br />keytool -export -alias tomcat -file server.crt <br />keytool -import -file server.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts<br /><br /><br />CAS配置详解 <br />From OseWiki <br />Jump to: navigation, search <br />1.下载cas-server和cas-client(可选，建议使用） <br /><br /> http://www.ja-sig.org/downloads/cas/cas-server-3.0.zip<br /> http://www.yale.edu/tp/cas/cas-client-2.0.11.zip<br /><br />2.将cas-server-3.0.zip解压，并将lib/cas.war拷贝到server1的webapps下 <br /><br />3.产生SERVER的证书 <br /><br /> keytool -genkey -alias my-alias-name -keyalg RSA -keystore  keystore.keystore 首先在命令行中切换到 %java_home%\jre\lib\security目录 %java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA 密码是:changeit 姓名是:localhost 其他随便写的 之后是 %java_home%\bin\keytool -export -alias tomcat -file server.crt (导出SERVER的证书，用来给所有需要用到的客户端导入) 和 %java_home%\bin\keytool -import -file server.crt -keystore % java_home%/jre/lib/security/cacerts  (在客户端的JVM里导入信任的SERVER的证书(根据情况有可能需要管理员权限)<br />4.在server1配置tomcat使用HTTPS $CATALINA_HOME/conf/server.xml里 <br /><br /> &lt;Connector port="8443"   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  enableLookups="false" disableUploadTimeout="true"  acceptCount="100" debug="0" scheme="https" secure="true"  clientAuth="false" sslProtocol="TLS"   keystoreFile="C:\Documents and Settings\new\keystore.keystore"   keystorePass="changeit" /><br />5.在要使用CAS的客户端client1里设置（以servlets-examples这个APP为例），我们使用ServletFilter(CAS client里提供的)来实现SSO的检查。将cas-client-2.0.11\java\lib文件复制到%tomcat_home%\webapps\servlets- examples\WEB-INF\lib中(没有lib文件夹，自己建一个) 修改servlets-examples/WEB-INF/web.xml <br /><br /> &lt;filter>    &lt;filter-name>CASFilter&lt;/filter-name>   &lt;filter-class>edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class>   &lt;init-param>       &lt;param-name>edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name>       &lt;param-value>https://localhost:8443/cas/login&lt;/param-value>   &lt;/init-param>   &lt;init-param>       &lt;param-name>edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name>       &lt;param-value>https://localhost:8443/cas/proxyValidate&lt;/param-value>   &lt;/init-param>   &lt;init-param>       &lt;param-name>edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name>       &lt;param-value>localhost:8080&lt;/param-value>   &lt;/init-param>   &lt;/filter>   &lt;filter-mapping>       &lt;filter-name>CASFilter&lt;/filter-name>       &lt;url-pattern>/servlet/*&lt;/url-pattern>   &lt;/filter-mapping><br />6.将cas-client-2.0.11.zip解压，把java/lib/casclient.jar拷贝到client1服务器上的webapps/servlets-examples/WEB-INF/lib目录下（如果没有就建一个） <br /><br />7.导出SERVER的证书，用来给所有需要用到的客户端导入 (在第三步生成这里重复一下) keytool -export -file myserver.cert -alias my-alias-name -keystore keystore.keystore <br /><br />8.test & done. 把server1和client1分别起来，检查启动的LOG是否正常，如果一切OK，就访问 http://client1:8080/servlets-examples/servlet/HelloWorldExample 系统会自动跳转到一个验证页面，随便输入一个相同的账号,密码，严正通过之后就会访问到真正的HelloWorldExample这个servlet了 <br /><br />取自"http://www.ose.com.cn/wiki/index.php?title=CAS%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3" <br /> <br />CAS介绍 <br />From OseWiki <br />Jump to: navigation, search <br />CAS背景介绍 <br /><br />CAS（Central Authentication Service），是耶鲁大学开发的单点登录系统（SSO，single sign-on），应用广泛，具有独立于平台的，易于理解，支持代理功能。CAS系统在各个大学如耶鲁大学、加州大学、剑桥大学、香港科技大学等得到应用。 <br /><br />Spring Framework的Acegi安全系统支持CAS，并提供了易于使用的方案。Acegi 安全系统，是一个用于Spring Framework的安全框架，能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务，包括使用Bean Context，拦截器和面向接口的编程方式。因此，Acegi安全系统能够轻松地适用于复杂的安全需求。 Acegi安全系统在国内外得到了广泛的应用，有着良好的社区环境。 <br /><br />CAS的设计目标 <br /><br />(1)为多个Web应用提供单点登录基础设施，同时可以为非Web应用但拥有Web前端的功能服务提供单点登录的功能； <br /><br />(2)简化应用认证用户身份的流程； <br /><br />(3)将用户身份认证集中于单一的Web应用，让用户简化他们的密码管理，从而提高安全性；而且，当应用需要修改身份验证的业务逻辑时，不需要到处修改代码。 <br /><br />CAS的实现原理 <br /><br /><br />CAS（Central Authentication Server）被设计成一个独立的Web应用。实现原理非常简单，CAS Server2.0.12的实现只有30个类，除了JDK本身外，只使用到一个 servlet.jar包。它目前的实现是运行在HTTPS服务器的几个Java Servlet上（而客户端可以灵活采用http和https的方式）。通过CAS2.0.12认证的序列图如下图(因图片显示问题，暂时去除)。 <br /><br /><br />CAS在应用中的运行硬件环境 University of Delaware: Sun Fire 280R/ 2x750 MHz/ 4 GB memory/ 550.3 GB disk storage University of Hawaii: a single Sun Netra X1 (UltraSPARC-IIe 500MHz) with 1.0GB RAM dedicated to running CAS. 2. CAS2.0.12中关于ticket的生成 <br /><br /><br />CAS创建一个位数很长的随机数（ticket）。CAS把这个ticket和成功登录的用户以及用户要访问的service联系起来。例如，如果用户peon重定向自service S，CAS创建ticket T，这个ticket T允许peon访问service S。这个ticket是个一次性的凭证；它仅仅用于peon和仅仅用于service S，并且只能使用一次，使用之后马上会过期，即ticket通过验证，CAS立即删除该ticket，使它以后不能再使用。这样可以保证其安全性。 <br /><br />关于ST，在取一个ST时，即使用deleteTicket(ticketId)同时将一次性的ST删除；而对于TGT或PT，则通过resetTimer(ticketId)以更新TGT或PT的时间。在CAS服务端返回的ST中只能得出用户名。 <br /><br />取自"http://www.ose.com.cn/wiki/index.php?title=CAS%E4%BB%8B%E7%BB%8D"<br /><br /><br /><br /> [学习] 使用 CAS 实现 SSO 实践过程 <br />前一段时间曾经研究过一段关于 SSO 的技术，也深知 SSO(Single Sign-On) 是一个博大精深的主题，而我们通常提起的仅仅是所谓的 WebApp SSO，其主要特点是SSO 应用之间走Web协议 ( 如 HTTP/SSL) ，并且 SSO 都只有一个登录入口，SSO 的核心就是所谓的单点登录和身份认证。 <br /><br />CAS(Central Authentication Service) 是 Yale 大学发起的一个开源项目，据统计，大概每 10 个采用开源构建 Web SSO 的 Java 项目，就有 8 个使用 CAS 。对这些统计，我虽然不以为然，但有一点可以肯定的是，CAS 是我认为最简单实效，而且足够安全的 SSO 选择。前一段时间正好做了配置 CAS 的实践，记下主要步骤，以供日后参考。 <br /><br />1.系统配置 <br /><br />以下是必需的软件环境：<br />1． JDK 1.4.2 or higher<br />2． Tomcat 5.X<br />3． JSSE-1_X（安装方法可见下载包） <br /><br />2. Tomcat 配置，启用SSL <br /><br />a. 在要安装CAS的机器上为Tomcat生成用于SSL通讯的密钥：%JAVA_HOME%/bin/keytool -genkey -alias tomcat -keyalg RSA<br />这时需要输入密钥密码和其他参数（第一个参数CN必须设置为CAS机器名，这里架设为 james-huang，本机使用localhost测试），会在系统用户目录中生成.keystore密钥文件。 <br /><br />b. 导出别名为tomcat的密钥文件：%JAVA_HOME%/bin/keytool -export -file /path/server.crt -alias tomcat 这时需要输入上一步设定的密码，结果会在/path/目录生成server.crt信任状。 <br /><br />c. 为客户端的JVM导入密钥：：%JAVA_HOME%/bin/keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file /path/server.crt -alias tomcat 注意：输入密码时密码为"changeit"，这是默认密码。 <br /><br />d. 修改服务端Tomcat配置文件，启用SSL：修改$CATALINA_HOME/conf/server.xml，去掉有关SSL的那一段的注释，需要 在connector字段中加 keystorePass="password"（password即为1、2步中的密码），keystoreFile="keystorePath" （可以把第一步生成的.keystore复制到$CATALINA_HOME/conf/下，这样keystoreFile= "conf/.keystore"）。重启Tomcat，测试 https://james-huang:8443 是否可以访问（推荐将服务器填上Server的机器名）。 <br /><br />3. CAS Server安装 <br /><br />下载CAS Server 3.0.6（可到耶鲁大学官方站或者到 http://www.ja-sig.org/products/cas/ 下载），将其中的cas.war复制到$CATALINA_HOME/webapps下（当然现在CAS中的用户密码认证是很简陋的，产品化必须重写这部分代码，生成新的cas.war）。这时，重启Tomcat应该就可以通过访问 https://james-huang:8443/cas 看到CAS的登录界面了。 <br /><br />4. CAS Client 部署 <br /><br />建议自己创建一个Project以便进行试验（架设工程名为 casclient），下载最新版本的Yale Java CAS Client（2.0.11）并将casclient.jar复制到这两个项目的WEB-INF目录的lib下。修改两个项目的WEB-INF/web.xml，添加如下的过滤器： <br /><br />代码： <br />&lt;!-- CAS Filters --> <br />&lt;filter> <br />&lt;filter-name>CASFilter&lt;/filter-name> <br />&lt;filter-class>edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class> <br />&lt;init-param> <br />&lt;param-name>edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name> <br />&lt;param-value>https://james-huang:8443/cas/login&lt;/param-value> <br />&lt;/init-param>&lt;!--这里的james-huang是服务端的主机名--> <br />&lt;init-param> <br />&lt;param-name>edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name> <br />&lt;param-value>https://james-huang:8443/cas/proxyValidate&lt;/param-value> <br />&lt;/init-param>&lt;!--这里的james-huang是服务端的主机名，而且必须是--> <br />&lt;init-param> <br />&lt;param-name>edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name> <br />&lt;param-value>client:port&lt;/param-value>&lt;!--client:port就是需要CAS需要拦截的地址和端口，一般就是Client端的IP和port--> <br />&lt;/init-param> <br />&lt;/filter> <br /><br />&lt;filter-mapping> <br />&lt;filter-name>CASFilter&lt;/filter-name> <br />&lt;url-pattern>/*&lt;/url-pattern> <br />&lt;/filter-mapping> <br /> <br />这样，重启Client端的Tomcat并访问 http://client-ip:8080/casclient，你就会被重定向到Server端的CAS登陆页；此时你可测试登录（默认的认证Handler只要求username=password，可任意选择用户名）；登录后就会进入casclient的欢迎页面了；继续定位到http://client-ip:8080/casclient，执行任何一个例子也不用再输入密码。 <br />至此，全部架设过程及测试完毕。当然，这仅仅是一个测试过程，若要实际环境中我们需要到数据库验证用户有效性，我们必须借助到用户数据库。首先，我们需 要创建自己的数据库验证器，当然也可以使用Jasig提供的cas-server-jdbc.jar，通常我们会修改cas-server- jdbc的源码满足自己的需要，并把mysql的jdbc驱动和修改后的jar部署到%CAS%/WEB_INF/lib/下。具体的过程不在这里赘述， 有兴趣的朋友可以自己研究一下。<br /><br /><br /><br /><br />5. 补充：1、 在多台机器上部署CAS的时候要注意，这些部署的机器必须在同一个域中。2、若在配置过程中出现一些Exception，像“keytool 别名已存在”这些的出错提示，一般都是由于证书导入未成功造成的，若重新生成证书，导入到客户端的同时别忘了把server端的.keystore文件重 新拷贝到Tomcat中去，石头就是由于忘记了这个步骤还调试了老半天呢：） <br /><br /><br /><br />cas-asp:<br />&lt;%<br />    dim cas_server <br />    cas_server = "http://midp-117:8080/cas/"<br />    <br />    function doCasLogin()<br />        dim uid,ticket,url,backUrl<br />        <br />        uid  = Session.Contents("Netid")<br />        <br />        if uid="" then <br />            <br />            ticket = Request.QueryString.Item("ticket").Item<br />            <br />            if ticket="" then<br />            <br />                backUrl = CasUtilGetPageUrl()<br />                url = cas_server+"login?"+"service="+ backUrl<br />                    <br />                Response.Redirect(url)<br />                Response.End<br />                <br />            else <br />                <br />                if InStr(Request.QueryString,"&ticket")=0 then <br />                    backUrl = CasGetValidateBackUrl()<br />                else<br />                    backUrl = Split(backUrl,"&ticket")(0)<br />                end if<br />                <br />                set http = Server.CreateObject("MSXML2.ServerXMLHTTP")<br />                <br />                url  =cas_server+"validate?ticket="+ticket+"&"+"service="+ backUrl<br />                <br />                http.open "GET",url,false<br />                http.send()<br />                <br />'                Response.write("text = " + http.responseText)<br />                <br />                if InStr(Request.QueryString,"no")=0 then   '// Logon successful<br />                    <br />                    'Response.write(Trim(Split(http.responseText,"yes")(1)))<br />                    Session.Contents("Netid") = Trim(Split(http.responseText,"yes")(1))<br />                    <br />                end if<br />            end if<br />        end if<br />    end function<br /><br />    ' Utils<br />    <br />    function CasUtilGetPageUrl() <br />    <br />        dim pageUrl<br />        <br />        If Request.ServerVariables("https") = "on" Then<br />            pageUrl = "https"<br />        Else<br />            pageUrl = "http"<br />        End If<br />        <br />        ' TODO : Support https protocol !!<br />        pageUrl = pageUrl & "://" & Request.ServerVariables("server_name")<br />        <br />        If Request.ServerVariables("server_port") &lt;> 80 Then<br />            pageUrl = pageUrl & ":" & Request.ServerVariables("server_port")<br />        End if<br />        <br />        pageUrl = pageUrl & Request.ServerVariables("path_info")<br />        <br />        If Request.QueryString &lt;> "" Then<br />            pageUrl = pageUrl & "?" & server.URLEncode( Request.QueryString )<br />        End if<br />        ' We have the current page URL.<br />        CasUtilGetPageUrl = pageUrl<br />        <br />    end function<br />    <br />    function CasGetValidateBackUrl() <br />    <br />        dim pageUrl<br />        <br />        If Request.ServerVariables("https") = "on" Then<br />            pageUrl = "https"<br />        Else<br />            pageUrl = "http"<br />        End If<br />        <br />        ' TODO : Support https protocol !!<br />        pageUrl = pageUrl & "://" & Request.ServerVariables("server_name")<br />        <br />        If Request.ServerVariables("server_port") &lt;> 80 Then<br />            pageUrl = pageUrl & ":" & Request.ServerVariables("server_port")<br />        End if<br />        <br />        pageUrl = pageUrl & Request.ServerVariables("path_info")<br /><br />        CasGetValidateBackUrl = pageUrl<br />        <br />    end function<br />    <br />    <br />    doCasLogin()<br />%><br /><br />&lt;!--#include file='cas.asp'--><br />&lt;%<br />'需要登陆页面，嵌入此文件即可<br />dim userid<br />userid = Session.Contents("Netid")<br />'Response.write("text = " +  userid)<br />%><br /><br />介绍：<br />http://www.360doc.com/showWeb/0/0/222129.aspx
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174222#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:20:39 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174222</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174222</guid>
      </item>
      <item>
        <title>property的读取&amp;log4j配置</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174220" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174220</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.log4j 如下:<br /><pre name="code" class="java">

 &lt;appender name="sf.easyajax.remote.IpFilter" class="org.jboss.logging.appender.RollingFileAppender"> 
    &lt;param name="File" value="/${jboss.server.home.dir}/log/IpFilter.log"/>                      
    &lt;param name="Append" value="true"/>                                                        
    &lt;param name="MaxFileSize" value="500KB"/>                                                  
    &lt;param name="MaxBackupIndex" value="1"/>                                                   
                                                                                               
    &lt;layout class="org.apache.log4j.PatternLayout">                                            
      &lt;param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>                              
    &lt;/layout>                                                                                  
  &lt;/appender> 


 &lt;logger name="sf.easyajax">                                                                              
  &lt;level value="ERROR" />                                                                 
   &lt;appender-ref ref="sf.easyajax.remote.IpFilter"/>
 &lt;/logger> 

</pre><br /><br /><br /><br /><br /><br /><br /><br /><br />2.ejb context的初始化 & ejb 远程调用 <br /><br /><pre name="code" class="java">
try {
    Properties props = new Properties();
    Properties icProps = new Properties();
    InputStream in = getClass().getResourceAsStream(
      "jndi.properties"); 

    if (in != null) {
     try {
      props.load(in); 

      // icProps = new Properties(); 

      icProps.put(Context.INITIAL_CONTEXT_FACTORY, props
        .getProperty("java.naming.factory.initial"));
      icProps.put(Context.PROVIDER_URL, props
        .getProperty("java.naming.provider.url"));
      icProps.put(Context.URL_PKG_PREFIXES, props
        .getProperty("java.naming.factory.url.pkgs")); 


     } catch (IOException e) {
      e.printStackTrace();
     }
    }
    context = new InitialContext(icProps); 

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=10.2.1.234:1099  

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174220#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:18:45 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174220</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174220</guid>
      </item>
      <item>
        <title>mysql 自动在线备份</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174212" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174212</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="font-size: medium">mysql 自动在线备份</span></strong><br /><br />本文作者：解道成<br /><br />拟在实验室测试进行MySQL的在线备份测试 <br />1、建立一个 主 MySQL 服务器 <br />2、建立一个从 MySQL 服务器 <br />3、建立从主服务器到从服务器的在线数据复制 <br /><br />目的： <br />1、MySQL的安装、管理 <br />2、主从服务器的建立，以保证以后数据库系统的高可用性 <br />3、测试一下相关的性能。 <br /><br />操作如下：<br />第一步：开始时如果slave上的数据和master上的不同 <br />，需要同步数据库<br />1. 备份数据库<br />mysqldump -uroot -padmin  midp > "C:\Program Files\MySQL\MySQL Server 5.0\logs\back.sql"<br />2. 恢复数据<br />mysql -uroot -p123456 midp &lt; "C:\Program Files\MySQL\MySQL Server 5.0\logs\back.sql"<br />或使用Mysql Query Browser更简单<br /><br />第二步：在master上创建一个slave的帐户<br />mysql> GRANT REPLICATION SLAVE ON *.*<br />       -> TO 'repl'@'10.1.2.131' IDENTIFIED BY 'slave';<br /><br />第三步：配master 与 slave 的my.ini (Linux上是my.cnf)文件<br />在里面的[mysqld]行下面增加<br />(master):<br />server-id=1<br />log-bin=C:\Program Files\MySQL\MySQL Server 5.0\logs\mysql_binary_log #打开二进制日志<br />binlog-do-db=midp #需要备份的数据库名，如果备份多个数据库，重复设置这个选项即可<br />binlog-ignore-db=mysql #不需要备份的数据库名，如果备份多个数据库，重复设置这个选项即可<br /><br />(slave):<br />server-id=2<br />master-host=10.1.2.130<br />master-user=repl<br />master-password=slave<br />master-port=3306<br />master-connect-retry=10<br />replicate-do-db=midp #需要备份的数据库名，如果备份多个数据库，重复设置这个选项即可<br />-----------------------------------------------------------------------------------<br />重启<br />第四步：检查<br />(1) MySQL> show Master status; 是否开启二进制日志<br />(2) MySQL> show slave status; 检查Slave_IO_Running和Slave_SQL_Running是否都是Yes;<br />               查看Slave_IO_State字段:1.空 //复制没有启动<br />                                      2.Connecting to master//没有连接上master<br />                                      3.Waiting for master to send event//已经连上<br />(3) MySQL> show processlist;<br />     找到I/O和SQL线程的Status，如果I/O状态是Connecting to master为false<br />     ture statue is: 1.Waiting for master to send event<br />                     2.has read all relay log;waiting for the slave I/o thread to update it<br />-----------------------------------------------------------------------------------<br /><br />有的资料上说要再操作第五步和第六步 但我经测试 到这一步就已经能够ok了<br /><br /><br />如果要从master的当前日志点同步，或者改变slave端的master主机，可以参考第五步和第六步命令<br /><br />第五步：查看验证master的日志开启<br />mysql > SHOW MASTER STATUS;<br />    +---------------+----------+--------------+------------------+<br />| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |<br />+---------------+----------+--------------+------------------+<br />| mysql_binary_log.003 | 73| test | manual,mysql |<br />+---------------+----------+--------------+------------------+<br /><br />第六步：在 slave 执行下面 sql 操作<br />   mysql>stop slave<br />   mysql> CHANGE MASTER TO<br />  -> MASTER_HOST=' 10.1.2.130',<br />  -> MASTER_USER='root',<br />  -> MASTER_PASSWORD='admin',<br />  -> MASTER_LOG_FILE='mysql_binary_log.003',<br />  -> MASTER_LOG_POS=73;<br />  mysql> start slave<br /><br />  <br />已测试：在Win2000--Win2000 任意停掉master和slave的mysql后，再开启都可以继续同步
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:04:23 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174212</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174212</guid>
      </item>
      <item>
        <title>ant rsync 上传</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174211" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174211</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;macrodef name="rsync"><br />        &lt;attribute name="local"/><br />        &lt;attribute name="remote"/><br />        &lt;sequential><br />            &lt;exec executable="rsync.exe"><br />                &lt;arg line="-rultvz @{local} @{remote}"/><br />            &lt;/exec><br />        &lt;/sequential><br />    &lt;/macrodef><br /><br />    &lt;target name="test"><br />        &lt;rsync local="/cygdrive/d/test.txt" remote="${RemoteServer}/" /><br />    &lt;/target><br /><br /><br />需要设置ssh,不必每次都输入密码<br /><br /><br />sshD at window:http://pigtail.net/LRP/printsrv/cygwin-sshd.html<br /><br />linux命令:查阅socket连接<br />netstat -an |grep 1788<br /><br /><br />openSSH连接远程服务器:<br />ssh midp@218.19.140.185<br /><br />rsync实例：<br />rsync -avz /cygdrive/d/GWT.pdf midp@218.19.140.185:/home/midp/<br />rsync -avz midp@218.19.140.185:/home/midp/GWT.pdf /cygdrive/d/<br /><br />前者将本地d盘的GWT.pdf上传到服务器/home/midp文件夹<br />后者相反<br /><br />rsync客户命令<br />在对rsync服务器配置结束以后，下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具，其命令也有很多功能特色选项，我们下面就对它的选项一一进行分析说明。<br /><br />首先，rsync的命令格式可以为：<br /><br />rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST<br /><br />rsync [OPTION]... [USER@]HOST:SRC DEST<br /><br />rsync [OPTION]... SRC [SRC]... DEST<br /><br />rsync [OPTION]... [USER@]HOST::SRC [DEST]<br /><br />rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST<br /><br />rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]<br />rsync有六种不同的工作模式：<br /><br />拷贝本地文件；当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。<br /><br />使用一个远程shell程序（如rsh、ssh）来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。<br /><br />使用一个远程shell程序（如rsh、ssh）来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。<br /><br />从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。<br /><br />从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。<br /><br />列远程机的文件列表。这类似于rsync传输，不过只要在命令中省略掉本地机信息即可。<br />1、用法<br /><br />在使用rsync传输文件时，需要指定一个源和一个目的，其中一个可能是远程机器的资源信息。例如：<br /><br />rsync *.c foo:src/<br /><br />表示将传输当前目录下所有以.c结尾的文件到机器foo的src目录下。如果任何文件已经存在于远程系统，则会调用远程更新协议来实现仅仅传输那些更新过的文件。<br /><br />rsync -avz foo:src/bar /data/tmp<br /><br />该命令则递归地传输机器foo上的src/bar目录下的所有内容到本地/data/tmp/bar目录中。文件以归档模式进行传输，以确保符号链结、属性、权限、属主等信息在传输中都被保存。此外，可以使用压缩技术来加快数据传输：<br /><br />rsync -avz foo:src/bar/ /data/tmp<br /><br />路径信息以"/"结尾时表示拷贝该目录，而不以"/"结尾表示拷贝该目录。当配合使用--delete选项时这两种情况的区别将会表现出来。<br /><br />也可以以本地模式来使用rsync，如果SRC和DST路径中都没有任何":"符号则表示该命令运行在本地模式，等同于cp命令。<br /><br />rsync somehost.mydomain.com::<br /><br />这种模式则将会列出somehost.mydomain.com.可以访问的所有模块信息。<br /><br />选项说明<br /><br />-v, --verbose 详细模式输出<br />-q, --quiet 精简输出模式<br />-c, --checksum 打开校验开关，强制对文件传输进行校验<br />-a, --archive 归档模式，表示以递归方式传输文件，并保持所有文件属性，等于-rlptgoD<br />-r, --recursive 对子目录以递归模式处理<br />-R, --relative 使用相对路径信息<br /><br />rsync foo/bar/foo.c remote:/tmp/<br /><br />则在/tmp目录下创建foo.c文件，而如果使用-R参数：<br /><br />rsync -R foo/bar/foo.c remote:/tmp/<br /><br />则会创建文件/tmp/foo/bar/foo.c，也就是会保持完全路径信息。<br /><br />-b, --backup 创建备份，也就是对于目的已经存在有同样的文件名时，将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。<br />--backup-dir 将备份文件(如~filename)存放在在目录下。<br />-suffix=SUFFIX 定义备份文件前缀<br />-u, --update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件。(不覆盖更新的文件)<br />-l, --links 保留软链结<br />-L, --copy-links 想对待常规文件一样处理软链结<br />--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结<br />--safe-links 忽略指向SRC路径目录树以外的链结<br />-H, --hard-links 保留硬链结<br />-p, --perms 保持文件权限<br />-o, --owner 保持文件属主信息<br />-g, --group 保持文件属组信息<br />-D, --devices 保持设备文件信息<br />-t, --times 保持文件时间信息<br />-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间<br />-n, --dry-run现实哪些文件将被传输<br />-W, --whole-file 拷贝文件，不进行增量检测<br />-x, --one-file-system 不要跨越文件系统边界<br />-B, --block-size=SIZE 检验算法使用的块尺寸，默认是700字节<br />-e, --rsh=COMMAND 指定替代rsh的shell程序<br />--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息<br />-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件，用来排除那些不希望传输的文件<br />--existing 仅仅更新那些已经存在于DST的文件，而不备份那些新创建的文件<br />--delete 删除那些DST中SRC没有的文件<br />--delete-excluded 同样删除接收端那些被该选项指定排除的文件<br />--delete-after 传输结束以后再删除<br />--ignore-errors 及时出现IO错误也进行删除<br />--max-delete=NUM 最多删除NUM个文件<br />--partial 保留那些因故没有完全传输的文件，以是加快随后的再次传输<br />--force 强制删除目录，即使不为空<br />--numeric-ids 不将数字的用户和组ID匹配为用户名和组名<br />--timeout=TIME IP超时时间，单位为秒<br />-I, --ignore-times 不跳过那些有同样的时间和长度的文件<br />--size-only 当决定是否要备份文件时，仅仅察看文件大小而不考虑文件时间<br />--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口，默认为0<br />-T --temp-dir=DIR 在DIR中创建临时文件<br />--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份<br />-P 等同于 --partial<br />--progress 显示备份过程<br />-z, --compress 对备份的文件在传输时进行压缩处理<br />--exclude=PATTERN 指定排除不需要传输的文件模式<br />--include=PATTERN 指定不排除而需要传输的文件模式<br />--exclude-from=FILE 排除FILE中指定模式的文件<br />--include-from=FILE 不排除FILE指定模式匹配的文件<br />--version 打印版本信息<br />--address 绑定到特定的地址<br />--config=FILE 指定其他的配置文件，不使用默认的rsyncd.conf文件<br />--port=PORT 指定其他的rsync服务端口<br />--blocking-io 对远程shell使用阻塞IO<br />-stats 给出某些文件的传输状态<br />--progress 在传输时现实传输过程<br />--log-format=FORMAT 指定日志文件格式<br />--password-file=FILE 从FILE中得到密码<br />--bwlimit=KBPS 限制I/O带宽，KBytes per second<br />-h, --help 显示帮助信息<br />实例分析<br />这里假设有两台服务器：A和B。其中A是主web服务器，具有域名www.linuxaid.com.cn(202.99.11.120)，B服务器是备 份机，其域名为backup.linuxaid.com.cn(202.99.11.121)。其中A的web内容存放在以下几个地方： /www/和 /home/web_user1/和/home/web_user2/。我们需要在备份机B上建立对这几个目录内容的备份。<br /><br />服务器配置实例<br /><br />那么在www.linuxaid.com.cn上创建rsyncd的配置文件/etc/rsyncd.conf，内容如下：<br /><br />uid = nobody<br />gid = nobody<br />use chroot = no<br />max connections = 4<br />pid file = /var/run/rsyncd.pid<br />lock file = /var/run/rsync.lock<br />log file = /var/log/rsyncd.log<br /><br />[www]<br />path = /www/<br />ignore errors<br />read only = true<br />list = false<br />hosts allow = 202.99.11.121<br />hosts deny = 0.0.0.0/32<br />auth users = backup<br />secrets file = /etc/backserver.pas<br /><br />[web_user1]<br />path = /home/web_user1/<br />ignore errors<br />read only = true<br />list = false<br />hosts allow = 202.99.11.121<br />hosts deny = 0.0.0.0/32<br />uid = web_user1<br />gid = web_user1<br />auth users = backup<br />secrets file = /etc/backserver.pas<br /><br />[web_user2]<br />path = /home/web_user2/<br />ignore errors<br />read only = true<br />list = false<br />hosts allow = 202.99.11.121<br />hosts deny = 0.0.0.0/32<br />uid = web_user2<br />gid = web_user2<br />auth users = backup<br />secrets file = /etc/backserver.pas<br /><br />这里定义有四个三个模块，分别对应于三个需要备份的目录树。这里只允许202.99.11.121备份本机的数据，并且需要认证。三个模块授权的备份用户都为backup，并且用户信息保存在文件/etc/backserver.pas中，其内容如下：<br /><br />backup:bk_passwd<br /><br />并且该文件只能是root用户可读写的，否则rsyncd启动时会出错。这些文件配置完毕以后，就需要在A服务器上启动rsyncd服务器：<br /><br />rsync --daemon<br /><br />客户命令示例<br /><br />/usr/local/bin/rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/ssl.*/" --progress backup@202.99.11.120::www /backup/www/ --password-file=/etc/rsync.pass<br /><br />上面这个命令行中-vzrtopg里的v是verbose，z是压缩，r是recursive，topg都是保持文件原有属性如属主、时间的参数。-- progress是指显示出详细的进度情况，--delete是指如果服务器端删除了这一文件，那么客户端也相应把文件删除，保持真正的一致。-- exclude "logs/" 表示不对/www/logs目录下的文件进行备份。--exclude "conf/ssl.*/"表示不对/www/conf/ssl.*/目录下的文件进行备份。<br /><br />backup@202.99.11.120::www 表示对该命令是对服务器202.99.11.120中的www模块进行备份，backup表示使用backup来对该模块进行备份。<br /><br />--password-file=/etc/rsync.pass来指定密码文件，这样就可以在脚本中使用而无需交互式地输入验证密码了，这里需要注意的是这份密码文件权限属性要设得只有root可读。<br /><br />这里将备份的内容存放在备份机的/backup/www/目录下。<br /><br />[root@linuxaid /]# /usr/local/bin/rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/ssl.*/" --progress backup@202.99.11.120::www /backup/www/ --password-file=/etc/rsync.pass<br />receiving file list ... done<br />./<br />1<br />785 (100%)<br />1.py<br />4086 (100%)<br />2.py<br />10680 (100%)<br />a<br />0 (100%)<br />ip<br />3956 (100%)<br />./<br />wrote 2900 bytes read 145499 bytes 576.34 bytes/sec<br />total size is 2374927 speedup is 45.34<br /><br />对其它两个模块操作的命令分别为：<br /><br />/usr/local/bin/rsync -vzrtopg --delete --progress backup@202.99.11.120::web_user1 /backup/web_user1/ --password-file=/etc/rsync.pass<br /><br />/usr/local/bin/rsync -vzrtopg --delete --progress backup@202.99.11.120::web_user2 /backup/web_user2/ --password-file=/etc/rsync.pass<br /><br />可以将客户命令通过crontab -e命令来实现自动备份，如crontab -e：<br /><br /><br /><br />一些示例脚本<br />这里这些脚本都是rsync网站上的例子：<br /><br />1、每隔七天将数据往中心服务器做增量备份<br /><br />#!/bin/sh<br /><br /># This script does personal backups to a rsync backup server. You will end up<br /># with a 7 day rotating incremental backup. The incrementals will go<br /># into subdirectories named after the day of the week, and the current<br /># full backup goes into a directory called "current"<br /># tridge@linuxcare.com<br /><br /># directory to backup<br />BDIR=/home/$USER<br /><br /># excludes file - this contains a wildcard pattern per line of files to exclude<br />EXCLUDES=$HOME/cron/excludes<br /><br /># the name of the backup machine<br />BSERVER=owl<br /><br /># your password on the backup server<br />export RSYNC_PASSWORD=XXXXXX<br /><br /><br />########################################################################<br /><br />BACKUPDIR=`date +%A`<br />OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES<br />--delete --backup --backup-dir=/$BACKUPDIR -a"<br /><br />export PATH=$PATH:/bin:/usr/bin:/usr/local/bin<br /><br /># the following line clears the last weeks incremental directory<br />[ -d $HOME/emptydir ] || mkdir $HOME/emptydir<br />rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/<br />rmdir $HOME/emptydir<br /><br /># now the actual transfer<br />rsync $OPTS $BDIR $BSERVER::$USER/current<br /><br />2、备份至一个空闲的硬盘<br /><br />#!/bin/sh<br /><br />export PATH=/usr/local/bin:/usr/bin:/bin<br /><br />LIST="rootfs usr data data2"<br /><br />for d in $LIST; do<br />mount /backup/$d<br />rsync -ax --exclude fstab --delete /$d/ /backup/$d/<br />umount /backup/$d<br />done<br /><br />DAY=`date "+%A"`<br /><br />rsync -a --delete /usr/local/apache /data2/backups/$DAY<br />rsync -a --delete /data/solid /data2/backups/$DAY<br /><br />3、对vger.rutgers.edu的cvs树进行镜像<br /><br />#!/bin/bash<br /><br />cd /var/www/cvs/vger/<br />PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin<br /><br />RUN=`lps x | grep rsync | grep -v grep | wc -l`<br />if [ "$RUN" -gt 0 ]; then<br />echo already running<br />exit 1<br />fi<br /><br />rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog<br /><br />sum1=`sum $HOME/ChangeLog`<br />sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`<br /><br />if [ "$sum1" = "$sum2" ]; then<br />echo nothing to do<br />exit 0<br />fi<br /><br />rsync -az --delete --force vger.rutgers.edu::cvs/ /var/www/cvs/vger/<br />exit 0<br /><br />FAQ<br />Q：如何通过ssh进行rsync，而且无须输入密码？<br />A：可以通过以下几个步骤<br /><br />1. 通过ssh-keygen在server A上建立SSH keys，不要指定密码，你会在~/.ssh下看到identity和identity.pub文件<br />2. 在server B上的home目录建立子目录.ssh<br />3. 将A的identity.pub拷贝到server B上<br />4. 将identity.pub加到~[user b]/.ssh/authorized_keys<br />5. 于是server A上的A用户，可通过下面命令以用户B ssh到server B上了<br />e.g. ssh -l userB serverB<br />这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。<br /><br />Q：如何通过在不危害安全的情况下通过防火墙使用rsync?<br />A：解答如下：<br /><br />这通常有两种情况，一种是服务器在防火墙内，一种是服务器在防火墙外。无论哪种情况，通常还是使用ssh，这时最好新建一个备份用户，并且配置 sshd仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内，则最好限定客户端的IP地址，拒绝其它所有连接。如果客户机在防火墙内，则可以简 单允许防火墙打开TCP端口22的ssh外发连接就ok了。<br /><br />Q：我能将更改过或者删除的文件也备份上来吗？<br />A：当然可以：<br /><br />你可以使用如：rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。<br />这样如果源文件:/path/to/some/file.c改变了，那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c，<br />这里这个目录需要自己手工建立起来<br /><br />Q：我需要在防火墙上开放哪些端口以适应rsync？<br />A：视情况而定<br /><br />rsync可以直接通过873端口的tcp连接传文件，也可以通过22端口的ssh来进行文件传递，但你也可以通过下列命令改变它的端口：<br /><br />rsync --port 8730 otherhost::<br />或者<br />rsync -e 'ssh -p 2002' otherhost:<br /><br />Q：我如何通过rsync只复制目录结构，忽略掉文件呢？<br />A：rsync -av --include '*/' --exclude '*' source-dir dest-dir<br /><br />Q：为什么我总会出现"Read-only file system"的错误呢？<br />A：看看是否忘了设"read only = no"了<br /><br />Q：为什么我会出现'@ERROR: invalid gid'的错误呢？<br />A：rsync使用时默认是用uid=nobody;gid=nobody来运行的，如果你的系统不存在nobody组的话，就会出现这样的错误，可以试试gid = nogroup或者其它<br /><br />Q：绑定端口873失败是怎么回事？<br />A：如果你不是以root权限运行这一守护进程的话，因为1024端口以下是特权端口，会出现这样的错误。你可以用--port参数来改变。<br /><br />Q：为什么我认证失败？<br />A：从你的命令行看来：<br /><br />你用的是：<br />>; bash$ rsync -a 144.16.251.213::test test<br />>; Password:<br />>; @ERROR: auth failed on module test<br />>;<br />>; I dont understand this. Can somebody explain as to how to acomplish this.<br />>; All suggestions are welcome.<br /><br />应该是没有以你的用户名登陆导致的问题，试试rsync -a max@144.16.251.213::test test <br /><br /><br /><br />简介<br />对于选择Linux 作为应用平台的的中小型企业或网站来说，往往面临如何实现数据远程备份或者网站镜象的问题，虽然有商业化的备份和镜象产品可供选择，但这些产品的价格往往过于昂贵。因此如何利用自由软件高效实现远程备份和网站镜象就成为一个值得讨论的话题。<br /><br />通过网络进行远程数据备份或者网站镜象的最简单的方法就是使用wget，但是这种方式每次都需要将所有数据都重新在网络上传输一遍，而不考虑哪些文件是经过更新的，因此效率非常低下。尤其在需要备份的数据量很大的时候，往往需要花费数个小时来在网络上进行数据传输。<br /><br />因此这里就介绍一种高效的网络远程备份和镜象工具-rsync，它可以满足绝大多数要求不是特别严格的备份需求。<br /><br />rsync是类unix系统下的数据镜像备份工具，从软件的命名上就可以看出来了——remote sync。它的特性如下：<br /><br />可以镜像保存整个目录树和文件系统。<br />可以很容易做到保持原来文件的权限、时间、软硬链接等等。<br />无须特殊权限即可安装。<br />优化的流程，文件传输效率高。<br />可以使用rcp、ssh等方式来传输文件，当然也可以通过直接的socket连接。<br />支持匿名传输，以方便进行网站镜象。<br />软件下载<br />rysnc的主页地址为：<br /><br />http://rsync.samba.org/<br /><br />目前最新版本为2.4.6。可以选择从原始网站下载：http://rsync.samba.org/ftp/rsync/。也可以选择从本站下载：rsync 2.4.6。<br /><br />编译安装<br />rsync的编译安装非常简单，只需要以下简单的几步：<br /><br />[root@www rsync-2.4.6]# ./configure<br />[root@www rsync-2.4.6]# make<br />[root@www rsync-2.4.6]# make install<br /><br />但是需要注意的是必须在服务器A和B上都安装rsync，其中A服务器上是以服务器模式运行rsync，而B上则以客户端方式运行rsync。这样在web服务器A上运行rsync守护进程，在B上定时运行客户程序来备份web服务器A上需要备份的内容。<br /><br />rsync服务器<br />1、rsync服务器的启动<br /><br />在web服务器A上需要以守护进程方式来启动rsync服务器，只需要运行：<br /><br />[root@www rsync-2.4.6]# /usr/local/bin/rsync --daemon<br /><br />即可启动。rsync默认服务端口为873，服务器在该端口接收客户的匿名或者认证方式的备份请求。<br /><br />如果要在启动时把服务起来，有几种不同的方法，比如：<br /><br />a、加入inetd.conf<br /><br />编辑/etc/services，加入rsync 873/tcp，指定rsync的服务端口是873。编加/etc/inetd.conf，加入rsync stream tcp nowait root /bin/rsync rsync --daemon<br /><br />注：对于xinetd，设置方法类似。<br /><br />b、加入rc.local<br /><br />编辑/etc/rc.d/rc.local，在最后添加：<br /><br />/usr/local/bin/rsync --daemon<br /><br />2、rsync的配置<br /><br />对于rsync服务器来说，最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf，其控制认证、访问、日志记录等等。<br /><br />该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始，直到下一个模块定义开始或者文件结束，模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树，比方说在我们的实例环境中，有三个目录树需要备份：/www/、 /home/web_user1/和/home/web_user2/，那么就需要在配置文件中定义三个模块，分别对应三个目录树。<br /><br />配置文件是行为单位的，也就是每个新行都表示一个新的注释、模块定义或者参数赋值。以#开始的行表示注释，以"\"结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以trure/false表示的布尔值。<br /><br />全局参数<br /><br />在文件中[modlue]之前的所有参数都是全局参数，当然也可以在全局参数部分定义模块参数，这时候该参数的值就是所有模块的默认值。<br /><br />motd file<br /><br />"motd file"参数用来指定一个消息文件，当客户连接服务器时该文件的内容显示给客户，默认是没有motd文件的。<br /><br />log file<br /><br />"log file"指定rsync的日志文件，而不将日志发送给syslog。<br /><br />pid file<br /><br />指定rsync的pid文件。<br /><br />syslog facility<br /><br />指定rsync发送日志消息给syslog时的消息级别，常见的消息级别是：uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。<br /><br />模块参数<br /><br />在全局参数之后就需要定义一个或多个模块了，模块中可以定义以下参数：<br /><br />comment<br /><br />给模块指定一个描述，该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。<br /><br />path<br /><br />指定该模块的供备份的目录树路径，该参数是必须指定的。<br /><br />use chroot<br /><br />如果"use chroot"指定为true，那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护，但是缺 点是需要以roots权限，并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。<br /><br />max connections<br /><br />指定该模块的最大并发连接数量以保护服务器，超过限制的连接请求将被告知随后再试。默认值是0，也就是没有限制。<br /><br />lock file<br /><br />指定支持max connections参数的锁文件，默认值是/var/run/rsyncd.lock。<br /><br />read only<br /><br />该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败，如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。<br /><br />list<br /><br />该选项设定当客户请求可以使用的模块列表时，该模块是否应该被列出。如果设置该选项为false，可以创建隐藏的模块。默认值是true。<br /><br />uid<br /><br />该选项指定当该模块传输文件时守护进程应该具有的uid，配合gid选项使用可以确定哪些可以访问怎么样的文件权限，默认值是"nobody"。<br /><br />gid<br /><br />该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。<br /><br />exlude<br /><br />用来指定多个由空格隔开的多个模式列表，并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式，不过配置文件中指 定的exlude模式不会传递给客户端，而仅仅应用于服务器。一个模块只能指定一个exlude选项，但是可以在模式前面使用"-"和"+"来指定是 exclude还是include。<br /><br />但是需要注意的一点是该选项有一定的安全性问题，客户很有可能绕过exlude列表，如果希望确保特定的文件不能被访问，那就最好结合uid/gid选项一起使用。<br /><br />exlude from<br /><br />指定一个包含exclude模式的定义的文件名，服务器从该文件中读取exlude列表定义。<br /><br />include<br /><br />用来指定多个由空格隔开的多个rsync并应该exlude的模式列表。这等同于在客户端命令中使用--include来指定模式，结合 include和 exlude可以定义复杂的exlude/include规则。一个模块只能指定一个include选项，但是可以在模式前面使用"-"和"+"来指定是 exclude还是include。<br /><br />include from<br /><br />指定一个包含include模式的定义的文件名，服务器从该文件中读取include列表定义。<br /><br />auth users<br /><br />该选项指定由空格或逗号分隔的用户名列表，只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置，那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。<br /><br />secrets file<br /><br />该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时，该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的 secures file名，需要限式指定一个。(例如：/etc/rsyncd.secrets)<br /><br />strict modes<br /><br />该选项指定是否监测密码文件的权限，如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问，其他任何用户不可以访问该文件。默认值为true。<br /><br />hosts allow<br /><br />该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式：<br /><br />o xxx.xxx.xxx.xxx，客户主机只有完全匹配该IP才允许访问。例如：192.167.0.1<br /><br />o a.b.c.d/n，属于该网络的客户都允许连接该模块。例如：192.168.0.0/24<br /><br />o a.b.c.d/e.f.g.h，属于该网络的客户都允许连接该模块。例如：192.168.0.0/255.255.255.0<br /><br />o 一个主机名，客户主机只有拥有该主机名才允许访问，例如：backup.linuxaid.com.cn。<br /><br /><br />o *.linuxaid.com.cn，所有属于该域的主机都允许。<br /><br />默认是允许所有主机连接。<br /><br />hosts deny<br /><br />指定不允许连接rsync服务器的机器，可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。<br /><br />ignore errors<br /><br />指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误，一般来说rsync在出现IO错误时将将跳过--delete操作，以防止因为暂时的资源不足或其它IO错误导致的严重问题。<br /><br />ignore nonreadable<br /><br />指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。<br /><br />transfer logging<br /><br />使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。<br /><br />log format<br /><br />通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串，可以使用的格式定义符如下所示：<br /><br />o %h 远程主机名<br /><br />o %a 远程IP地址<br /><br />o %l 文件长度字符数<br /><br />o %p 该次rsync会话的进程id<br /><br />o %o 操作类型："send"或"recv"<br /><br />o %f 文件名<br /><br />o %P 模块路径<br /><br />o %m 模块名<br /><br />o %t 当前时间<br /><br />o %u 认证的用户名(匿名时是null)<br /><br />o %b 实际传输的字节数<br /><br />o %c 当发送文件时，该字段记录该文件的校验码<br /><br />默认log格式为："%o %h [%a] %m (%u) %f %l"，一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。<br /><br />timeout<br /><br />通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户。超时单位为秒钟，0表示没有超时定义，这也是默认值。对于匿名rsync服务器来说，一个理想的数字是600。<br /><br />refuse options<br /><br />通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名，而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩，应该是："dont compress = *"。<br /><br />dont compress<br /><br />用来指定那些不进行压缩处理再传输的文件，默认值是<br /><br />*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174211#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 17:01:27 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174211</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174211</guid>
      </item>
      <item>
        <title>spring 定时器 例子</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174208" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174208</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          纯粹是运行例子<br /><br /><br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

    &lt;bean id="gneteSettlementService"
        class="com.macaufly.gnete.impl.GneteSettlementImpl">
    &lt;/bean>
    
    &lt;bean id="gneteSettleRunner"
        class="com.macaufly.gnete.impl.GneteSettleRunner">
        &lt;constructor-arg ref="gneteSettlementService">&lt;/constructor-arg>
    &lt;/bean>
   
    &lt;!--定义定时执行gneteSettlementService 这个bean中的loadAndSettle()方法-->
    &lt;bean id="settleTask"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        &lt;property name="targetObject">
            &lt;ref bean="gneteSettleRunner" />
        &lt;/property>
        &lt;property name="targetMethod">
            &lt;value>start&lt;/value>
        &lt;/property>
    &lt;/bean>

    &lt;!--触发器的bean的设置，在这里我们设置了我们要触发的jobDetail是哪个。这里我们定义了要触发的jobDetail是settleTask，即触发器去触发哪个bean..-->
    &lt;bean id="cronTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerBean">
        &lt;property name="jobDetail">
            &lt;ref bean="settleTask" />
        &lt;/property>
        &lt;property name="cronExpression">
            &lt;!-- 关键在配置此表达式：0秒后立即启动-->
            &lt;value>0 * * * * ?&lt;/value>
            &lt;!-- 每日12点执行 -->
            &lt;!-- &lt;value>0 0 12 * * ?&lt;/value> -->
        &lt;/property>
    &lt;/bean>

    &lt;!--管理触发器的总设置,管理我们的触发器列表,可以在bean的list中放置多个触发器。   
    -->
    &lt;bean autowire="no"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        &lt;property name="triggers">
            &lt;list>
                &lt;ref local="cronTrigger" />
            &lt;/list>
        &lt;/property>
    &lt;/bean>
&lt;/beans>

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174208#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 16:55:34 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174208</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174208</guid>
      </item>
      <item>
        <title>Java Architecture for XML Binding (JAXB)</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174207" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174207</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium"><strong>Java Architecture for XML Binding (JAXB)</strong></span><br /><br />http://java.sun.com/developer/technicalArticles/WebServices/jaxb/<br /><br />简单例子：<br /><pre name="code" class="java">
             InputStream inputStream = TerminalServiceImpl.class.getResourceAsStream("Product.xml");
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            StringBuffer XML = new StringBuffer();
            String temp = "";
            while ((temp = reader.readLine()) != null) {
                XML.append(temp.trim());
            }

            JAXBContext context = JAXBContext.newInstance(ProducerInfo.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();

            DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder db = builderFactory.newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(XML.toString()));
            Document document = db.parse(is);

            Element element = document.getDocumentElement();
            NodeList nodeList = element.getChildNodes();
            for (int i = 0; i &lt; nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                ProducerInfo producerInfo = (ProducerInfo) unmarshaller
                        .unmarshal(node);
             }

xml:
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;Producers>

    &lt;ProducerInfo>
        &lt;producerId>JinDu&lt;/producerId>
        &lt;producerName>金都酒店&lt;/producerName>
        &lt;producerAddress>澳門南灣大馬路時代商業中心&lt;/producerAddress>
        &lt;tel>(853)326888&lt;/tel>
        &lt;ProductInfo>
            &lt;name>金都酒店娱乐券&lt;/name>
            &lt;content>在本机上人民币兑换港币的汇率为 100:99&lt;/content>
            &lt;price>10000.00&lt;/price>
            &lt;totalPrice>0.10&lt;/totalPrice>
            &lt;picture>JinDou_10000.gif&lt;/picture>
        &lt;/ProductInfo>
        &lt;ProductInfo>
            &lt;name>金都酒店娱乐券&lt;/name>
            &lt;content>在本机上人民币兑换港币的汇率为 100:99&lt;/content>
            &lt;price>30000.00&lt;/price>
            &lt;totalPrice>0.30&lt;/totalPrice>
            &lt;picture>JinDou_30000.gif&lt;/picture>
        &lt;/ProductInfo>
    &lt;/ProducerInfo>
&lt;Producers>

ProducerInfo 类：
@XmlAccessorType(AccessType.FIELD)
@XmlRootElement(name = "ProducerInfo")
public class ProducerInfo {
    @XmlElement(name = "ProductInfo")
    private List&lt;ProductInfo> products;
    //other property miss....
}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiangyongyuan.javaeye.com/blog/174207#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 16:53:17 +0800</pubDate>
        <link>http://jiangyongyuan.javaeye.com/blog/174207</link>
        <guid>http://jiangyongyuan.javaeye.com/blog/174207</guid>
      </item>
      <item>
        <title>Apache + Tomcat 的群集配置</title>
        <author>yongyuan.jiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiangyongyuan.javaeye.com">yongyuan.jiang</a>&nbsp;
          链接：<a href="http://jiangyongyuan.javaeye.com/blog/174206" style="color:red;">http://jiangyongyuan.javaeye.com/blog/174206</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Apache + Tomcat 的群集配置<br /><br />(文档编写: 刁超雄   2007-9-5)<br /><br /><br /><br />使用群集和负载均衡的整体架构如下： <br /><br /><br /><br /><br />(图片来自:onjava.com) <br /><br />中间由一台服务器做负载均衡（Load Balancer），它将所有请求，根据一定的负载均衡规则发送给指定的群集服务器（Cluster），群集服务器拥有着相同的状态和相同的应用程序，并且他们的Session是相互复制的，这样，不管访问哪台服务器都具有相同的结果，即使一台服务器崩溃掉以后，可以由其他集群服务器继续负责应用程序的运行。 <br /><br /><br /><br />Tomcat中如何配置群集,我们假设有如下场景，一台负载均衡服务器负责请求的均衡，群集服务器A和群集服务器B组成一个群集，当某个群集服务器崩溃后，另外一台继续负责应用程序的运行。 <br /><br />一．配置Tomcat5.5.12群集服务器A <br /><br />修改Tomcat配置文件server.xml <br /><br />1．群集服务器A的端口号与B不冲突，即使Server Port,Connector,Coyote/JK2 AJP Connector的端口号唯一 <br /><br />2．在Host元素下增加以下内容： <br /><br />&lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" <br /><br />                managerClassName="org.apache.catalina.cluster.session.DeltaManager" <br /><br />                expireSessi <br /><br />                useDirtyFlag="true" <br /><br />                notifyListeners> <br /><br />                 &lt;!--每个群集服务器都需要有相同的Membership配置. 一个广播地址决定一个Tomcat 群集,群集中的Tomcat服务器必须能从同一个广播地址中接收广播信息--> <br /><br />           &lt;Membership <br /><br />               className="org.apache.catalina.cluster.mcast.McastService" <br /><br />               mcastAddr="228.0.0.4" <br /><br />               mcastPort="45564" <br /><br />               mcastFrequency="500" <br /><br />               mcastDropTime="3000"/> <br /><br />          &lt;!--tcpListenAddress：本机IP地址服务器将此地址广播给其他群集服务器--> <br /><br />           &lt;Receiver <br /><br />               className="org.apache.catalina.cluster.tcp.ReplicationListener" <br /><br />               tcpListenAddress="10.1.2.161" <br /><br />               tcpListenPort="4001" <br /><br />               tcpSelectorTimeout="100" <br /><br />               tcpThreadCount="6"/> <br /><br /><br /><br />           &lt;Sender                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" <br /><br />               replicati <br /><br />               ackTimeout="15000" <br /><br />               waitForAck="true"/> <br /><br /><br /><br />           &lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"         filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <br /><br /><br /><br />           &lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer" <br /><br />                     tempDir="/tmp/war-temp/" <br /><br />                     deployDir="/tmp/war-deploy/" <br /><br />                     watchDir="/tmp/war-listen/" <br /><br />                     watchEnabled="false"/> <br /><br /><br /><br />           &lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/> <br /><br />       &lt;/Cluster> <br /><br /><br /><br />3．修改Web应用程序配置文件web.xml <br /><br />在web.xml文件中&lt;web-app>元素下增加以下内容： <br /><br />&lt;!--此应用将与群集服务器复制Session--> <br /><br />    &lt;distributable/> <br /><br /><br /><br />二． 配置Tomcat5.5.12群集服务器B <br /><br />与群集服务器A配置基本相同，唯一不同的地方就是server.xml文件中 <br /><br />&lt;Receiver <br /><br />               className="org.apache.catalina.cluster.tcp.ReplicationListener" <br /><br />               tcpListenAddress="10.10.13.145" <br /><br />               tcpListenPort="4002" <br /><br />               tcpSelectorTimeout="100" <br /><br />               tcpThreadCount="6"/> <br /><br />tcpListenAddress应为本机地址，如果两台群集服务器在一台机器上，则端口号要不同 <br /><br />注意：B的其他端口不要与A冲突。 <br /><br /><br /><br />三．          群集服务器具体配置结果 <br /><br />  <br /><br />Mcast*用于广播，所有群集服务器需要填写相同的配置 <br /><br />tcpListen*本机的IP，群集服务器启动时，会将自己的IP和端口号广播出去，其他群集服务器收到后，响应广播发出者。 <br /><br /><br /><br />四．测试群集 <br /><br />启动群集服务器A，再启动群集服务器B会显示群集服务器的信息，表示群集服务器配置成功 <br /><br />五． 配置负载均衡服务器Apache2.2.3 <br /><br />现在虽然群集已经有了相同的状态，但需要不同的IP地址才能访问到服务器A与B，现在我们配置一台负载均衡服务器来实现统一的入口访问，和负载的均衡。 <br /><br />下载Apache服务器2.2.4 ( http://httpd.apache.org/download.cgi )<br /><br />{可以参考文档 http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html<br /><br /> 对apache服务器安装和配置}<br /><br />修改conf/httpd.conf文件 <br /><br />将以下Module的注释去掉 <br /><br />LoadModule proxy_module modules/mod_proxy.so <br /><br />LoadModule proxy_balancer_module modules/mod_proxy_balancer.so <br /><br />LoadModule proxy_http_module modules/mod_proxy_http.so <br /><br /><br /><br />并增加以下元素 <br /><br />ProxyRequests Off <br /><br /><br /><br />ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On <br /><br />&lt;Proxy balancer://mycluster> <br /><br />BalancerMember http://10.10.13.145:9080/helloworld <br /><br />BalancerMember http://10.10.13.145:10080/helloworld  smax=1 loadfactor=20 <br /><br />&lt;/Proxy> <br /><br /><br /><br /><br /><br />&lt;Location /balancer-manager> <br /><br />SetHandler balancer-manager <br /><br /><br /><br />Order Deny,Allow <br /><br />Deny from all <br /><br />Allow from all <br /><br />&lt;/Location> <br /><br /><br /><br />&lt;Location /server-status> <br /><br />SetHandler server-status <br /><br /><br /><br />Order Deny,Allow <br /><br />Deny from all <br /><br />Allow from all <br /><br />&lt;/Location> <br /><br /><br /><br />其中 <br /><br />ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On <br /><br />&lt;Proxy balancer://mycluster> <br /><br />BalancerMember http://10.10.13.145:9080/helloworld <br /><br />BalancerMember http://10.10.13.145:10080/helloworld  smax=1 loadfactor=20 <br /><br />&lt;/Proxy> <br /><br />ProxyPass为代理转发的Url,即将所有访问/helloworld的请求转发到群集balancer://mycluster <br /><br />BalancerMember为群集的成员，即群集服务器A或B，负载均衡服务器会根据均衡规则来将请求转发给BalancerMember。 <br /><br />(可以同时配置几个站点) <br /><br /><br /><br />配置好后，启动Apahce服务器，访问localhost/hellworld就会看到群集服务器中应用返回的结果。恭喜你，负载均衡和群集已经配置成功了。<br /><br />-à 如果Apache 无法启动,或许可以通过设置尝试解决:<br /><br />1.网上邻居 >> 本地连接 >>属性 >> internet协议(TCP/IP) >> 属性  >>  高级  >>  wins标签  >>  去掉启用LMhosts查询前的勾.<br /><br />参考: Apache Cluster配置文件httpd.conf<br /><br />…….<br /><br />……<br /><br />LoadModule proxy_module modules/mod_proxy.so<br /><br />#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so<br /><br /><br /><br />LoadModule proxy_balancer_module modules/mod_proxy_balancer.so<br /><br />#LoadModule proxy_connect_module modules/mod_proxy_connect.so<br /><br /><br /><br />LoadModule proxy_http_module modules/mod_proxy_http.so<br /><br />#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so<br /><br /><br /><br />LoadModule negotiation_module modules/mod_negotiation.so<br /><br />#LoadModule rewrite_module modules/mod_rewrite.so<br /><br /><br /><br />ProxyRequests Off<br /><br /><br /><br />#设定第一个域名的群集<br /><br />ProxyPass /NewWebDesign balancer://mycluster stickysession=jsessionid nofailover=On<br /><br />&lt;Proxy balancer://mycluster><br /><br />    BalancerMember http://10.1.2.193:8088/NewWebDesign<br /><br />    #BalancerMember http://10.1.2.117:8088/NewWebDesign<br /><br />    BalancerMember http://10.1.2.161:8080/NewWebDesign<br /><br />    BalancerMember http://10.1.2.161:8088/NewWebDesign smax=1 loadfactor=20<br /><br />&lt;/Proxy><br /><br /><br /><br />#设定第二个域名的群集<br /><br />ProxyPass /students balancer://studentscluster stickysession=jsessionid nofailover=On<br /><br />&lt;Proxy balancer://studentscluster><br /><br />    BalancerMember http://10.1.2.193:8088/students<br /><br />    #BalancerMember http://10.1.2.117:8088/students <br /><br />    BalancerMember http://10.1.2.161:8080/students <br /><br />    BalancerMember http://10.1.2.161:8088/students  smax=1 loadfactor=20<br /><br />&lt;/Proxy><br /><br /><br /><br />#设定第三个域名的群集<br /><br />ProxyPass /gwt balancer://gwtcluster stickysession=jsessionid nofailover=On<br /><br />&lt;Proxy balancer://gwtcluster><br /><br />    BalancerMember http://10.1.2.193:8088/gwt <br /><br />    #Ba