zoukankan      html  css  js  c++  java
  • Framework WebService Axis / Xfire / CXF / JAXWS / JAXRPC / Digester

    一月收集几个有用的谷歌Chrome插件  postman for webservice

    http://www.poluoluo.com/jzxy/201301/194875.html

    Postman – REST Client

     

    Postman是一个工具的帮助开发人员提高工作效率的API,他是一个功能强大的的HTTP REST客户端,是前端模拟发送数据/调试的好工具。

     

    WebService JAX-RPC / JAX-WS

    Web 服务提示与技巧: JAX-RPC 与 JAX-WS 的比较
    http://www.ibm.com/developerworks/cn/webservices/ws-tip-jaxwsrpc.html
    引言
    Russell Butek (butek@us.ibm.com), IT 专家, EMC
    Nicholas Gallardo (nlgallar@us.ibm.com), 软件工程师, EMC
    简介:
    JAX-WS 2.0 是 JAX-RPC 1.1 的后续版本。
    本文将引出对这两个 Java Web 服务编程模型进行比较的一系列文章。
    Russell Butek 是 IBM 的一名 SOA 和 Web 服务顾问。
    他曾是 IBM WebSphere Web 服务引擎的开发人员之一。
    他也是 JAX-RPC Java Specification Request (JSR) 专家组的成员。
    他参与了 Apache 的 AXIS SOAP 引擎的实现,并推动 AXIS 1.0 遵守 JAX-RPC。

     

     

    Digester

    http://commons.apache.org/digester/

    Digester API 2.0

    http://commons.apache.org/digester/commons-digester-2.0/docs/api/

    Digester Example

    http://www.ibm.com/developerworks/java/library/j-lucene/

    Digester Download

    http://commons.apache.org/digester/download_digester.cgi?Preferred=http%3A%2F%2Flabs.xiaonei.com%2Fapache-mirror

    http://labs.xiaonei.com/apache-mirror/commons/digester/binaries/commons-digester-2.0-bin.tar.gz

    http://labs.xiaonei.com/apache-mirror/commons/digester/binaries/commons-digester-2.0-bin.zip

    http://labs.xiaonei.com/apache-mirror/commons/digester/source/commons-digester-2.0-src.tar.gz

    http://labs.xiaonei.com/apache-mirror/commons/digester/source/commons-digester-2.0-src.zip

     

    Web Service 性能测试工具   soapUI , Jmeter

    http://www.51testing.com/?action_viewnews_itemid_93122.html

    计时机制

    JMeter 用的是System.currentTimeMillis();

    soapUI用的是System.nanoTime();    soapUI-x32-4_0_0.exe

     

    几种基于HTTP协议的RPC性能比较

    http://jspengxue.iteye.com/blog/48124

     

    WebService是用牺牲性能来换取跨平台的远程过程调用或者消息交换的。由于采用了SOAP这样的标准协议,才可能得到很多支持。如果你绕过SOAP,你的东西就不能称为WebService的了,但可以算是借鉴了它的实现思想的一种结构。

    比如你完全可以基于底层的协议来实现internet上2个程序之间的交互,但是这个开发量很大的。因为基于SOAP的Webservice已经得到了几 乎所有的开发工具的支持,所以开发量就小多了,它解决了不同语言的数据结构不同的问题,比如你可以用java写一个方法,在服务器端发布成一个 Webservice,而另外的人可以用delphi,c#等各种支持标准webservice的语言来调用你用java写的方法,而不用关心java的 String和delphi的TString在内存里是不同的东西。   
      至于性能,由于不知道你的应用是什么应用,Webservice的性能比直接调用方法肯定要慢,毕竟要把数据组织成XML,但是在目前的硬件性能下,这些已经不是瓶颈了。倒是对带宽的要求比较高一些。毕竟XML比较大。   

    referrence

    http://www.w3.org/2002/ws/  Web Services Activity

    http://blog.sina.com.cn/s/blog_4d6be6f301000bsz.html

    http://blog.csdn.net/kay5804/archive/2008/05/04/2382428.aspx

    http://hi.baidu.com/lioliang/blog/item/03e134a4887e1ef29152ee6a.html

    http://www.blogjava.net/zhuyuanxiang/archive/2008/03/03/183377.html

     

     

    download axis1.4

    http://apache.mirror.phpchina.com/ws/axis/1_4/

    http://apache.mirror.phpchina.com/ws/axis/1_4/axis-bin-1_4.zip

    http://apache.mirror.phpchina.com/ws/axis/1_4/axis-src-1_4.zip  

    copy

    D:\program\webService\axis\axis-bin-1_4\axis-1_4\webapps\axis

    to

    D:\tomcat5\webapps\axis

    download other jars 

    mail.jar: D:\program\webService\axis\javamail-1.4.1\mail.jar

    http://java.sun.com/products/javamail/downloads/index.html

    http://java.sun.com/products/javabeans/glasgow/jaf.html

    Activation.jar : D:\program\webService\axis\jaf-1.0.2\activation.jar

    http://java.sun.com/products/javabeans/jaf/downloads/index.html

     

    xmlsec.jar: D:\program\webService\axis\xml-security-1_4_2\libs\xmlsec-1.4.2.jar

     

    http://xml.apache.org/security/dist/java-library/  

     

    to

    D:\tomcat5\webapps\axis

    deploy

    http://localhost:8080/axis

    info

    http://localhost/axis/happyaxis.jsp

     

    Needed Components

    • Found SAAJ API ( javax.xml.soap.SOAPMessage ) at D:\tomcat5\webapps\axis\WEB-INF\lib\saaj.jar
    • Found JAX-RPC API ( javax.xml.rpc.Service ) at D:\tomcat5\webapps\axis\WEB-INF\lib\jaxrpc.jar
    • Found Apache-Axis ( org.apache.axis.transport.http.AxisServlet ) at D:\tomcat5\webapps\axis\WEB-INF\lib\axis.jar
    • Found Jakarta-Commons Discovery ( org.apache.commons.discovery.Resource ) at D:\tomcat5\webapps\axis\WEB-INF\lib\commons-discovery-0.2.jar
    • Found Jakarta-Commons Logging ( org.apache.commons.logging.Log ) at D:\tomcat5\bin\commons-logging-api.jar
    • Found Log4j ( org.apache.log4j.Layout ) at D:\tomcat5\webapps\axis\WEB-INF\lib\log4j-1.2.8.jar
    • Found IBM's WSDL4Java ( com.ibm.wsdl.factory.WSDLFactoryImpl ) at D:\tomcat5\webapps\axis\WEB-INF\lib\wsdl4j-1.5.1.jar
    • Found JAXP implementation ( javax.xml.parsers.SAXParserFactory ) at an unknown location
    • Found Activation API ( javax.activation.DataHandler ) at D:\tomcat5\webapps\axis\WEB-INF\lib\activation.jar

    Optional Components

    • Found Mail API ( javax.mail.internet.MimeMessage ) at D:\tomcat5\webapps\axis\WEB-INF\lib\mail.jar
    • Found XML Security API ( org.apache.xml.security.Init ) at D:\tomcat5\webapps\axis\WEB-INF\lib\xmlsec-1.4.2.jar
    • Found Java Secure Socket Extension ( javax.net.ssl.SSLSocketFactory ) at an unknown location

    http://fsun.iteye.com/blog/80180  

    AXIS Service Config Sucess!

     

    AXIS Service test

    将SayHello.java改为SayHello.jws放入D:\tomcat5\webapps\axis\

    //package com.lindows.service;
    
    
    //AxisService 基本数据类型
    
    
    public class SayHello {
    
    
    	// 这个类没有包,注意了.
    
    
    	public String say(String name) {
    
    
    		return " Hello ~~" + name;
    
    
    	}
    
    
    }
    
    
    

    http://localhost/axis/SayHello.jws  ok

    AXIS Client test

     

    package com.lindows.client;
    import java.rmi.RemoteException;
    import javax.xml.rpc.ServiceException;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    
    public class SayHello {
    
    
    
    
    
    	/**
    
    
    	 * @param args
    
    
    	 * @author Lindows
    
    
    	 * 普通数据类型
    
    
    	 */
    
    
    	public static void main(String[] args) {
    
    
    
    		String urlname = "http://localhost/axis/SayHello.jws";
    
    
    		/*
    
    
    		 * 这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
    
    
    		 * http://localhost/axis/SayHello.jws?wsdl
    
    
    		 */
    
    
    		Service s = new Service();
    
    
    		try {
    
    
    			Call call = (Call) s.createCall();
    
    
    			// 调用的目标url
    
    
    			call.setTargetEndpointAddress(urlname);
    
    
    			// 调用的方法名
    
    
    			call.setOperationName("say");
    
    
    			// 设置调用方法参数
    
    
    			String val = (String) call.invoke(new Object[] { "我是 Lindows" });
    
    
    			System.out.println("这里是服务器返回给你的:>>>" + val);
    
    
    		} catch (ServiceException e) {
    
    
    			e.printStackTrace();
    
    
    		} catch (RemoteException e) {
    
    
    			e.printStackTrace();
    
    
    		}
    
    
    	}
    
    
    }
    
    
    

     

    run: 这里是服务器返回给你的:>>> Hello ~~我是 Lindows ok

     


    JavaSE6.0 Web Service学习笔记

    http://cissco.iteye.com/blog/221108

    Web Service概述

    Web Service的定义
    W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。

    这 里我们从一个程序员的视角来观察web service。在传统的程序编码中,存在这各种的函数方法调用。通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数 P,方法A执行完毕后,返回处理结果R。这种函数或方法调用通常发生在同一台机器上的同一程序语言环境下。现在的我们需要一种能够在不同计算机间的不同语 言编写的应用程序系统中,通过网络通讯实现函数和方法调用的能力,而Web service正是应这种需求而诞生的。

    最普遍的一种说 法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系 统间的计算服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。
    下面,我们先来熟悉一下SOAP协议,看看它是如何描述程序中的函数方法、参数及结果对象的。

    SOAP协议简介

    什么是SOAP
    SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
    • Envelope 元素,标识XML 文档一条 SOAP 消息
    • Header 元素,包含头部信息的XML标签
    • Body 元素,包含所有的调用和响应的主体信息的标签
    • Fault 元素,错误信息标签。

    以上的元素都在 SOAP的命名空间http://www.w3.org/2001/12/soap-envelope中声明;
    SOAP的语法规则
    • SOAP 消息必须用 XML 来编码
    • SOAP 消息必须使用 SOAP Envelope 命名空间
    • SOAP 消息必须使用 SOAP Encoding 命名空间
    • SOAP 消息不能包含 DTD 引用
    • SOAP 消息不能包含 XML 处理指令

    SOAP 消息的基本结构
    Java代码 复制代码
    1. <? xml version= "1.0" ?>   
    2. <soap:Envelope   
    3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    5. <soap:Header>   
    6.   ...   
    7.   ...   
    8. </soap:Header>   
    9. <soap:Body>   
    10.   ...   
    11.   ...   
    12.   <soap:Fault>   
    13.     ...   
    14.     ...   
    15.   </soap:Fault>   
    16. </soap:Body>   
    17. </soap:Envelope>  
    Java代码 复制代码
    1. <? xml version= "1.0" ?>  
    2. <soap:Envelope  
    3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >  
    5. <soap:Header>  
    6.   ...  
    7.   ...  
    8. </soap:Header>  
    9. <soap:Body>  
    10.   ...  
    11.   ...  
    12.   <soap:Fault>  
    13.     ...  
    14.     ...  
    15.   </soap:Fault>  
    16. </soap:Body>  
    17. </soap:Envelope>  
    <? xml version="1.0"?>
    
    
    <soap:Envelope
    
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
    
    <soap:Header>
    
    
      ...
    
    
      ...
    
    
    </soap:Header>
    
    
    <soap:Body>
    
    
      ...
    
    
      ...
    
    
      <soap:Fault>
    
    
        ...
    
    
        ...
    
    
      </soap:Fault>
    
    
    </soap:Body>
    
    
    </soap:Envelope>


    SOAP Envelope 元素
    Envelope 元素是 SOAP 消息的根元素。它指明 XML 文档是一个SOAP 消息。它的属性 xmlns:soap的值必须是http://www.w3.org/2001/12/soap-envelope。
     encodingStyle 属性,语法:soap:encodingStyle="URI"
    encodingStyle 属性用于定义文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。
    Java代码 复制代码
    1. <? xml version= "1.0" ?>   
    2. <soap:Envelope   
    3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    5.   ...   
    6.   Message information goes here   
    7.   ...   
    8. </soap:Envelope>  
    Java代码 复制代码
    1. <? xml version= "1.0" ?>  
    2. <soap:Envelope  
    3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >  
    5.   ...  
    6.   Message information goes here  
    7.   ...  
    8. </soap:Envelope>  
    <? xml version="1.0"?>
    
    
    <soap:Envelope
    
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
    
      ...
    
    
      Message information goes here
    
    
      ...
    
    
    </soap:Envelope>


    SOAP Header 元素

    • actor 属性,语法soap:actor="URI"

    通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。

    • mustUnderstand 属性 ,语法soap:mustUnderstand="0|1"

    SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则要求处理此头部的接收者必须认可此元素。
    Java代码 复制代码
    1. <? xml version= "1.0" ?>   
    2. <soap:Envelope   
    3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    5. <soap:Header>   
    6. <m:Trans   
    7. xmlns:m= "http://www.jsoso.net/transaction/"     
    8. soap:mustUnderstand= "1"     
    9. soap:actor="http: //www.w3schools.com/appml/ “  >234</m:Trans>   
    10. </soap:Header>   
    11. ...   
    12. ...   
    13. </soap:Envelope>  
    Java代码 复制代码
    1. <? xml version= "1.0" ?>  
    2. <soap:Envelope  
    3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >  
    5. <soap:Header>  
    6. <m:Trans  
    7. xmlns:m="http://www.jsoso.net/transaction/"    
    8. soap:mustUnderstand="1"    
    9. soap:actor="http://www.w3schools.com/appml/ “  >234</m:Trans>   
    10. </soap:Header>  
    11. ...  
    12. ...  
    13. </soap:Envelope>  
    <? xml version="1.0"?>
    
    
    <soap:Envelope
    
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
    
    <soap:Header>
    
    
    <m:Trans
    
    
    xmlns:m="http://www.jsoso.net/transaction/" 
    
    
    soap:mustUnderstand="1" 
    
    
    soap:actor="http://www.w3schools.com/appml/ “  >234</m:Trans>
    
    
    </soap:Header>
    
    
    ...
    
    
    ...
    
    
    </soap:Envelope>


    SOAP Body 元素
    必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。Body元素中既可以包含SOAP定义的命名空间中的元素,如Fault,也可以是用户的应用程序自定义的元素。以下是一个用户定义的请求:
    Java代码 复制代码
    1. <? xml version= "1.0" ?>   
    2. <soap:Envelope   
    3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    5. <soap:Body>   
    6.    <m:GetPrice xmlns:m= "http://www.jsoso.net/prices" >   
    7.       <m:Item>Apples</m:Item>   
    8.    </m:GetPrice>   
    9. </soap:Body>   
    10. </soap:Envelope>  
    Java代码 复制代码
    1. <? xml version= "1.0" ?>  
    2. <soap:Envelope  
    3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding" >  
    5. <soap:Body>  
    6.    <m:GetPrice xmlns:m="http://www.jsoso.net/prices" >  
    7.       <m:Item>Apples</m:Item>  
    8.    </m:GetPrice>  
    9. </soap:Body>  
    10. </soap:Envelope>  
    <? xml version="1.0"?>
    
    
    <soap:Envelope
    
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
    
    <soap:Body>
    
    
       <m:GetPrice xmlns:m="http://www.jsoso.net/prices">
    
    
          <m:Item>Apples</m:Item>
    
    
       </m:GetPrice>
    
    
    </soap:Body>
    
    
    </soap:Envelope>

    上面的例子请求苹果的价格。请注意,上面的 m:GetPrice 和 Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。而对应的 SOAP 响应应该类似这样:
    Java代码 复制代码
    1. <?xml version= "1.0" ?>   
    2. <soap:Envelope   
    3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    5. <soap:Body>   
    6.    <m:GetPriceResponse xmlns:m= "http://www.jsoso.net/prices" >   
    7.       <m:Price> 1.90 </m:Price>   
    8.    </m:GetPriceResponse>   
    9. </soap:Body>   
    10. </soap:Envelope>  
    <?xml version="1.0"?>
    
    
    <soap:Envelope
    
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
    
    <soap:Body>
    
    
       <m:GetPriceResponse xmlns:m="http://www.jsoso.net/prices">
    
    
          <m:Price>1.90</m:Price>
    
    
       </m:GetPriceResponse>
    
    
    </soap:Body>
    
    
    </soap:Envelope>


    SOAP Fault 元素
    Fault 元素表示 SOAP的错误消息。它必须是 Body 元素的子元素,且在一条 SOAP 消息中,Fault 元素只能出现一次。Fault 元素拥有下列子元素:

    常用的SOAP Fault Codes


    HTTP协议中的SOAP 实例
    下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中: "http://www.jsoso.net/stock"
    • SOAP 请求:(注意HTTP的Head属性)

    Java代码 复制代码
    1. POST /InStock HTTP/ 1.1   
    2. Host: www.jsoso.net   
    3. Content-Type: application/soap+xml; charset=utf- 8   
    4. Content-Length: XXX   
    5.   
    6. <? xml version= "1.0" ?>   
    7. <soap:Envelope   
    8. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    9. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    10.   <soap:Body xmlns:m= "http://www.jsoso.net/stock" >   
    11.     <m:GetStockPrice>   
    12.       <m:StockName>IBM</m:StockName>   
    13.     </m:GetStockPrice>   
    14.   </soap:Body>     
    15. </soap:Envelope>  
    Jav
    POST /InStock HTTP/1.1
    
    
    Host: www.jsoso.net
    
    
    Content-Type: application/soap+xml; charset=utf-8
    
    
    Content-Length: XXX
    
    
    
    
    
    <? xml version="1.0"?>
    
    
    <soap:Envelope
    
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
    
      <soap:Body xmlns:m="http://www.jsoso.net/stock">
    
    
        <m:GetStockPrice>
    
    
          <m:StockName>IBM</m:StockName>
    
    
        </m:GetStockPrice>
    
    
      </soap:Body>  
    
    
    </soap:Envelope>
    
    
    


    • SOAP 响应:(注意HTTP的Head属性)

    Java代码 复制代码
    1. HTTP/ 1.1   200  OK   
    2. Content-Type: application/soap+xml; charset=utf- 8   
    3. Content-Length: XXX   
    4.   
    5. <? xml version= "1.0" ?>   
    6. <soap:Envelope   
    7. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
    8. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
    9.   <soap:Body xmlns:m= "http://www.jsoso.net/stock" >   
    10.     <m:GetStockPriceResponse>   
    11.       <m:Price> 34.5 </m:Price>   
    12.     </m:GetStockPriceResponse>   
    13.   </soap:Body>     
    14. </soap:Envelope>  
    HTTP/1.1 200 OK
    
    
    Content-Type: application/soap+xml; charset=utf-8
    
    
    Content-Length: XXX
    
    <? xml version="1.0"?>
    
    <soap:Envelope
    
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
    
      <soap:Body xmlns:m="http://www.jsoso.net/stock">
    
        <m:GetStockPriceResponse>
    
          <m:Price>34.5</m:Price>
    
        </m:GetStockPriceResponse>
    
      </soap:Body>  
    
    </soap:Envelope>


    HTTP协议中的SOAP RPC工作流程


    WSDL简介
    介绍过了SOAP,让我们关注Web Service中另外一个重要的组成WSDL。
    WSDL的主要文档元素

     

     

     

    几种基于HTTP协议的RPC性能比较

    http://jspengxue.iteye.com/blog/48124

     

    有 了整体的了解后,可以发现Hessian的这个远程过程调用,完全使用动态代理来实现的,其实从客户端代码不难看 出,HessianProxyFactory的create方法就是创建接口Basic的代理类,该类实现了Basic接口,JDK的proxy类会自动 用 InvocationHandler 的实现类(该类在Hessian中表现为HessianProxy)的invoke方法体 来填充所生成代理类的方法体,从而实现远程调用,传输过程使用的是基于Http的二进制字节流。

    RMI与Hessian的调用过程比较:

    Java代码
    Hessian:客户端(basic.hello())——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果
    
    
    RMI:客户端——>stub——>序列化——>skeleton——>远程方法——>序列化——>stub—— >输出结果



    服务端的是一个简单的加密、解密方法,各种协议使用同一个实现的代码。
    客户端是独立的java程序,分别用各种协议对服务端的方法进行调用。每一种协议循环调用n次,然后取平均值。

    循环1,000次的测试
    第一次

    Java代码
    Axis --------------->> Total time: 11123 ms, Avg time: 11.123 ms
    
    Burlap ------------->> Total time:   866 ms, Avg time:  0.866 ms
    
    Hessian ------------>> Total time:   581 ms, Avg time:  0.581 ms
    
    REST --------------->> Total time:   929 ms, Avg time:  0.929 ms
    
    AxisUsingWSDL2Java ->> Total time: 11998 ms, Avg time: 11.998 ms



    第二次

    Java代码
    Axis --------------->> Total time: 11256 ms, Avg time: 11.256 ms
    
    Burlap ------------->> Total time:   816 ms, Avg time:  0.816 ms
    
    Hessian ------------>> Total time:   582 ms, Avg time:  0.582 ms
    
    REST --------------->> Total time:   919 ms, Avg time:  0.919 ms
    
    
    AxisUsingWSDL2Java ->> Total time: 11908 ms, Avg time: 11.908 ms



    循环10,000次的测试
    第一次

    Java代码
    Axis --------------->> Total time:  88013 ms, Avg time:  8.8013 ms
    
    Burlap ------------->> Total time:   5789 ms, Avg time:  0.5789 ms
    
    Hessian ------------>> Total time:   5162 ms, Avg time:  0.5162 ms
    
    REST --------------->> Total time:   8316 ms, Avg time:  0.8316 ms
    
    AxisUsingWSDL2Java ->> Total time: 112801 ms, Avg time: 11.2801 ms



    第二次

    Java代码
    Axis --------------->> Total time:  87359 ms, Avg time:  8.7359 ms
    
    Burlap ------------->> Total time:   5784 ms, Avg time:  0.5784 ms
    
    Hessian ------------>> Total time:   5084 ms, Avg time:  0.5084 ms
    
    REST --------------->> Total time:   7983 ms, Avg time:  0.7983 ms
    
    AxisUsingWSDL2Java ->> Total time: 113234 ms, Avg time: 11.3234 ms


    测试结果
    Hessian最快,Burlap第二,REST第三,Axis最慢。前3种要比Axis快了10倍或者更多。

    上面的测试,服务端用的是Resin-3.0.13,出于好奇,我又用Tomcat-5.5.9测试了一把,结果是Resin确实比Tomcat快些。 Tomcat-5.5.9 循环10,000次的测试

    Java代码
    1. Axis --------------->> Total time:  122551  ms, Avg time:  12 .2551ms  
    2. Burlap ------------->> Total time:   6401  ms, Avg time:   0 .6401ms  
    3. Hessian ------------>> Total time:   5745  ms, Avg time:   0 .5745ms  
    4. REST --------------->> Total time:   8090  ms, Avg time:   0 .809ms  
    5. AxisUsingWSDL2Java ->> Total time: 156908  ms, Avg time:  15 .6908ms 
     
    http://www.open-open.com/31.htm
     Xerces 
    Xerces是由Apache组织所推动的一项XML文档解析开源项目,它目前有多种语言版本包括JAVA、C++、PERL、COM等。

    更多Xerces信息

     JDOM 
    JDOM 是一种面向Java的读、写和操作XML文档的API。JDOM 与现行的SAX 和DOM标准兼容,为Java 程序员提供了一个简单、轻量的XML文档操作方法。由于JDOM是专门为Java 程序员开发的,所以采用许多Java语言的优秀特性,比如方法重载、集合(Collections)和类映射(Reflection)。

    更多JDOM信息

     dom4j 
    Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

    更多dom4j信息

     XOM 
    XOM虽然也是一种面向对象的XML API,类似于DOM 的风格,但是它有一些与众不同的特性比如严格保持内存中对象的不变性,从而使XOM实例总是能序列化为正确的XML。此外,与其他Java XML API相比,XOM 追求更简单和更正规。

    更多XOM信息

     JiBX 
    JiBX是一个为Java提供的XML数据绑定框架。它可以和现存的类一起运行,使用一个灵活的映射定义文件来决定如何将数据对象转换成XML。

    更多JiBX信息

     KXML 
    KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。它有以下性能:  
    · 支持XML名称空间   
    · 用"松散"模式分析HTML或其它SGML格式   
    · 占用很少的存储空间(21 kbps)   
    · 基于Pull的分析   
    · 支持XML写操作   
    · 可选的DOM支持   
    · 可选的WAP支持

    更多KXML信息

     XMLBeans 
    XMLBeans是一个XML-Java绑定工具,利用它可以很方便地解析XML文档。Eclipse支持插件: xmlbeansplug (在线更新 地址 )。

    更多XMLBeans信息

     jConfig 
    因 为properties的局限性,有时候得使用XML文件来定义应用的配置参数,jConfig 正是这样一个读写XML配置文件的工具。开发者在 Java 程序中只需要使用get/set方法就能读取修改 XML 文件中的配置参数。jConfig 目前只支持两层结构,最新版本为 2.3。

    更多jConfig信息

     XStream 
    XStream使用起来非常简单,不需要预先生成相关的辅助类,不需要映射文件。当然,使用简单也注定了它只能处理简单结构的 XML 文件。

    更多XStream信息

     XJR 
    一个XML的Java绑定框架,它的主要特点是不需要映射文件,用XJRDTDCompiler直接通过DTD文件生成Java文件,也可以用 XJRDTDCreator对Java类处理生成DTD文件。当然也有不足,就是还不支持Schema。

    更多XJR信息

     Piccolo XML Parser 
    Piccolo是利用java快速解析XML文档的开源项目。它实现 SAX 1, SAX 2.0.1, and JAXP 1.1 接口作为一个(Non-validating)非验证剖析器。

    更多Piccolo XML Parser信息

     NanoXML 
    NanoXML是一个能在CLDC 环境下运行的开放源代码非确认性(不做验证工作直接进行解析)的XML 分析器。Nanoxml是一步解析器(非常小6KB的XML解析器),一次就把文档解析完并以一个树状的结构传回。

    更多NanoXML信息

     XP Parser 
    XP是一个Java开发的XML1.0解析器.它当前是一个非验证解析器,然而它可以解析所有外部实休:外部DTD子集,外部参数实体,普通的外部实体.

    更多XP Parser信息

     Commons-Digester 
    Digester基于规则的XML文档解析,主要用于XML到Java对象的映射.

    更多Commons-Digester信息

     NunniMJAX 
    NunniMJAX是一个Java非验证XML解析器。它的APIs与功能类似于SAX.这意味着你如果熟悉SAX你将很容易掌握这个解析器。

    更多NunniMJAX信息

     Crimson 
    Crimson是一个基于Java的XML解析器.它通过JAXP1.1,SAX2.0,SAX2扩展版本1.0,DOM Level 2 Core Recommendation来支持XML1.0.

    更多Crimson信息

     JOX 
    JOX是一组Java类库,它使得在XML文档与Java Beans之间进行数据转换变得容易.你可以把JOX想象成Java对象序列化(Java Object Serialization)的一个种特殊形式,利用XML作为序列化的格式.

    更多JOX信息

     JaxMe 
    JaxMe是对JAXB(Java/XML绑定规范)的一种开放源代码实现。它对基本的JAXB 规范作了一些改进之外并且集成了数据库和Enterprise JavaBeans.

    更多JaxMe信息

     XMLConfigReader  
    XMLConfigReader是对Java ResourceBundle类的一个开源扩展.利用它可以直接从XML文件中读取配置数据并把数据存储在一个HashTable中.

    更多XMLConfigReader 信息

     JVoiceXML 
    JVoiceXML一个开源的VoiceXML解析器.

    更多JVoiceXML信息

     Woodstox 
    Woodstox是一个快速开源且符合StAX(STreaming Api for Xml processing)规范的XML处理器(做为一个处理器意味着它可以处理输入(相当于解析)与输出(相当于写入,序列化))。

    更多Woodstox信息

     xalan 
    xalan- java是一套xslt处理器,用来将XML文件转换为HTML,TEXT和XML等其他类型文件格式。支持XSLT1.0和XPATH 1.0版。开发人员可以通过命令行方式或在JAVA APPLET和SERVLET中使用,并可以作为自己开发的应用程序的类库使用。xalan-java实现的是transformation API for XML(TRaX)接口,此接口为jaxp1.2标准中的一部分。

    更多xalan信息

     XmlIO 
    XmlIO是一个利用SAX来解析XML然后创建Java对象并同时调用这些对象 setter 方法的框架.这个框架还能够把一张包含有单个根节点的Java对象图序列化成XML格式的字符串。

    更多XmlIO信息

     VTD-XML 
    VTD-XML是一种新的XML处理API,它能够克服DOM和SAX的一些问题。VTD-XML能够在内存中对XML进行快速检查并提供XPath查询支持。 在它的主页上有详细的API描述,源代码,文档和例子。

    更多VTD-XML信息

     Nux 
    Nux 是一个开源的Java工具,它能够让XML高效处理变得容易。Nux可嵌入到具有高吞吐量的XML消息中间件中比如:大型p2p底层结构,消息队列,发布 -订阅和Blogs/新闻聚合的matchmaking系统,分布式系统,防火墙等.Nux集成并扩展XOM,Saxon和Lucene这些优秀的开源组 件包以提供XQuery/XPath,全文本搜索等功能。

    更多Nux信息

     StAX 
    StAX(Streaming API for XML)是标准的XML处理API,它能够从应用程序的stream对象解析XML数据或把XML数据转换成stream对象。StAX是一个用Java实现的XML拉式解析器。

    更多StAX信息

     Skaringa 
    Skaringa提供一个类库实现Java object与XML文档的相互转换,并能够为Java class生成XML schema定义。

    更多Skaringa信息

     X2JB 
    X2JB是一个Java开发类包用于把XML映射成Java实体。实际上它与JAXB、XML Beans、Jakarta Commons Digester 等相似但没有它们复杂。X2JB使用注释(annotation)来映射XML元素和元素属性。

    更多X2JB信息

     Smooks 
    Smooks 用于处理XML与非XML(CSV,EDI,Java等)的一个Java框架与引擎。Smooks能够用于各种数据格式的转换:XML to XML,CSV to XML,EDI to XML,XML to EDI,XML to CSV,Java to XML,Java to EDI,Java to CSV,Java to Java,XML to Java,EDI to Java等。

    更多Smooks信息

     WAX 
    WAX 是一个用于创建大型XML文档的高效工具。与其它XML操作类库(如JDOM)相比,它占用的内存比较少。创建XML所需要的代码也比较少。只关注创建功 能,而没有读取/解析功能。整个类库只有12K左右。特别适合用于创建基于REST或SOAP Web Service的请求与响应信息。

    更多WAX信息

       共 2 页『   1    2   』
     

    end

  • 相关阅读:
    wireshark无法捕获无线网卡数据解决办法(failed to set hardware filter to promiscuous mode)
    用PHP检测用户是用手机(Mobile)还是电脑(PC)访问网站
    一次.net Socket UDP编程的10万客户端测试记录
    对象复制
    c#中volatile关键字的作用
    C#操作XML
    ASP.NET AJAX
    C#操作XMl2
    SQLServer 存储过程中不拼接SQL字符串实现多条件查询
    ASP.NET刷新页面的六种方法20081111 22:04asp.net页面刷新重是有问题,收藏几种方法挺有用的.
  • 原文地址:https://www.cnblogs.com/lindows/p/14390655.html
Copyright © 2011-2022 走看看