<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>shallon</title>
    <description></description>
    <link>http://shallon.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>CLASSLOADER与类的依赖关系</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/180270" style="color:red;">http://shallon.javaeye.com/blog/180270</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          起因：为了排查一个生产环境的问题，需要打印特殊的调试日志。能否做到通过配置，调试的类优先于原有类的载入，回退的时候修改配置即可？<br /><br />一般的情况下：可以将 CLASSPATH设置成：/opt/lib/debug.jar:/opt/lib/c.jar的时候debug.jar的类优先于c.jar的载入，调试类生效和打印调试日志。CLASSPATH设置成：/opt/lib/c.jar则还原回正式的类。<br /><br />在多层ClassLoader的情况下，调试类放在ClassPath路径中，c.jar放在子ClassLoader加载路径中，却出了“意外”。为了说明情况，做了一个测试项目。系统载入结构如下：<br /><img src="http://photo11.hexun.com/p/2008/0407/186182/b_C97D09CF3DE8769FD43A591ED4309A56.jpg" /><br /><br />被载入类Container和Item，Item是Container的成员类<br /><br /><pre name="code" class="java">
public class Container {
	private Item item=null;
	public Container(){
		println();
		this.item=new Item();
		
	}
	public void println(){
		System.out.println("Container:"+this.getClass().getClassLoader());
	}
}
public class Item {
public Item(){
	println();
}
public void println(){
	System.out.println("Item:"+this.getClass().getClassLoader());
}
}
</pre><br />载入类为StartServer，其关键的载入代码如下：<br /><pre name="code" class="java">
private void start() {
        try {
        	System.out.println("***************************");
            // Load up the bootstrap container
            final ClassLoader parent = findParentClassLoader();

            String libDirString = System.getProperty("load_dir");

            File libDir;
            if (libDirString != null) {
                libDir = new File(libDirString);
                if (!libDir.exists()) {
                    throw new NullPointerException("dir not exit");
                }
            }
            else {
            		throw new NullPointerException("dir not exit");
            }

            System.out.println("parent is:"+parent.getClass());
            ClassLoader loader = new MYClassLoader(parent, libDir);
            
            Thread.currentThread().setContextClassLoader(loader);
            Class containerClass = loader.loadClass(
                    "Container");
            containerClass.newInstance();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
}

</pre><br /><br />测试结果：<br /><br />1、Class Item放在AppClassLoader载入，Class Container放在MYClassLoader载入 上述载入正常运行。<br />E:\javaproject\ws2007\tempProject\bin>java -Dload_dir=E:/javaproject/ws2007/tempProject -cp . StartServer<br />***************************<br />parent is:class sun.misc.Launcher$AppClassLoader<br />file:/E:/javaproject/ws2007/tempProject/c.jar<br />Container:MYClassLoader@61de33<br />Item:sun.misc.Launcher$AppClassLoader@19821f<br /><br /><br /><br />测试结果：2、Class Container放在AppClassLoader载入，Class Item放在MYClassLoader载入  出现NoClassDefFoundError错误<br />E:\javaproject\ws2007\tempProject\bin>java -Dload_dir=E:/javaproject/ws2007/tempProject -cp . StartServer<br />***************************<br />parent is:class sun.misc.Launcher$AppClassLoader<br />file:/E:/javaproject/ws2007/tempProject/c.jar<br />Container:sun.misc.Launcher$AppClassLoader@19821f<br />Exception in thread "main" java.lang.NoClassDefFoundError: Item<br />        at Container.&lt;init>(Container.java:6)<br />        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)<br />        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)<br />        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)<br />        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)<br />        at java.lang.Class.newInstance0(Class.java:355)<br />        at java.lang.Class.newInstance(Class.java:308)<br />        at StartServer.start(StartServer.java:48)<br />        at StartServer.main(StartServer.java:18)<br /><br />分析：<br />根据大名鼎鼎的类加载委托规则，ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时，ClassLoader 实例会在试图亲自查找类或资源之前，将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器（称为 "bootstrap class loader"）本身没有父类加载器，但是可以将它用作 ClassLoader 实例的父类加载器。<br /><br />由于子ClassLoader含有父ClassLoader的引用，并且可以将委托父ClassLoader搜索类和资源，反之则不行。于是在上述第二个测试中，MYClassLoader被显式加载Container，MYClassLoader委托AppClassLoader进行加载该类，AppClassLoader加载Container的时候发现无法加载Item类，其父ClassLoader是ExtClassLoader和Bootstrap ClassLoader当然也无法加载Item类，  因为Item仅出现在MYClassLoader的加载路径中，因而出错。<br /><br />结论：<br /><br />父ClassLoader与子ClassLoader加载的类必须有正确的依赖关系，子ClassLoader加载的类可以依赖饮用父ClassLoader加载的类，反之不行，如果需要将一个类移动上父ClassLoader加载则需要将该类依赖的所有类移到同一ClassLoader或者移动到更高层的ClassLoader。<br /><br />另外，在测试过程中，中了-jar的招，以此纪念。一个可执行的 JAR 必须通过 menifest 文件的头引用它所需要的所有其他从属 JAR。如果使用了 -jar 选项，那么环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略。 （http://www-128.ibm.com/developerworks/cn/java/j-jar/index.html）
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/180270#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Apr 2008 20:59:16 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/180270</link>
        <guid>http://shallon.javaeye.com/blog/180270</guid>
      </item>
      <item>
        <title>SAAS在电子商务中的应用分析</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/178156" style="color:red;">http://shallon.javaeye.com/blog/178156</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          根据维基百科对SAAS的描述：<br />1、	SAAS是一种软件的交付模型。SAAS不向用户交付最终的软件产品，软件作为用户使用的服务而存在。<br />2、	SAAS的软件所有权属于软件提供商。软件提供商负责维护系统的正常运行。<br />3、	用户通过互联网使用软件，并支付软件的使用费用。<br /><br />下面是假设SAAS普及后电子商务的一个使用案例设想：<br /><br />假设我是一个准备网上开店老板，手上最有价值的资源是货源和客户，网上开店意味着营销渠道都是通过互联网进行，为了建立这个网上店铺，要建立与互联网客户沟通的途径，打通入货、出售、支付、送货的各个环节。为了让网上的店铺能够运作，我需要下面的系统：<br /><br />a)	租用一个网站网站或者说是网络产品展台，展示各种产品的图片、说明、及价格列表。（SAAS模式）<br />b)	网络广告途径，可能包括在购买搜索引擎、互联网门户购买广告；<br />c)	租用带域名的企业电子邮件系统及群发电子邮件系统用作营销沟通和客户关怀（SAAS模式）。<br />d)	租用网上订货及配货/出货管理系统（SAAS模式）。<br />e)	租用基于IM的在线客服系统，和用户实时沟通订单及送货的情况（SAAS模式）<br />f)	租用受网民信任的支付服务（SAAS模式）<br />g)	使用全球速递服务（传统运作模式）<br /><br />透过SAAS，可以以少量的启动资金，快速建立网上商铺的门户。不需要雇佣专门的IT人才和部门，只需要专注于产品、营销等领域。各地合作伙伴和异地雇员可以通过网上商铺的门户协同工作。因此，商铺的店主获得了以往大公司才能有的商业机会。<br /><br />SAAS的应用过程中，国人最关心的是数据安全的问题。下面就这个安全的问题进行分析。<br />1、	软件服务提供商必须有配套的技术上安全机制防止用户信息被盗。<br />2、	软件服务提供商将必须有信誉和行业威望，能够经营网络平台的公司。并且应有相关的立法保证。<br />3、	有人认为软件服务提供商内部人员很可能盗取数据，家贼难防。企业自建系统也存在家贼难防的情况，软件服务提供商的作为专业的服务提供商，安全上可以做得更加到位。<br />4、	电子商务面向长尾理论中海量的中小客户，这些中小客户即便是自建IT系统也不大可能花费更多的资源在监控病毒、防御黑客侵入、防止非法数据监听、可靠的数据备份等繁重的IT工作。<br />5、	类比于人们通常使用的服务，人们是否担心自己和朋友的通话被监控？人们是否担心电子邮件被监控？实际上都是有可能的，但是大多数人不需要担心。
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/178156#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 18:44:30 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/178156</link>
        <guid>http://shallon.javaeye.com/blog/178156</guid>
      </item>
      <item>
        <title>这一次，我们需要跨平台通用远程调用框架的神话么？</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/175214" style="color:red;">http://shallon.javaeye.com/blog/175214</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这一次，我们需要跨平台通用远程调用框架的神话么？</p><p>&nbsp;</p><p>事情起因是开发各方讨论系统中的两种接口</p><p>&nbsp;</p><p>接口基本需求：1、用户数据的同步接口 2、业务接口，包含客户端对服务器端的控制接口和服务器端对客户端的实时状态汇报接口。</p><p><br />接口非功能性需求：跨平台，第二类接口中客户端可能在企业内网，要求穿越防火墙、NAT、并且可能没有外部IP。</p><p>&nbsp;</p><p>拿到这样的一个需求，HTTP基本的通信协议基本是必选，对上层应用协议，大家首先想到的都是SOAP。于是有了下面的解决方案：</p><p>&nbsp;</p><p>1、&nbsp;对第一类接口定义了SOAP接口，并对用户属性的变化进行了预计设计。接口类似如下update(propertyList list)，propertyList定义为KEY/Value的值对。好处如下是客户端和服务器端与服务器端之间只保存一个WSDL文件，在用户数据发生变化的时候，该接口不用发生变化。</p><p><br />2、&nbsp;第二类接口不能直接使用SOAP，并且服务器端到客户端的状态推送需要使用HTTP推的技术。有人提出了定义一个XML SCHEMA，该SCHEMA描述的接口如FuncName（param1,param2,param3&hellip;&hellip;）来作为第二类接口，好处是：任何业务相关的控制状态信息都可以通过该接口通信，客户端与服务器端之间只维护一份XML SCHEMA</p><p>&nbsp;</p><p>上述方案中，第一类接口和第二类接口是类似的思路，都是定义一个通用的远程调用函数接口，并且从远程调用的角度去分析其优缺点。在这些冠冕堂皇的优点后面大家都甘之如饴，以为跨平台通用远程调用框架发挥了化腐朽为神奇的作用。然而恕我直言，消息传输就是消息传输，面向消息的通信方式可以解决的问题，完全没有必要扯上远程过程调用，在上述的场合直接的HTTP+业务数据已经可以很简洁的解决问题。由于第二类接口中打算自造轮子实现通用远程调用框架，和用SOAP实现没有本质的区别，归作一类进行分析：</p><p>&nbsp;</p><p>1、&nbsp;如果把HTTP+XML业务消息的通信方式描述成函数Post（XML DATA），update(propertyList list)这种接口和Post（XML DATA）一样都具有下面的特性：</p><p><br />a)&nbsp;接口也很稳定<br />b)&nbsp;任何业务数据都能通过，当然任何数据都可以通过。</p><p>&nbsp;</p><p>通用的通信协议原本就具有通用远程过程调用接口梦寐以求的特性。</p><p>&nbsp;</p><p>2、&nbsp;通用远程调用框架下的通信消息的消息结构可以是HTTP+基于XML通用远程调用层+业务消息的结构。比起HTTP+XML的通信方式多了一个基于XML通用远程调用层，这层的实现可以使用SOAP类库，但是由于定义成通用的SOAP接口并只有一个WSDL文件，消息只能分发到一个函数入口，虽然添加了庞大的SOAP处理引擎，但无法利用现成的SOAP类库将请求分发到后端的各个不同业务处理函数，因此这种模式下仍然必须手工实现对消息的分发。而在HTTP+XML的方式中，也需要分发机制，然而却简洁很多。可以说，由于平白无故增加了基于XML通用远程调用层增加了性能消耗和处理复杂度，无比辛苦的把XML消息映射成具体平台相关的数据结构（这个映射耗费性能并且带来互操作性的问题）之后，还是需要做消息的分发，起点并没有比HTTP+XML高。<br />&nbsp;</p><p><img src="http://photo11.hexun.com/p/2008/0323/180712/b_700AB851EE472093F3837B4D07A5D50F.jpg" border="0" height="320" alt="两种通信模式的比较" width="500" />&nbsp;</p><p>&nbsp;</p><p><br />3、&nbsp;一个WSDL文件能够适应所有情况的&ldquo;银弹&rdquo;。</p><p><br />WSDL文件本意是定义客户端与服务器端的消息约束文件。换成了通用的WSDL文件之后，WSDL文件无法告知服务器端能接收什么样的消息。例如update(propertyList list)，propertyList定义为KEY/Value的值对。这种接口客户端看了WSDL文件其实还是不知道服务器端能接收什么样的消息，它能接收什么的KEY NAME？每个KEY对应的Value是什么类型的数据？这一部分的信息接口完全没有涉及。因此仍然需要一个约束的文档描述具体的业务消息约束，在非通用的远程过程调用的场合，这个业务消息约束是WSDL，在HTTP+XML通信中，则可以定义成普通的XMLSCHEMA。</p><p>&nbsp;</p><p>面向操作的开发模式中WSDL和具体语言的具体操作接口绑死，导致修改WSDL需要重新使用工具导出具体语言的接口。这个是SOAP实现的远程过程调用本身带来的问题，面向消息的处理机制中则从来没有这方面的问题。</p><p>&nbsp;</p><p>&nbsp;</p><p>4、&nbsp;其他优缺点比较<br />a)&nbsp;通用远程过程调用通信框架如果用SOAP实现则引入SOAP在不同平台下的互操作性的问题。为了最大限度的避免互操作性的问题，必须遵守WebService Base Profile 1.x系列标准，但是仍然不是彻底解决SOAP的互操作性问题。</p><p>&nbsp;</p><p>b)&nbsp;通用远程过程调用通信框架如果用SOAP实现则通信协议实际上是绑死了HTTP。上述第一类接口其实含有一个隐含的架构需求，数据的批量处理，和减少服务器之间的连接数。HTTP+XML业务数据的通信方式其实很容易移植到UDP+XML业务数据、TCP+XML业务数据和FTP+XML业务数据文件等批量数据快捷处理方式。SOAP协议虽然号称设计上预计在不同传输协议上传输，应用上却没有见过其他协议上成功应用。</p><p><br />c)&nbsp;HTTP+XML业务消息模式中XML处理实现上可以更灵活，XML数据处理可以使用通用的XML引擎，也可以在每个业务方法中使用XML PULL机制加速XML数据处理速度，XML PULL 资料可以参见<a href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/">http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/</a>。</p><p>&nbsp;</p><p>d)HTTP+XML业务消息中可以多个XML业务消息放到同一个HTTP请求中，减少连接数和通信量，而在通用的WSDL方案中，多个数据放到同一个HTTP消息中则导致一个庞大的XML消息，庞大的XML消息处理在还原成内存中的数据结构的时候很可能有占用太大的缓存的问题。</p>
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/175214#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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Mar 2008 22:46:35 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/175214</link>
        <guid>http://shallon.javaeye.com/blog/175214</guid>
      </item>
      <item>
        <title>SOAP中 RPC/ENC 为什么被抛弃？</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/145061" style="color:red;">http://shallon.javaeye.com/blog/145061</a>&nbsp;
          发表时间: 2007年11月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><span lang="EN-US">1、SOAP</span><span style="font-family: 宋体;">数据传输样式介绍</span></h3>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">SOAP </span><span style="font-family: 宋体;">规范中</span><span lang="EN-US">style</span><span style="font-family: 宋体;">与</span><span lang="EN-US">use</span><span style="font-family: 宋体;">这两个属性决定</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">数据的编码样式。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">style</span><span style="font-family: 宋体;">属性可是两个值中的一个：</span><span lang="EN-US"> rpc </span><span style="font-family: 宋体;">或</span><span lang="EN-US"> document </span><span style="font-family: 宋体;">。当属性被设定为文档样式时，客户端使用</span><span lang="EN-US"> XML </span><span style="font-family: 宋体;">模式调用约定；当属性设置成</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">，客户端使用远程过程调用约定。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><br />
<span style="font-family: 宋体;"></span></p>
1)RPC Stype指定包含Web服务调用的XML节点，该节点以Web服务调用方法命名，XML节点依次包含方法调用的各个参数。<br />
<br />
<br />
2)Document Style指定内直接包含消息，该消息没有SOAP格式限制。服务器的应用层负责将XML文档映射成内存对象（参数、方法调用等等）。<br />
<br />
Use属性值决定消息的编码方式：可以是encoded或者是 literal。<br />
<br />
1)encoded值表示XML的消息使用类型属性引用抽象数据类型，使用Section 5编码（SOAP规范第五章定义的编码）进行xml的序列化和反序列化。<br />
<br />
2) Literal值表示XML的消息使用类型属性或者Element元素引用具体的Schema定义，也就是说，根据具体的Schema将内存对象序列化成XML消息。<br />
<br />
Style和Use的值进行组合，SOAP可以有四种编码样式，比较常用的如下：<br />
<br />
1) RPC/Encoded编码，使用SOAP编码，也称为 Section 5 编码，它由 SOAP 1.1 规范定义。<br />
<br />
2) Document/literal编码。<br />
<br />
3) RPC/literal编码，它使用 RPC 方法进行调用但使用 XML 自制的方法编入数据。<br />
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;"></span></p>
<p class="MsoNormal" style="margin-left: 21pt;"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">第一种</span><span lang="EN-US">RPC/Encoded</span><span style="font-family: 宋体;">曾在</span><span lang="EN-US">JAVA</span><span style="font-family: 宋体;">开发中应用非常广泛；第二种编码样式是</span><span lang="EN-US">DOT NET</span><span style="font-family: 宋体;">开发社区使用的缺省编码方式；第三种编码样式是第一种和第二种编码方式的混合，使用</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">的方式传送文档型数据。最近几年</span><span lang="EN-US">RPC/Encoded</span><span style="font-family: 宋体;">遭受了不少质疑和反对声浪。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">在</span><span lang="EN-US">WS-I </span><span style="font-family: 宋体;">基本概要</span><span lang="EN-US">1.1</span><span style="font-family: 宋体;">（</span><span lang="EN-US">WS-I Basic Profile Version 1.1</span><span style="font-family: 宋体;">）中，已经禁止使用这种编码样式。</span><span lang="EN-US">WS-I </span><span style="font-family: 宋体;">基本概要</span><span lang="EN-US">1.1</span><span style="font-family: 宋体;">要求使用</span><span lang="EN-US"> WSDL SOAP </span><span style="font-family: 宋体;">绑定的</span><span lang="EN-US"> RPC/literal </span><span style="font-family: 宋体;">或</span><span lang="EN-US"> Document/literal</span><span style="font-family: 宋体;">形式。</span><span lang="EN-US">WS-I </span><span style="font-family: 宋体;">基本概要禁止对</span><span lang="EN-US"> soap:Envelope </span><span style="font-family: 宋体;">或派生的</span><span lang="EN-US"> soap:Body </span><span style="font-family: 宋体;">元素使用</span><span lang="EN-US"> soap:encodingStyle </span><span style="font-family: 宋体;">属性。因此，</span><span lang="EN-US"> RPC/literal </span><span style="font-family: 宋体;">和</span><span lang="EN-US"> Document/literal </span><span style="font-family: 宋体;">是</span><span lang="EN-US"> WS-I </span><span style="font-family: 宋体;">标准唯一支持的</span><span lang="EN-US"> 2 </span><span style="font-family: 宋体;">种格式。引用原文如下：</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt;"><span class="statement-id"><span lang="EN-US"></span></span><strong><span lang="EN-US">R1007 An ENVELOPE described in an rpc-literal binding MUST NOT contain </span><code><span lang="EN-US" style="font-size: 12pt;">soap:encodingStyle</span></code><span lang="EN-US"> attribute on any element that is a grandchild of </span><code><span lang="EN-US" style="font-size: 12pt;">soap:Body</span></code></strong><span lang="EN-US"><strong>.</strong> </span></p>
<p class="MsoNormal" style="margin-left: 21pt;"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">为什么</span><span lang="EN-US">RPC/Encoded</span><span style="font-family: 宋体;">被抛弃？</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="font-family: 宋体;"></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;">  </p>
<h3><span lang="EN-US">2、RPC/Encoded</span><span style="font-family: 宋体;">的问题。</span></h3>
<p class="MsoNormal"><span lang="EN-US"><span style="">       </span></span><span style="font-family: 宋体;">在</span><span lang="EN-US">RPC/Encoded</span><span style="font-family: 宋体;">中，</span><span lang="EN-US">SOAP </span><span style="font-family: 宋体;">编码定义了一系列的编码规则，方便了从</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">数据模型到</span><span lang="EN-US"> XML </span><span style="font-family: 宋体;">的映射。编码规则非常灵活并支持图形数据和多态的表示，而</span><em><span lang="EN-US">Document/literal</span></em><span style="font-family: 宋体;">依赖于自然树结构来表示数据对象。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">    在</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">编码中，使用</span><span lang="EN-US">SOAP </span><span style="font-family: 宋体;">编码规则的多引用，引用可以很简单地表示，因此，循环引用如果采用</span><span lang="EN-US"> SOAP </span><span style="font-family: 宋体;">编码作为消息绑定，可以表达一个循环的对象图。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><img src="http://shallon.javaeye.com/upload/picture/pic/6367/af437270-8da6-4fce-96b5-e2956f7a677f.jpg" alt="" /><br />
</span><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">在</span><span lang="EN-US">DOC/LIT</span><span style="font-family: 宋体;">中，方法基于</span><span lang="EN-US"> XML </span><span style="font-family: 宋体;">脚本定义了消息类型作为固定类型。</span><span lang="EN-US">XML </span><span style="font-family: 宋体;">脚本利用</span><span lang="EN-US"> XSD </span><span style="font-family: 宋体;">基本类型作为叶子节点来表示自然树结构，一个循环对象图不能够转换为树结构。因此对象的引用必须在每一处对象引用中重复定义对象。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;"><img src="http://shallon.javaeye.com/upload/picture/pic/6368/4c9b9a44-b489-4382-b92f-cdc75fff7d23.jpg" alt="" /><br />
</span></p>
<br />
<p class="MsoNormal"><span style="font-family: 宋体;">    从上面的分析看来，无疑是</span><span lang="EN-US">RPC/Encoded</span><span style="font-family: 宋体;">更加有吸引力，事实上，很长一段时间来大部分</span><span lang="EN-US"> J2EE Web </span><span style="font-family: 宋体;">服务缺省采用</span><span lang="EN-US"> RPC/encoded </span><span style="font-family: 宋体;">方式。然而</span><span lang="EN-US">WS-I </span><span style="font-family: 宋体;">基本概要（</span><span lang="EN-US">WS-I Basic Profile</span><span style="font-family: 宋体;">）为何抛弃这种编码样式呢？</span></p>
在同一平台下SOAP 消息的编写者和阅读者具有同步的存根来理解编码的 SOAP 消息，此时RPC/encoded无疑是易用。但是对于跨平台的使用场合，多引用访问器编码在 XSD 中难以表达，在不同的平台之间的实现有些细微的不同，带来了跨平台互操作性的问题。当反序列化XML消息的时候，SOAP协议栈会碰到WSDL中没有定义的多引用访问器，此时的处理每种平台每种类库都有所不同。<br />
RPC/encoded 模型使用 SOAP 编码规则来表述抽象 SOAP 数据模型，依赖厂商的 SOAP 库来提供抽象数据模型的具体实现。
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">当然这个不是程序员考虑的问题，各种</span><span lang="EN-US">WebService</span><span style="font-family: 宋体;">开发工具包屏蔽了</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">编码方案的细节，呈现给程序员的，是面向接口编程熟悉的领域，然而却带来了处理的复杂性。有性能测试文章表明，</span><span lang="EN-US">RPC/ENC</span><span style="font-family: 宋体;">的样式实现的远程调用性能不佳，特别是随着</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">消息</span><span lang="EN-US">payload</span><span style="font-family: 宋体;">的增大性能非线性下降，而</span><span lang="EN-US">DOC/LIT</span><span style="font-family: 宋体;">则能保持线性下降。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">比起</span><span lang="EN-US">DOC/LIT</span><span style="font-family: 宋体;">，</span><span lang="EN-US">RPC/ENC</span><span style="font-family: 宋体;">样式下的</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">协议栈除了单纯的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">处理之外，还要处理</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">编码的逻辑，还原多引用的对象图。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">对</span><span lang="EN-US">DOC/LIT</span><span style="font-family: 宋体;">的样式来说，是单纯的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">处理。应用定义</span><span lang="EN-US">WSDL</span><span style="font-family: 宋体;">文件，由应用本身进行解释，因此要简单快捷。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">性能测试的相关文章如下：</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><a href="http://dev2dev.bea.com/pub/a/2003/03/Cohen.html">http://dev2dev.bea.com/pub/a/2003/03/Cohen.html</a></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-soapenc/index.html">http://www.ibm.com/developerworks/cn/webservices/ws-soapenc/index.html</a></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><o:p> </o:p></span></p>
<h3><span style="font-family: 宋体;">三：</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">的好处。</span></h3>
<p class="MsoNormal"><span lang="EN-US">1</span><span style="font-family: 宋体;">、更松散的客户端和服务器端耦合性</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">RPC</span><span style="font-family: 宋体;">样式，定义了</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">客户端和服务器端之间的远程方法调用接口。该接口引用了抽象的</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">数据类型，根据编码方案将</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">数据模型转换成</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">消息。客户端和服务器端的耦合度是远程过程调用的接口。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">       </span></span><span style="font-family: 宋体;">    在</span><span lang="EN-US">Document</span><span style="font-family: 宋体;">样式，</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">客户端与服务器端交互的是符合</span><span lang="EN-US">WSDL</span><span style="font-family: 宋体;">约束一段文本型数据。</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">客户端与服务器端的契约或者说耦合度是仅仅</span><span lang="EN-US">WSDL</span><span style="font-family: 宋体;">描述的限制。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">       </span></span><span style="font-family: 宋体;">    可以看出，</span><span lang="EN-US">Document</span><span style="font-family: 宋体;">样式中，客户端和服务器端的耦合性更低，远程过程调用必须是相对静态的，并且对接口的任何变化都将破坏服务和应用程序之间的契约。如果服务是广泛分布的，那么很可能大量的应用程序已经从它的</span><span lang="EN-US"> WSDL </span><span style="font-family: 宋体;">文档中产生了存根代码。改变</span><span lang="EN-US"> WSDL </span><span style="font-family: 宋体;">将会导致所有依赖于特定方法签名的应用程序被破坏。使用文档消息传递，规则更不严格，并且可以使</span><span lang="EN-US"> XML </span><span style="font-family: 宋体;">模式得到显著增强和改变，同时又不会破坏调用应用程序。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family: 宋体;">、充分利用</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">的好处，包括自描述、自验证等</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3</span><span style="font-family: 宋体;">、在异步调用的场合，由于文档消息通常是自包含的，因此适合于异步处理，可以直接放到服务器的队列中。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">4</span><span style="font-family: 宋体;">、更好的互操作性</span></p>
<h3><span style="font-family: 宋体;">四：</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">模拟的</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">调用</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><em><span style="font-family: 宋体;">在标准</span><span lang="EN-US">Document/literal</span></em><span lang="EN-US"> </span><span style="font-family: 宋体;">方式下，程序员不得不处理所有的事务，包括基于</span><span lang="EN-US"> XML </span><span style="font-family: 宋体;">的</span><span lang="EN-US"> SOAP </span><span style="font-family: 宋体;">消息的序列化和逆序列化。标准的</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">不是面向</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">的，也没有定义与远程调用相关的信息，对仍然酷爱</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">调用的开发者来说无疑是欠缺的，在</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">工具开发者看来</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">标准方式主要是缺乏函数的方法名。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">于是微软提出了使用</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">模拟</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">的方法调用，定义了一种用特殊的</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">使用方法，有名称叫做</span><strong><span style="font-family: 宋体;">Document/literal wrapped。其实就是故意在</span><span lang="EN-US">WSDL</span></strong><strong><span style="font-family: 宋体;">中定义一个复杂类型</span><span class="boldcode"><span lang="EN-US">complexType</span></span></strong><span class="boldcode"><span style="font-family: 宋体;"><strong>节点</strong>，该节点的名称与远程调用的方法名相同，该节点把发送的所有参数再封装一层。这样，</span><span lang="EN-US">SOAP</span></span><span class="boldcode"><span style="font-family: 宋体;">的开发工具可以在接受到</span><span lang="EN-US">XML</span></span><span class="boldcode"><span style="font-family: 宋体;">消息的时候根据节点上的方法名将</span><span lang="EN-US">XML</span></span><span class="boldcode"><span style="font-family: 宋体;">消息处理后分发到具体的处理函数中。</span></span><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">为帮助理解，先看一段普通的</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">样式的</span><span lang="EN-US">WSDL </span><span style="font-family: 宋体;">和</span><span lang="EN-US">SOAP</span><span style="font-family: 宋体;">消息。</span></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">schema</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;xElement&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xsd:int&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;yElement&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xsd:float&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">schema</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">message</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;myMethodRequest&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">part</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;x&quot;</span><span>&nbsp;</span><span class="attribute">element</span><span>=</span><span class="attribute-value">&quot;xElement&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">part</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;y&quot;</span><span>&nbsp;</span><span class="attribute">element</span><span>=</span><span class="attribute-value">&quot;yElement&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">message</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">message</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;empty&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">portType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;PT&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">operation</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;myMethod&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">message</span><span>=</span><span class="attribute-value">&quot;myMethodRequest&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">output</span><span>&nbsp;</span><span class="attribute">message</span><span>=</span><span class="attribute-value">&quot;empty&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">operation</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">portType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
soap消息，该SOAP消息中不含方法名的信息：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">soap:envelope</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">soap:body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">xElement</span><span class="tag">&gt;</span><span>5</span><span class="tag">&lt;/</span><span class="tag-name">xElement</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">yElement</span><span class="tag">&gt;</span><span>5.0</span><span class="tag">&lt;/</span><span class="tag-name">yElement</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">soap:body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">soap:envelope</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
下面是使用<strong><span style="font-family: 宋体;">Document/literal wrapped样式对应的WSDL定义：</span></strong><br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">schema</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;myMethod&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;x&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xsd:int&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;y&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xsd:float&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;myMethodResponse&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">complexType</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">schema</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">message</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;myMethodRequest&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">part</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;parameters&quot;</span><span>&nbsp;</span><span class="attribute">element</span><span>=</span><span class="attribute-value">&quot;myMethod&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">message</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">message</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;empty&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">part</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;parameters&quot;</span><span>&nbsp;</span><span class="attribute">element</span><span>=</span><span class="attribute-value">&quot;myMethodResponse&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">message</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">portType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;PT&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">operation</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;myMethod&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">message</span><span>=</span><span class="attribute-value">&quot;myMethodRequest&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">output</span><span>&nbsp;</span><span class="attribute">message</span><span>=</span><span class="attribute-value">&quot;empty&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">operation</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">portType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
对应的SOAP消息，消息中包含了方法名信息，虽然，只是WSDL定义的myMethod节点：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">soap:envelope</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">soap:body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">myMethod</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">x</span><span class="tag">&gt;</span><span>5</span><span class="tag">&lt;/</span><span class="tag-name">x</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">y</span><span class="tag">&gt;</span><span>5.0</span><span class="tag">&lt;/</span><span class="tag-name">y</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">myMethod</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">soap:body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">soap:envelope</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">这种编码样式，兼顾了</span><span lang="EN-US">Document/literal</span><span style="font-family: 宋体;">和</span><span lang="EN-US">RPC</span><span style="font-family: 宋体;">的好处，具有更好的跨平台互操作性，目前许多类库都是采用这种方案，例如，大名鼎鼎的</span><span lang="EN-US">XFIRE</span><span style="font-family: 宋体;">。当然，这个方案肯定也有一些问题。</span></p>
1、 这其实不是真正的RPC样式，方法名不能重载。<br />
<br />
2、 WSDL文件比标准的Document/literal要复杂一些。
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>参考资料：<br />
</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="http://www.eherenow.com/soapfight.htm">http://www.eherenow.com/soapfight.htm</a></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p><a href="http://www.ibm.com/developerworks/cn/webservices/ws-tip-j2eenet1/index.html">http://www.ibm.com/developerworks/cn/webservices/ws-tip-j2eenet1/index.html</a></span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/?S_TACT=105AGX52&amp;S_CMP=cn-a-ws">http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/?S_TACT=105AGX52&amp;S_CMP=cn-a-ws</a></span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="http://www.w3schools.com/schema/el_complextype.asp">http://www.w3schools.com/schema/el_complextype.asp</a></span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="http://www.ibm.com/developerworks/cn/webservices/ws-stand/part2/index.html">http://www.ibm.com/developerworks/cn/webservices/ws-stand/part2/index.html</a></span></p>
<p class="MsoNormal"><span lang="EN-US">http://searchsoa.techtarget.com/ateQuestionNResponse/0,289625,sid26_cid494324_tax289201,00.html</span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="http://www.ibm.com/developerworks/webservices/library/ws-docstyle.html?S_TACT=105AGX52&amp;S_CMP=cn-a-ws">http://www.ibm.com/developerworks/webservices/library/ws-docstyle.html?S_TACT=105AGX52&amp;S_CMP=cn-a-ws</a></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p><a href="http://msdn2.microsoft.com/en-us/library/ms995710.aspx">http://msdn2.microsoft.com/en-us/library/ms995710.aspx</a></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<span style=""></span><strong><span style="font-family: 宋体;"></span></strong>
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/145061#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 Nov 2007 14:02:00 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/145061</link>
        <guid>http://shallon.javaeye.com/blog/145061</guid>
      </item>
      <item>
        <title>XMPP HTTP-BIND 认证交互的消息流</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/130046" style="color:red;">http://shallon.javaeye.com/blog/130046</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          XMPP定义的BOSH规范（XEP 1024）是为了在HTTP协议上承载XMPP消息。下面是XEP 1024定义的非安全方式下的认证消息流。只有在 SSL (or TLS) HTTP连接保护下的消息才是安全的消息，否则为非安全的消息。XEP 1024定义了主键系列的方式保护非安全的消息，这种方案只能防御到不能修改消息内容的攻击者；如果需要彻底的保护消息，只能使用SSL或者TLS。为了清楚地截取交互过程，下面的流程基于非安全的方式。<br />
<br />
主键系列生成算法：<br />
<pre>        K(1) = hex(SHA-1(seed))<br />        K(2) = hex(SHA-1(K(1)))<br />        ...<br />        K(n) = hex(SHA-1(K(n-1)))<br /><br />交互的XMPP消息流中 第一个消息包含newkey的属性，其值为第一个主键系列的值。<br />后续的客户端给服务器端发送的消息必须带上SID及key的值，每个key的值由前一个key的值计算而来。当循环用到最后一个key值<br />的时候，可以同时设置newkey的属性，开始新的一系列key值。<br />下面的交互过程从jwchat与openfire3.3.2的http-bind模块通信中截取。<div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>Accept-Language:&nbsp;zh-cn&nbsp;&nbsp;</span></span></li><li class=""><span>Referer:&nbsp;http://191.1.11.56:8082/CIM/index.htm?<span class="attribute">jid</span><span>=</span><span class="attribute-value">user1</span><span>.org1&amp;</span><span class="attribute">server</span><span>=</span><span class="attribute-value">191</span><span>.1.11.77&amp;</span><span class="attribute">pass</span><span>=</span><span class="attribute-value">123456</span><span>&amp;</span><span class="attribute">nickname</span><span>=........&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class=""><span>Accept-Encoding:&nbsp;gzip,&nbsp;deflate&nbsp;&nbsp;</span></li><li class="alt"><span>User-Agent:&nbsp;Mozilla/4.0&nbsp;(compatible;&nbsp;MSIE&nbsp;6.0;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;SV1)&nbsp;&nbsp;</span></li><li class=""><span>Host:&nbsp;191.1.11.77:8080&nbsp;&nbsp;</span></li><li class="alt"><span>Content-Length:&nbsp;151&nbsp;&nbsp;</span></li><li class=""><span>Connection:&nbsp;Keep-Alive&nbsp;&nbsp;</span></li><li class="alt"><span>Cache-Control:&nbsp;no-cache&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">hold</span><span>=</span><span class="attribute-value">'1'</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">'191.1.11.77'</span><span>&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="attribute">wait</span><span>=</span><span class="attribute-value">'300'</span><span>&nbsp;</span><span class="attribute">rid</span><span>=</span><span class="attribute-value">'803757'</span><span>&nbsp;</span><span class="attribute">newkey</span><span>=</span><span class="attribute-value">'b543ff6c4c105dba31d70c6f1c7304ed7bece24b'</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div>Server返回一个SID，并给出认证的选择。<br /><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>HTTP/1.1&nbsp;200&nbsp;OK&nbsp;&nbsp;</span></span></li><li class=""><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Length:&nbsp;662&nbsp;&nbsp;</span></li><li class=""><span>Server:&nbsp;Jetty(6.1.x)&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://jabber.org/protocol/httpbind&quot;</span><span>&nbsp;</span><span class="attribute"></span></span></li><li class=""><span><span class="attribute">xmlns:stream</span><span>=</span><span class="attribute-value">&quot;http://etherx.jabber.org/streams&quot;</span><span> <br /></span></span></li><li class=""><span><span></span><span class="attribute">authid</span><span>=</span><span class="attribute-value">&quot;1fc3b503&quot;</span><span>&nbsp;</span><span class="attribute">sid</span><span>=</span><span class="attribute-value">&quot;1fc3b503&quot;</span><span>&nbsp;</span><span class="attribute">secure</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span> <br /></span></span></li><li class=""><span><span></span><span class="attribute">requests</span><span>=</span><span class="attribute-value">&quot;2&quot;</span><span>&nbsp;</span><span class="attribute">inactivity</span><span>=</span><span class="attribute-value">&quot;30&quot;</span><span>&nbsp;</span><span class="attribute">polling</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;</span><span class="attribute">wait</span><span>=</span><span class="attribute-value">&quot;10&quot;</span><span class="tag">&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">stream:features</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">mechanisms</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;urn:ietf:params:xml:ns:xmpp-sasl&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>DIGEST-MD5</span><span class="tag"><!--</span--><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>JIVE-SHAREDSECRET</span><span class="tag"><!--</span--><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>PLAIN</span><span class="tag"><!--</span--><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>ANONYMOUS</span><span class="tag"><!--</span--><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span>CRAM-MD5</span><span class="tag"><!--</span--><span class="tag-name">mechanism</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">mechanisms</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">compression</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://jabber.org/features/compress&quot;</span><span class="tag">&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">method</span><span class="tag">&gt;</span><span>zlib</span><span class="tag"><!--</span--><span class="tag-name">method</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">compression</span><span class="tag">&gt;</span></span></span></span></li><li class=""><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">bind</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;urn:ietf:params:xml:ns:xmpp-bind&quot;</span><span class="tag">/&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">session</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;urn:ietf:params:xml:ns:xmpp-session&quot;</span><span class="tag">/&gt;</span><span class="tag"><!--</span--><span class="tag-name">stream:features</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></li></ol></div>下面是客户端发送认证<br /><br />请求。digest的值为sha1(sid + password)<br /><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>POST&nbsp;/http-bind/&nbsp;HTTP/1.1&nbsp;&nbsp;</span></span></li><li class=""><span>Accept:&nbsp;*/*&nbsp;&nbsp;</span></li><li class="alt"><span>Accept-Language:&nbsp;zh-cn&nbsp;&nbsp;</span></li><li class=""><span>Referer:http://191.1.11.56:8082/CIM/index.htm?<span class="attribute">jid</span><span>=</span><span class="attribute-value">user1</span><span>.org1&amp;</span><span class="attribute">server</span><span>=</span><span class="attribute-value">191</span><span>.1.11.77&amp;</span><span class="attribute">pass</span><span>=</span><span class="attribute-value">123456</span><span>&amp;</span><span class="attribute">nickname</span><span>=........&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class=""><span>Accept-Encoding:&nbsp;gzip,&nbsp;deflate&nbsp;&nbsp;</span></li><li class="alt"><span>User-Agent:&nbsp;Mozilla/4.0&nbsp;(compatible;&nbsp;MSIE&nbsp;6.0;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;SV1)&nbsp;&nbsp;</span></li><li class=""><span>Host:&nbsp;191.1.11.77:8080&nbsp;&nbsp;</span></li><li class="alt"><span>Content-Length:&nbsp;346&nbsp;&nbsp;</span></li><li class=""><span>Connection:&nbsp;Keep-Alive&nbsp;&nbsp;</span></li><li class="alt"><span>Cache-Control:&nbsp;no-cache&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">rid</span><span>=</span><span class="attribute-value">'803759'</span><span>&nbsp;</span><span class="attribute">sid</span><span>=</span><span class="attribute-value">'1fc3b503'</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span>&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="attribute">key</span><span>=</span><span class="attribute-value">'aabcfc3ad7a327fa9542da51b24d024361d4b6f1'</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:client&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;set&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;auth2&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">query</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:iq:auth&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">username</span><span class="tag">&gt;</span><span>user1.org1</span><span class="tag"><!--</span--><span class="tag-name">username</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">resource</span><span class="tag">&gt;</span><span>............</span><span class="tag"><!--</span--><span class="tag-name">resource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">digest</span><span class="tag">&gt;</span><span>33f2e458193401a8eb12443b0f459c16079463d9</span><span class="tag"><!--</span--><span class="tag-name">digest</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">query</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">iq</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></span></li><li class=""><span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li></ol></div><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>HTTP/1.1&nbsp;200&nbsp;OK&nbsp;&nbsp;</span></span></li><li class=""><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Length:&nbsp;136&nbsp;&nbsp;</span></li><li class=""><span>Server:&nbsp;Jetty(6.1.x)&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span class="tag">&gt;</span><span class="tag"></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;result&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;auth2&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;user1.org1@domainname/............&quot;</span><span class="tag">/&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li></ol></div>认证结束，客户端发送呈现的消息流，查询用户的状态<br /><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>POST&nbsp;/http-bind/&nbsp;HTTP/1.1&nbsp;&nbsp;</span></span></li><li class=""><span>Accept:&nbsp;*/*&nbsp;&nbsp;</span></li><li class="alt"><span>Accept-Language:&nbsp;zh-cn&nbsp;&nbsp;</span></li><li class=""><span>Referer:http://191.1.11.56:8082/CIM/index.htm?<span class="attribute">jid</span><span>=</span><span class="attribute-value">user1</span><span>.org1&amp;</span><span class="attribute">server</span><span>=</span><span class="attribute-value">191</span><span>.1.11.77&amp;</span><span class="attribute">pass</span><span>=</span><span class="attribute-value">123456</span><span>&amp;</span><span class="attribute">nickname</span><span>=........&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class=""><span>Accept-Encoding:&nbsp;gzip,&nbsp;deflate&nbsp;&nbsp;</span></li><li class="alt"><span>User-Agent:&nbsp;Mozilla/4.0&nbsp;(compatible;&nbsp;MSIE&nbsp;6.0;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;SV1)&nbsp;&nbsp;</span></li><li class=""><span>Host:&nbsp;191.1.11.77:8080&nbsp;&nbsp;</span></li><li class="alt"><span>Content-Length:&nbsp;266&nbsp;&nbsp;</span></li><li class=""><span>Connection:&nbsp;Keep-Alive&nbsp;&nbsp;</span></li><li class="alt"><span>Cache-Control:&nbsp;no-cache&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">rid</span><span>=</span><span class="attribute-value">'803761'</span><span>&nbsp;</span><span class="attribute">sid</span><span>=</span><span class="attribute-value">'1fc3b503'</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span> <br /></span></span></li><li class="alt"><span><span></span><span class="attribute">key</span><span>=</span><span class="attribute-value">'d32ea55815de2c52f1b736080a79825cc227e09d'</span><span>&nbsp;</span><span class="tag">&gt;</span></span></li><li class="alt"><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:client&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;get&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;jwchat_state&quot;</span><span class="tag">&gt;</span></span></li><li class="alt"><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">query</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:iq:private&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">jwchat</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jwchat:state&quot;</span><span class="tag">/&gt;</span><span class="tag"><!--</span--><span class="tag-name">query</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">iq</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></li><li class=""><span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li></ol></div>查询状态返回：<br /><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>HTTP/1.1&nbsp;200&nbsp;OK&nbsp;&nbsp;</span></span></li><li class=""><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Length:&nbsp;265&nbsp;&nbsp;</span></li><li class=""><span>Server:&nbsp;Jetty(6.1.x)&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span class="tag">&gt;</span><span class="tag"></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;result&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;jwchat_state&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;user1.org1@domainname/............&quot;</span><span class="tag">&gt;</span><span class="tag"></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">query</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:iq:private&quot;</span><span class="tag">&gt;</span><span class="tag"></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">jwchat</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jwchat:state&quot;</span><span class="tag">&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">presence</span><span class="tag">&gt;</span><span>available</span><span class="tag"><!--</span--><span class="tag-name">presence</span><span class="tag">&gt;</span><span class="tag"></span></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">onlmsg</span><span class="tag">/&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag"><!--</span--><span class="tag-name">jwchat</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">query</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">iq</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></span></span></li></ol></div>发布呈现信息<br /><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>POST&nbsp;/http-bind/&nbsp;HTTP/1.1&nbsp;&nbsp;</span></span></li><li class=""><span>Accept:&nbsp;*/*&nbsp;&nbsp;</span></li><li class="alt"><span>Accept-Language:&nbsp;zh-cn&nbsp;&nbsp;</span></li><li class=""><span>Referer:&nbsp;http://191.1.11.56:8082/CIM/index.htm?<span class="attribute">jid</span><span>=</span><span class="attribute-value">user1</span><span>.org1&amp;</span><span class="attribute">server</span><span>=</span><span class="attribute-value">191</span><span>.1.11.77&amp;</span><span class="attribute">pass</span><span>=</span><span class="attribute-value">123456</span><span>&amp;</span><span class="attribute">nickname</span><span>=........&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class=""><span>Accept-Encoding:&nbsp;gzip,&nbsp;deflate&nbsp;&nbsp;</span></li><li class="alt"><span>User-Agent:&nbsp;Mozilla/4.0&nbsp;(compatible;&nbsp;MSIE&nbsp;6.0;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;SV1)&nbsp;&nbsp;</span></li><li class=""><span>Host:&nbsp;191.1.11.77:8080&nbsp;&nbsp;</span></li><li class="alt"><span>Content-Length:&nbsp;620&nbsp;&nbsp;</span></li><li class=""><span>Connection:&nbsp;Keep-Alive&nbsp;&nbsp;</span></li><li class="alt"><span>Cache-Control:&nbsp;no-cache&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">rid</span><span>=</span><span class="attribute-value">'803763'</span><span>&nbsp;</span><span class="attribute">sid</span><span>=</span><span class="attribute-value">'1fc3b503'</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span></span></span></li><li class="alt"><span><span></span><span class="attribute">key</span><span>=</span><span class="attribute-value">'192ed9480229081924997e91a275411df3bdfb0f'</span><span>&nbsp;</span><span class="tag">&gt;</span><span class="tag"></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">presence</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:client&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">priority</span><span class="tag">&gt;</span><span>10</span><span class="tag"><!--</span--><span class="tag-name">priority</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">presence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:client&quot;</span><span>&nbsp;</span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;191.1.11.77&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;get&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;disco_item_1&quot;</span><span class="tag">&gt;</span></span></li><li class="alt"><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">query</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://jabber.org/protocol/disco#items&quot;</span><span class="tag">/&gt;</span><span class="tag"><!--</span--><span class="tag-name">iq</span><span class="tag">&gt;</span></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:client&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;get&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;storage_bookmarks&quot;</span><span class="tag">&gt;</span></span></li><li class="alt"><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">query</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:iq:private&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">storage</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;storage:bookmarks&quot;</span><span class="tag">/&gt;</span><span class="tag"><!--</span--><span class="tag-name">query</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">iq</span><span class="tag">&gt;</span><span>&nbsp; <br /></span></span></span></span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">iq</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:client&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;get&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;jwchat_notes&quot;</span><span class="tag">&gt;</span></span></li><li class=""><span><span class="tag"></span><span class="tag">&lt;</span><span class="tag-name">query</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;jabber:iq:private&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">storage</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;storage:rosternotes&quot;</span><span class="tag">/&gt;</span><span class="tag"><!--</span--><span class="tag-name">query</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">iq</span><span class="tag">&gt;</span><span></span></span></span></span></li><li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li></ol></div>返回<br /><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml" start="1"><li class="alt"><span><span>HTTP/1.1&nbsp;200&nbsp;OK&nbsp;&nbsp;</span></span></li><li class=""><span>Content-Type:&nbsp;text/xml;&nbsp;<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8&nbsp;&nbsp;</span></span></li><li class="alt"><span>Content-Length:&nbsp;201&nbsp;&nbsp;</span></li><li class=""><span>Server:&nbsp;Jetty(6.1.x)&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">'http://jabber.org/protocol/httpbind'</span><span class="tag">&gt;</span><span class="tag"></span></span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">presence</span><span>&nbsp;</span><span class="attribute">from</span><span>=</span><span class="attribute-value">&quot;user1.org1@domainname/............&quot;</span><span> <br /></span></span></li><li class=""><span><span></span><span class="attribute">to</span><span>=</span><span class="attribute-value">&quot;user1.org1@domainname/............&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">priority</span><span class="tag">&gt;</span><span>10</span><span class="tag"><!--</span--><span class="tag-name">priority</span><span class="tag">&gt;</span><span class="tag"></span></span></span></li><li class=""><span><span class="tag"><!--</span--><span class="tag-name">presence</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></li></ol></div></pre>
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/130046#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 12:03:05 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/130046</link>
        <guid>http://shallon.javaeye.com/blog/130046</guid>
      </item>
      <item>
        <title>JCONSILE的连接问题</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/129750" style="color:red;">http://shallon.javaeye.com/blog/129750</a>&nbsp;
          发表时间: 2007年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用JCONSOLE监控远程LINUX运行的JAVA进程，总是在报连接失败的错误。<br />
1)被监控的服务器端增加启动参数<br />
<pre>-Dcom.sun.management.jmxremote.port=8999<br />-Dcom.sun.management.jmxremote.authenticate=false <br />-Dcom.sun.management.jmxremote.ssl=false</pre>
2)本机上使用jconsole连接远程的8999端口<br />
报连接失败，检查网络情况，8999端口有在监听等待，本地机器能够连接上对端机器的8999端口。切换了一台linux机器，情况依旧。<br />
<br />
3)去网上找了一把，发现一个网友一年多前也在为此苦恼，所不同的是网友用的是JDK1.5，我用的是JDK 1.6。该网文链接如下：<br />
<a href="http://svr.wjworld.net/soft/P1558/I7132389.shtml" target="_blank">http://svr.wjworld.net/soft/P1558/I7132389.shtml</a><br />
<br />
4)尝试抓包分析，发现是RMI的二进制协议，无法解读，报文中有127.0.0.1等字眼，从关键字判断是RMI下载的STUB文件。<br />
<br />
5)继续查找，发现了一篇有价值的文章谈到这个问题，是服务器端解释机器名的问题，如果服务器端hostname -i被定向到127.0.0.1则会出现连接失败的问题。修改/etc/hosts文件，使hostname -i 指向正确的IP，JConsole终于可以正常连接。<br />
这篇文章链接如下：<br />
<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6209663" target="_blank">http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6209663</a><br />
<pre>6)可能的问题原因分析：JCONSOLE连接上监控的进程，从监控进程下载了RMI远程调用的STUB文件？该STUB访问服务器的进程，<br />服务器端的地址可能是通过hostname -i类似机制获得。</pre>
<br />
<br />
<br />
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/129750#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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, 08 Oct 2007 16:22:46 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/129750</link>
        <guid>http://shallon.javaeye.com/blog/129750</guid>
      </item>
      <item>
        <title>初探BOSH （Bidirectional-streams Over Synchronous HTTP）</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/126428" style="color:red;">http://shallon.javaeye.com/blog/126428</a>&nbsp;
          发表时间: 2007年09月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>简述：</strong><br />
&nbsp;&nbsp;&nbsp; BOSH （Bidirectional-streams Over Synchronous HTTP）是一种在客户端和服务器端之间通过HTTP的请求/响应进行客户端和服务器双向通信的技术，BOSH在XMPP系列规范中的XEP-0124中定义，应用场合为基于浏览器的客户端访问XMPP服务器。 下面的内容来自XEP-0124规范。http://www.xmpp.org/extensions/xep-0124.html<br />
其具体应用需求：<br />
1、&nbsp; 能够在手机或者浏览器的运行环境中使用**<br />
2、&nbsp; 浏览器中的客户端能够建立双向的跨域的连接*<br />
3、&nbsp; 兼容缓存部分HTTP Response的HTTP 代理 *<br />
4、&nbsp; 快速通过有HTTP Response生存时间限制的代理 *<br />
5、&nbsp; 兼容HTTP1.0 *<br />
6、&nbsp; 兼容受限的网络连接环境（防火墙、代理、网关）<br />
7、&nbsp; 容错性<br />
8、&nbsp; 扩展性<br />
9、&nbsp; 更小的带宽消耗<br />
10、更快的实时响应时间<br />
11、 支持轮询<br />
12、 按顺序提交数据<br />
13、防止Session中有非法插入的请求（interjecting HTTP requests into a session）<br />
14、防止拒绝服务攻击<br />
15、多路复用的数据流<br />
<br />
&nbsp;&nbsp;&nbsp; 在规范中声称：打了*号的几项是无法用COMET技术实现（就是2、3、4、5），经过考察，作者是将COMET定义为流的方式推送数据的HTTP长连接技术。因此，无法通过缓存HTTP响应、及有生存时间限制的HTTP代理。另外由于HTTP1.0无法支持块数据的编码（chunked transfer encoding）流的方式推送数据无法在HTTP1.0的环境下使用。（至于第2条，规范作者用了非常奇怪的方式去企图建立跨域的连接，俺决定放弃不追究作者在说啥）要了解HTTP长连接技术，建议看：http://www.ibm.com/developerworks/cn/web/wa-lo-comet/index.html<br />
<br />
<strong><span style="font-size: 10.5pt; font-family: 宋体;">系统架构：<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/5466/860fde14-e55d-42a1-bca1-27a92c300727.jpg" alt="" /><br />
</span></strong>
<p class="MsoNormal"><span style="font-family: 宋体;">在架构中，连接管理器（</span><span lang="EN-US">Connection Manager</span><span style="font-family: 宋体;">）与</span> <span lang="EN-US">Server</span><span style="font-family: 宋体;">之间是原始的数据流（在</span><span lang="EN-US">XMPP</span><span style="font-family: 宋体;">的协议中就是</span><span lang="EN-US">XMPP</span><span style="font-family: 宋体;">的数据流），</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">客户端与连接管理器之间是</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">协议以及</span><span lang="EN-US">Body</span><span style="font-family: 宋体;">的</span><span lang="EN-US">TAG</span><span style="font-family: 宋体;">封装的数据流。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">流程描述：</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">BOSH</span><span style="font-family: 宋体;">技术能够同时减小网络带宽和减小客户端响应的时间。其方案是对客户端的请求连接管理器不给于返回直到数据已经就绪，当客户端收取连接管理器返回的数据会向连接管理器发送下一个请求，于是连接管理器总是保持着一个客户端的请求，当服务器端数据就绪的时候，可以将数据封装在请求的响应包中，&ldquo;推送&rdquo;给客户端。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<span style="font-size: 10.5pt; font-family: 宋体;">如果双向连接长时间没有数据，连接管理器负责给客户端发送一个空包，空包触发客户端发送新的请求，连接管理器通过这种机制判断连接是否已经中断，由于</span><span new="" times="" lang="EN-US" roman="" style="font-size: 10.5pt;">BOSH</span><span style="font-size: 10.5pt; font-family: 宋体;">不是轮询的机制，带宽消耗比标准的</span><span new="" times="" lang="EN-US" roman="" style="font-size: 10.5pt;">TCP</span><span style="font-size: 10.5pt; font-family: 宋体;">连接大不了多少。<br />
<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/5467/b0123b3f-c948-4930-945c-a8bab2e15c97.jpg" alt="" /><br />
</span>
<p class="MsoNormal"><span style="font-family: 宋体;">由于大多数的客户端不支持</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Pipeling</span><span style="font-family: 宋体;">（单一的连接上承载并发的请求），于是，客户端必须从第二条</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">连接发送消息。当第二条</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">连接有新的请求发送的时候，连接管理器将第一条连接中的请求返回，即便此时第一条连接中的返回的是空数据包。这样做的原因是让客户端有需要的话可以发送新的请求过来。客户段同一时间最多只能保持两条</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">连接，否则的话，客户端必须等待旧的请求处理完之后才能发送新的请求</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在网络经常中断的环境下，</span><span lang="EN-US">BOSH</span><span style="font-family: 宋体;">退化成每个数据请求一个新</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">连接。然而，在通常情况下，网络环境良好，客户端可以使用</span><span lang="EN-US">http/1.1,</span><span style="font-family: 宋体;">这个时候，一个</span><span lang="EN-US">Session</span><span style="font-family: 宋体;">包含两个</span><span lang="EN-US">TCP</span><span style="font-family: 宋体;">长连接，所有的请求都在这两个长连接上传输。基本上任何时候，客户端通过一条连接能够推送数据到服务器，与此同时，服务器端可以&ldquo;推送&rdquo;数据到客户端。值得注意的是，这两条长连接的角色在客户端每发送一次请求则角色转换一次。</span></p>
<br />
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span><span style="font-size: 10.5pt; font-family: 宋体;">尽管大多数时间可以随时推送数据到对端，但是，如果一方刚刚推送完数据，则需要等一个网络来回的时间才能推送下一个数据</span></p>
<p class="MsoNormal"><img src="http://shallon.javaeye.com/upload/picture/pic/5468/446f7fb6-0b6b-4f1a-84c9-108b2e36ca40.jpg" alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/126428#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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>Sun, 23 Sep 2007 21:50:30 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/126428</link>
        <guid>http://shallon.javaeye.com/blog/126428</guid>
      </item>
      <item>
        <title>一种SSO的实现方案</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/120287" style="color:red;">http://shallon.javaeye.com/blog/120287</a>&nbsp;
          发表时间: 2007年09月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          业务场景：<br />
跨域的融合应用，企业内网的自动化办公应用与放置在公网上的应用集成<br />
<br />
流程：<br />
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">1</span><span style="font-size: 10pt; font-family: 宋体;">、用户通过浏览器登陆集成的门户</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">2</span><span style="font-size: 10pt; font-family: 宋体;">、集成的门户返回页面，用户选择外域提供的功能链接</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">3</span><span style="font-size: 10pt; font-family: 宋体;">、链接发送到跨域接口模块</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">4</span><span style="font-size: 10pt; font-family: 宋体;">、跨域接口模块解密藏在<span lang="EN-US">cookie</span>中的集成门户颁发的登陆票，获取<span lang="EN-US">userid</span>，跨域接口模块生成一个重定向到外域应用门户网页，并将用户<span lang="EN-US">ID</span>及本域服务器身份认证信息放置到自动提交的隐藏表单中。隐藏表单的提交地址是外域的页面地址</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体;"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">5</span><span style="font-size: 10pt; font-family: 宋体;">、跨域接口模块把网页返回给浏览器，浏览器自动提交隐藏表单，请求发送外域<span lang="EN-US">WEB</span>服务器。外域服务器登陆用户。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span style="font-size: 10pt; font-family: 宋体;">特点：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">1</span><span style="font-size: 10pt; font-family: 宋体;">、后续请求不过跨域接口模块，直接与外域<span lang="EN-US">WEB</span>服务器连接<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">2</span><span style="font-size: 10pt; font-family: 宋体;">、对同一个用户，本域<span lang="EN-US">WEB</span>服务器与外域<span lang="EN-US">WEB</span>服务器维护的是独立的两个<span lang="EN-US">COOKIE</span>，有独立的超时时间。本域应用用户<span lang="EN-US">logout</span>后，外域应用会话有可能还存活。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;">3</span><span style="font-size: 10pt; font-family: 宋体;">、基于安全考虑，本域的传递到外域服务器的信息可以进行加密。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: 宋体;"><span style=""></span><o:p></o:p></span></p>
<br />
<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/5096/43f888a9-802a-4662-8861-363997dd260d.jpg" alt="" />
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/120287#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Sep 2007 16:42:00 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/120287</link>
        <guid>http://shallon.javaeye.com/blog/120287</guid>
      </item>
      <item>
        <title>又见内存泄露</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/113464" style="color:red;">http://shallon.javaeye.com/blog/113464</a>&nbsp;
          发表时间: 2007年08月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、首先是测试人员使用Loadrunner测试的过程中发现系统的吞吐率会随着时间而下降，在排除了测试数据分布不均的问题在测试，发现吞吐率保持稳定的一段时间后会陡然下降，平均事务处理时间陡然上升。于是，对系统的运行进行监控，在客户端压力平均的时候，系统内存两个小时内从500m上升到1G，基本上可以认定是内存泄露。<br />
1.1系统的吞吐率图<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/4841/440a522a-7b42-4aa2-9a2c-f703267b9ac9.jpg" alt="" /><br />
<br />
1.2系统的平均事务处理时间图<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/4842/2bb1198b-25de-4e3b-8423-bce2740168ee.jpg" alt="" /><br />
<br />
2、添加 verbose:gc启动的参数，重新测试，发现每次Full GC后的对象空间持续缓慢增加，过了一段时间后，发现Miner GC无法释放空间，每次GC都是Full GC，到最后，Full GC也无法释放出空间出来。<br />
<br />
<br />
3、安装netbean profile对系统使用情形进行监控，发现<br />
a、堆内存的已使用空间缓慢增长，直到最大内存限制；<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/4839/cb10e4c6-1328-42b5-ab06-43c289d7cab8.jpg" alt="" /><br />
<br />
b、接近最大内存限制的时候，内存平均对象的年龄（Surviving Generations）急剧上升，见下图中的红线。<br />
c、Relative Time Spendt in GC 直剧上升，分析，当GC占用的CPU大量时间，系统的吞吐率下降，和LoadRunner的测试结果是符合的。见下图中的蓝线<br />
<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/4838/06cdfd35-2b87-4cf7-913e-baac371ebfe2.jpg" alt="" /><br />
<br />
4、获取内存对象的静态映像，发现内存中占空间最大的几种存活对象的平均对象年龄都比较大，并且随着时间的增长，这几类对象占用的空间与平均对象年龄都不停的加大，见图。<br />
<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/4844/3b386108-3fd2-4909-9d09-24b15267ac01.jpg" alt="" /><br />
<br />
5、查看这几种对象的分配时候的程序堆栈，发现这些对象是mule框架初始化组件对象的时候所创建，心中犯疑，什么促使mule框架不停的创建全局对象？<br />
<img src="http://shallon.javaeye.com/upload/picture/pic/4843/33b6da44-5d9a-4a99-9f02-c462ff3dd416.jpg" alt="" /><br />
追踪了几条对象生成的路径，发现不断增长的对象似乎都是org.mule.providers.soap.xfire.transport.MuleLocalTransport产生的，例如，19m的HashMap$Entry[]由MuleLocalTransport的父类org.codehaus.xfire.transport.AbstractTransport构造的时候产生，17m的HashMap$Entry[]由MuleLocalTransport的createNewChannel的方法生成。每调用createNewChannel一次就会生成一个全局对象org.codehaus.xfire.transport.DefaultEndpoint。而MuleLocalTransport对象只有在初始化的时候才会生成全局对象。继续看代码发现可以在XFireServiceComponent的setDescriptor打印日志来确认mule是否不停创建全局对象。<br />
<br />
6、在XFireServiceComponent的关键初始化方法setDescriptor中添加日志，编译、重新打包，替换原来的类。新的类每当setDescriptor被调用一次就打印一行日志。重新测试，发现每个一段时间setDescriptor就被调用一次。由于每调用setDescriptor一次，就会产生大量的全局对象，并且全局对象不被释放，导致堆内存的增长。<br />
<br />
7、会让mule如此疯狂的原因是什么呢？详细查看mule的配置，逐步集中到对象池与线程池的配置： 发现对象池的配置maxActive=5，maxIdle=5
<pooling-profile exhaustedaction="GROW" maxidle="5" maxwait="1000" maxactive="5">，配置明显过小，在对象池的exhaustedAction=&quot;GROW&quot; 。线程池的配置maxThreadsActive明显大于对象池的配置。这样mule肯定会创建对象，由于</pooling-profile>
对象池的对象很快由于超过了maxActive=5，多余的对象会被释放。<br />
<pooling-profile exhaustedaction="GROW" maxidle="5" maxwait="1000" maxactive="5"><br />
8、修改该配置maxActive=50，maxIdle=50，</pooling-profile>
对象池的exhaustedAction=&quot;Wait&quot;，
<pooling-profile exhaustedaction="GROW" maxidle="5" maxwait="1000" maxactive="5">重新运行，</pooling-profile>
maxThreadsActive=50
<pooling-profile exhaustedaction="GROW" maxidle="5" maxwait="1000" maxactive="5">。是运行了7个小时，内存正常。<br />
<br />
9、由于</pooling-profile>
对象池的exhaustedAction=&quot;Wait&quot;的情况下没有内存泄露，不等于说mule没有问题。mule放入对象池的对象是DefaultMuleProxy。为了与xfire集成，对象池放入一类特殊对象：<br />
org.mule.impl.model.DefaultMuleProxy -〉org.mule.providers.soap.xfire.XFireServiceComponent<br />
后者包含成员变量org.mule.providers.soap.xfire.transport.MuleLocalTransport与org.mule.providers.soap.xfire.transport.MuleUniversalTransport在对象池释放DefaultMuleProxy后没有得到释放。从netbeans profile的内存映像上看：这两个类的对象，生成对象的数目==存活的对象数目，一个都没有释放过。这两类对象又携带了大量的全局对象，导致内存泄露。<br />
<br />
10、上述两类对象为什么无法释放？经过一番查找，发现在XFireServiceComponent的setDescriptor方法，对象被注册到org.codehaus.xfire.transport.DefaultTransportManager中去了，之后不见有unregister的操作。代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getTransportManager().register(transport);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getTransportManager().register(universalTransport);<br />
<br />
<br />
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/113464#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 17 Aug 2007 14:16:00 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/113464</link>
        <guid>http://shallon.javaeye.com/blog/113464</guid>
      </item>
      <item>
        <title>使用SOAPUI对WEBSERVICE进行性能测试</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/110116" style="color:red;">http://shallon.javaeye.com/blog/110116</a>&nbsp;
          发表时间: 2007年08月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 性能测试一般使用loadrunner，或者自己写的调用客户端进行测试。loadrunner是全面的性能测试工具，对一般开发人员来说太重，并且需要license。自己写调用的客户端则测试的统计数据也需要写程序处理，比较麻烦。这里推荐使用soapui，SOAPUI可以直接根据WSDL生成SOAP数据包，手工填入参数后可以直接进行性能测试。<br />
<br />
1、下载soapui的最新安装包，目前的最新版本是soapui-1.7.5，SOAPUI里的TESTSUITE包含一些列的TESTCASE，TESTCASE由若干的测试步骤组成。每个TESTCASE包含TESTSTEP和LOADTEST。<br />
<br />
2、解包运行soapui.bat<br />
3、创建File--new WSDL Project，输入WSDL的HTTP URL地址<br />
<img src="http://www.soapui.org/gettingstarted/images/getting_started_1.gif" alt="" /><br />
4、SOAPUI产生该WSDL的HTTPBinding，里面有WSDL定义的业务方法<br />
<br />
<img src="http://www.soapui.org/gettingstarted/images/getting_started_3.gif" alt="" /><br />
5、每个业务方法下有自动产生的SOAP数据包的文本，编辑数据后可以直接发送<br />
<br />
<img src="http://www.soapui.org/gettingstarted/images/getting_started_7.gif" alt="" /><br />
<br />
6、性能测试，在TESTCASE的TEST STEP中编辑测试步骤，在LoadTest中填入性能测试的参数，可以直接进行性能测试<br />
<br />
<img src="http://www.soapui.org/gettingstarted/images/getting_started_loadtest_2.gif" alt="" /><br />
<br />
7、使用property transfer功能生成复杂的性能测试步骤，假设一个WSDL定义了两个方法，第一个测试步骤调用了第一个方法，返回authorid，作为第二个方法的输入参数（第二个步骤）。<br />
<br />
7.1在第一个测试步骤和第二个测试步骤之间添加一个property transfer的步骤，选择transfer的源是第一个方法的Response对象。填写xpath将该属性从Response中选择出来<br />
<br />
7.2选择transfer的目的地是第二个方法的request对象。填写xpath将该属性从request中选择出来<br />
7.3属性影射从souce影射到dest<br />
<br />
8、更复杂的功能可以由goovy实现
          <br/>
          <span style="color:red;">
            <a href="http://shallon.javaeye.com/blog/110116#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Aug 2007 15:32:00 +0800</pubDate>
        <link>http://shallon.javaeye.com/blog/110116</link>
        <guid>http://shallon.javaeye.com/blog/110116</guid>
      </item>
      <item>
        <title>REST风格的XCAP协议</title>
        <author>shallon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shallon.javaeye.com">shallon</a>&nbsp;
          链接：<a href="http://shallon.javaeye.com/blog/109749" style="color:red;">http://shallon.javaeye.com/blog/109749</a>&nbsp;
          发表时间: 2007年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;
<p class="MsoNormal"><span lang="EN-US">1</span><span style="font-family: 宋体;">、</span><span lang="EN-US">XCAP</span><span style="font-family: 宋体;">协议的简介</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>XCAP</span><span style="font-family: 宋体;">（</span><span lang="EN-US">XML Configuration Access Protocol</span><span style="font-family: 宋体;">，</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">配置访问协议），也称</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">配置接入协议。它是</span><span lang="EN-US">IETF</span><span style="font-family: 宋体;">制定的一个协议，前面陆续发布了一系列草案，于</span><span lang="EN-US">2007</span><span style="font-family: 宋体;">年</span><span lang="EN-US">5</span><span style="font-family: 宋体;">月正式成为</span><span lang="EN-US">RFC</span><span style="font-family: 宋体;">规范（</span><span lang="EN-US">RFC 4825</span><span style="font-family: 宋体;">）。</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">该协议允许客户端读、写、修改存放在服务器中的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">格式的应用配置数据。</span><span lang="EN-US">XCAP</span><span style="font-family: 宋体;">将</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文档中的节点映射到</span><span lang="EN-US">HTTP URIs</span><span style="font-family: 宋体;">中，使得这些组件能够直接通过</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">访问。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family: 宋体;">、</span><span lang="EN-US">XCAP</span><span style="font-family: 宋体;">协议的应用场合</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">多个应用和服务之间共享好友列表（</span><span lang="EN-US">Buddy Lists</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">多个应用和服务之间共享安全策略（</span><span lang="EN-US">Authorization Policies</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">多个应用和服务之间共享呈现数据（</span><span lang="EN-US">Presence List</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;<img src="http://shallon.javaeye.com/upload/picture/pic/4628/fba18aaa-a348-4c90-8f46-84df769964cb.jpg" height="388" alt="" width="517" /></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span>&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">开放移动联盟（</span><span lang="EN-US">OMA</span><span style="font-family: 宋体;">）定义的文档管理服务器（</span><span lang="EN-US">XDMS</span><span style="font-family: 宋体;">）结构中，其中的</span><span lang="EN-US">XDM3</span><span style="font-family: 宋体;">和</span><span lang="EN-US">XDM4</span><span style="font-family: 宋体;">接口是</span><span lang="EN-US">XCAP</span><span style="font-family: 宋体;">协议。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3</span><span style="font-family: 宋体;">、</span><span lang="EN-US">XCAP</span><span style="font-family: 宋体;">的</span><span lang="EN-US"> URI</span><span style="font-family: 宋体;">的组成</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">XCAP</span><span style="font-family: 宋体;">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体;">映射分成两个部分：文档选择器（</span><span lang="EN-US">Document selector</span><span style="font-family: 宋体;">）与节点选择器</span><span lang="EN-US">(Node selector )</span><span style="font-family: 宋体;">，