??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品大全,欧美日韩亚洲国产综合,久久久国产精华http://www.aygfsteel.com/stevenjohn/category/53248.html那些青春的岁?/description>zh-cnWed, 03 Apr 2013 02:59:40 GMTWed, 03 Apr 2013 02:59:40 GMT60Soap中RPC-style和Document-style http://www.aygfsteel.com/stevenjohn/archive/2013/04/02/397298.htmlabinabinTue, 02 Apr 2013 07:26:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/04/02/397298.htmlhttp://www.aygfsteel.com/stevenjohn/comments/397298.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/04/02/397298.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/397298.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/397298.html

主要是思维方式的不同: 

昄QRPC是以Ҏ(gu)调用的方式描qWebSerivce的,也就是说Q你要说清楚调用的那个方法,以及各个参数的名U和倹{要描述q些东东QSOAP消息p有一个统一的规范,指出那一部分是方法名Q哪个部分是参数Q哪个部分是q回倹{换句话_RPC方式调用的SOAP消息格式是有章可循的Q固定的。(比如_每个Parameter必须对应一个PartQPart的name必须和参数名一_?nbsp;

而Document则是以文档传输的方式描述WebServiceQ只要你的SoapBody里面是一个可以用Schema描述的合法的Xml文档p了,对具体的格式没有什么要求(Schema要在WSDL里面写)?nbsp;

可以看出QDocument形式要更加灵z?#8212;—其是需要传输特定格式的Xml文档的时候,而RPC的Soap消息实际上也可以用Document形式模拟Q只要Schema定义得当Q。所以目前Document方式应用更广泛一些(也是.NET里面的缺省方式)?nbsp;

对NamespaceQ我觉得两者应该没有明昄区别。主要是RPC通常与Encoding模式l合使用Q这p引用Soap的namespace了;而Document只要引用XmlSchema的Namespace定义cd成了?/p>

abin 2013-04-02 15:26 发表评论
]]>
SOAP风格?RPC与Document的区?http://www.aygfsteel.com/stevenjohn/archive/2013/04/02/397291.htmlabinabinTue, 02 Apr 2013 07:02:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/04/02/397291.htmlhttp://www.aygfsteel.com/stevenjohn/comments/397291.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/04/02/397291.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/397291.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/397291.html管是{载的Q但是原文中几处错误或者不规范的表达,我已l进行了修改?/span>
 
大部?/span> Web 服务都是围绕着q程q程调用而构建的Q?/span> WSDL 规范允许另外一U?/span> Web 服务体系l构Q文档样式( document style Q。在该体pȝ构中Q整个文档在服务客户端和服务器之间进行交换。在本文中, James McCarthy 向(zhn)解释文档样式以及应该何时用它?/span>
?/span> Web 服务描述语言Q?/span> Web Service Definition Language Q?/span> WDSL Q规范中隐含着一个非常y妙的转换开养I它可以将 Web 服务?/span> SOAP l定从远E过E调用{换成 pass-through 文档。在 SOAP 协议l定中的样式属性可以包含这两个g的一个: rpc ?/span> document 。当属性被讑֮为文档样式时Q客L(fng)知道应该使用 XML 模式而不是远E过E调用约定。本文将提供对这?/span> WSDL 转换开关的说明Q描q它的好处,q将解释应该何时使用 pass-through 文档?/span>
首先Q让我们要地谈谈 WSDL 的一些要点,来理解这个y妙的转换是如何发生的?/span> WSDL 是一?/span> XML 规范Q它被用来描qWeb服务以及对于到达端点Q服务)的协议相关的需求?/span> WSDL 用抽象术语来描述服务Q通过可扩展的l定定义Q它能够Z用具体术语调用服务定义协议和数据格式规范。下面的语法是直接从 WSDL 规范中摘 录出来的Q展CZ在绑定中所包含的可扩展性元素:

<wsdl:definitions .... >
    <wsdl:binding name="nmtoken" type="qname"> *
        <-- extensibility element (1) --> *
        <wsdl:operation name="nmtoken"> *
           <-- extensibility element (2) --> *
           <wsdl:input name="nmtoken"? > ?
               <-- extensibility element (3) -->
           </wsdl:input>
           <wsdl:output name="nmtoken"? > ?
               <-- extensibility element (4) --> *
           </wsdl:output>
           <wsdl:fault name="nmtoken"> *
               <-- extensibility element (5) --> *
           </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
</wsdl:definitions>

 
WSDL 规范通常描述三种l定扩展Q?/span> HTTP GET/POST ?/span> MIME 以及 SOAP version 1.1 ?/span> HTTP GET/POST ?/span> MIME 中定义的l定扩展用来定义与标准的 Web 应用E序q行通信的需
求,q些应用E序可能q回Q也可能不返回) XML 文档。在发送或q回 XML 文档Ӟ HTTP GET/POST l定的扩展是隐式的文档样式?/span>
SOAP l定扩展用来定义支持 SOAP 信封协议的服务?/span> SOAP 信封是一U简单模式,它设计成能包?/span> XML 消息Q提供特定于应用E序的消息头和消息体?/span> SOAP l定的扩展 WSDL 文档能够声明 SOAP 消息的需求,q样应用E序p够与服务正确通信?/span> SOAP 扩展允许?/span> SOAP 消息的样式声明ؓ文档?/span> RPC 。如果在 soap:binding 元素中声明了样式属性,那么该样式将成ؓ所有没有显式声明的样式属性的 soap:operation 元素的缺省倹{如果在 soap:binding 元素中没有声明样式属性,那么~省的样式就是文档。下面是文档样式的显式声明:

<soap:binding style="document" transport="uri">

 
不管 soap:binding 元素中的声明如何Q?/span> soap:operation 元素可以覆盖每个操作的声明,像q样的:

 
<soap:operation soapAction="uri" style="document">

 
在声明了文档样式?/span> SOAP 消息中,原始Q?/span> as-is Q或~码Q?/span> encoded Q的消息被直接放|在 SOAP 信封的体部?/span>
如果样式声明?/span> RPC Q消息就装在包装器元素中,同时带有从操作名属性中提取的的元素的名UC及从操作名称I间属性中提取的名U空间?/span>
勿庸|疑Q?/span> XML 调用跨^台的q程q程调用的能力是非常有用的,它是使用 Web 服务的非常有说服力的理由。但是如?/span> Web 服务仅仅局限于 RPC 消息传递,q项技术的影响是有限的。幸q的是,开发h员可以选择是?/span> RPC q是文档样式的消息传递,q且能够使用适合的技术来完成他们面(f)的Q务?/span>
XML 规范开发用来通常锁定于专有格式的常规数据可以以一Uh易读的、自描述的、自验证的开放格式来描述。当 Web 服务使用文档消息传递时Q它可以利用 XML 的全部能力来描述和验证高U业务文档。当服务使用 RPC 消息格式化时Q?/span> XML 描述Ҏ(gu)以及为方法调用编码的参数Q但是却不能用来执行高业务规则。ؓ了执行这些规则, RPC 消息必须包含 XML 文档作ؓ字符串参数ƈ且在被调用的Ҏ(gu)中隐藏验证。出于这个原因, XML 的某些好处就丧失了,或者至是被隐藏在后台应用E序里了?/span>
使用文档消息传递的另外一个原因在于,q程q程调用必须是相寚w态的Qƈ且对接口的Q何变化都破坏服务和应用E序之间的契U。如果服务是q泛分布的,那么很可能大量的应用E序已经从它?/span> WSDL 文档中生了存根代码。改?/span> WSDL 会D所有依赖于特定Ҏ(gu){֐的应用程序被破坏Q而且许多支持行生问题。好的设计要?/span> RPC 消息服务的方法签名不应该改变。用文档消息传递,规则更严|q且可以?/span> XML 模式得到显著增强和改变,同时又不会破坏调用应用程序?/span>
当业务用基?/span> Web 的应用程序通过 Internet 交换信息Ӟ应用E序应该能够使用有保证的交付机制来提高它的可靠性、可伸羃性和性能。ؓ了达到这个目的,应用E序通常用异步消息队列。由于文档消息通常是自包含的,所以它更适合于异步处理,q且可以直接攑ֈ队列中。之所以说应用E序的可靠性得C提高Q是因ؓ即目标应用E序当前不是zd的,消息队列也可以保证消息的交付Q之所以说性能得到了提高,是因?/span> Web 应用E序只是把文档发送到队列中,然后便可以自由地执行其他的Q务;之所以说可扩展性得C提高Q是因ؓ文档被下传到一个或多个应用E序的实例以q行处理?/span>
业务文档的设计通常很好地适于面向对象的体pȝ构。结果,两个应用E序可以设计成通过使用 XML 交换对象的状态。与对象序列化相比,在对象交换中Q交换的每个端点都可以自由地设计它认为合适的对象Q只要交换符合达成协议的 XML 文g格式卛_。不使用对象序列化的一个原因是Z支持对象在客L(fng)和服务器端的实现。许多现有的特定于行业的 XML 模式被设计成客户?/span> / 服务器体pȝ构,在这U体pȝ构中Q在客户端上完成的处理与预定在服务器上完成的处理是分ȝ。通常的情冉|Q客L(fng)仅仅以服务器要求的特定文档格式请求或保存信息。当Ӟq种cd的交换也能用 RPC 消息完成Q但是这U消息的~码方式限制了每个端点上的对象的设计。在文档样式中就不会出现q些限制问题?/span>
什么时候应该用文档样式呢Q简单地_只要没有q接到已存在的远E过E调用,M时候都可以使用文档方式。用文档方式比起通常p额外的工作来q接服务Q好处要大得多。不q需要提醒的是:一般来_构徏一个用文档消息传递的服务的工作量要比构徏一?/span> RPC 消息服务所需的工作量大。这些额外的工作通常包括 XML 模式的设计或对已存在的模式的支持、以及从文档中提取相关的信息。模式设计是重要的,因ؓ XML 解析器用这个模式来验证文档Q支持预定的业务规则。服务需要进行额外的工作来从文档中提取用于处理请求的相关信息。相比之下, RPC 消息只需要设计方法的接口Q通过Ҏ(gu)的接口, RPC 消息可以自动地~组和解l参数?/span>
当?zhn)军_发布一Ҏ(gu)务时Q?zhn)可能应该考虑下列问题。我在下面的部分中分析(zhn)的{案的结果?/span>
  • q项服务是连接到已存在的q程调用Qƈ且这个过E调用是无状态的吗?
  • q项服务是仅在?zhn)的组l内部用,q是也可以被外部用户所使用Q?/span>
  • 参数之一仅仅?/span> XML 文档规范吗?
  • q项服务需要请?/span> / 响应体系l构吗?
  • 参数表示了可以从用于验证?/span> XML 文档模式受益的复杂结构吗Q?/span>
  • 所有需要进行交换的信息都能够合理地存放在内存中吗?
 如果必须以特定的序调用多个q程来维护应用程序状态,(zhn)应该考虑在?zhn)的服务中使用文档体系l构。如果需要多个过E调用,那么q程׃是无状态的Qƈ且服务必ȝ护应用程序状态。在 Web 服务中维护状态可能是困难的;在远E过E调用的情况下,很少有客L(fng)q_会生能够支持状态信息的存根代码。一个可能的解决Ҏ(gu)是用文档体pȝ构,q在文档内部传送整个事务的内容。在q种情况下,服务执行调用,以确保服务内部保持正的序Qƈ且状态信息的l护不超出单个事务的范围。如果仍焉要状态信息,可以状态信息记录在最l得到的文档中,客户端应用程序也可以l护一个用于服务识别它的状态的令牌?/span>
如果一个应用程序被发布到组l以外,发布者就很难控制谁正依赖于这个服务,以及如果做出M改动后果会怎样。在q种情况下,使用文档消息传递和支持?/span> ebXML q样的通用交换协议可能更加有利。通用交换协议正发展成能改善外部交换的理Q因此新的N易合作伙伴协定就可以快速地部v。同P如果(zhn)的服务不需要请?/span> / 响应体系l构Q那么通用交换协议可以更好地设计来处理认证、可靠消息交付以及异步请?/span> / 响应?/span>
如果(zhn)的服务正用字W串参数来传递或q回 XML 文档Q或者它的参C一是一个具有复杂结构且需要自定义处理的对象,那么文档消息传递就可能是较好的选择。将参数的真实含义隐藏在字符串里l常会导致带有无效参数的有效调用。如果服务发布了 XML 文档模式Q那么在调用服务之前Ҏ(gu)q个模式q行验证׃更加Ҏ(gu)。复杂结构经常用来传递组成完整事务的数百条信息。在处理复杂的结构时Q远E过E服务可能不得不处理自定义的~组代码Q同时应用程序仍然负责仔l地验证l构的每个元素。如果用文档消息传递,那么应用E序E序员就可以使用 XML 模式来将验证下传到文档设计器Qƈ且不需要自定义的编l代码?/span>
    择用文档样式的消息传递还?/span> RPC 样式的消息传递时Q需要考虑的最后一个因素是需要处理的信息量大。由于采?/span> RPC 样式的消息传递来~组参数的大部分Q如果不是全部的话)实现都是在内存中执行q项操作Q所以内存约束可能会使得 RPC 消息传递行不通。许多文档消息传递服务能够选择是用 DOM q是?/span> SAX 来处理文档,因而能够最化内存中的处理。这对于 Web 服务ؓ关键Q因为它可能需要处理成千上万的hQ而且其中许多是同时发生的?/span>
在?zhn)设计下一?/span> Web 服务Ӟ(zhn)需要考虑当前?/span> WSDL 规范为?zhn)提供的所有选择。在开始创E性的接口之前Q考虑好将如何使用服务Q谁用它Q以及需要交换的数据的类型和数量。设计开发文档样式的 Web 服务可能需要稍多一些的工作量,但是在很多情况下Q这些额外的工作量将会换取更高的信息质量和更可靠的交换性能?/span>


abin 2013-04-02 15:02 发表评论
]]>
axis2 客户端调用服务器?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394482.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 20 Jan 2013 15:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394482.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/394482.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/394482.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/394482.html</trackback:ping><description><![CDATA[<div>//Ҏ(gu)一Q?br />package com.abin.lir.axis2.client;</div><div></div><div>import org.apache.axiom.om.OMAbstractFactory;</div><div>import org.apache.axiom.om.OMElement;</div><div>import org.apache.axiom.om.OMFactory;</div><div>import org.apache.axiom.om.OMNamespace;</div><div>import org.apache.axis2.AxisFault;</div><div>import org.apache.axis2.addressing.EndpointReference;</div><div>import org.apache.axis2.client.Options;</div><div>import org.apache.axis2.client.ServiceClient;</div><div></div><div>public class UserClient {</div><div><span style="white-space:pre"> </span>public static void main(String[] args) {</div><div><span style="white-space:pre"> </span>try { </div><div><span style="white-space:pre"> </span>ServiceClient sc = new ServiceClient(); </div><div><span style="white-space:pre"> </span>Options opts = new Options(); </div><div><span style="white-space:pre"> </span>opts.setTo(new EndpointReference("http://localhost:9090/universal/services/play")); </div><div><span style="white-space:pre"> </span>opts.setAction("urn:echo"); </div><div><span style="white-space:pre"> </span>opts.setTimeOutInMilliSeconds(10000);</div><div><span style="white-space:pre"> </span>sc.setOptions(opts); </div><div><span style="white-space:pre"> </span>OMElement res = sc.sendReceive(createPayLoad()); </div><div><span style="white-space:pre"> </span>System.out.println(res); </div><div><span style="white-space:pre"> </span>} catch (AxisFault e) { </div><div><span style="white-space:pre"> </span>e.printStackTrace(); </div><div><span style="white-space:pre"> </span>} </div><div><span style="white-space:pre"> </span>}</div><div><span style="white-space:pre"> </span></div><div><span style="white-space:pre"> </span>public static OMElement createPayLoad(){ </div><div><span style="white-space:pre"> </span>OMFactory fac = OMAbstractFactory.getOMFactory(); </div><div><span style="white-space:pre"> </span>OMNamespace omNs = fac.createOMNamespace("http://localhost:9090/universal/services/play", "nsl"); </div><div><span style="white-space:pre"> </span>OMElement method = fac.createOMElement("getPassengerInfos",omNs); </div><div><span style="white-space:pre"> </span>OMElement value = fac.createOMElement("userID",omNs); </div><div><span style="white-space:pre"> </span>value.setText("1024"); </div><div><span style="white-space:pre"> </span>method.addChild(value); </div><div><span style="white-space:pre"> </span>return method; </div><div><span style="white-space:pre"> </span>} </div><div></div><div></div><div></div><div>}<br /><br /><br /><br /><br /><br />//Ҏ(gu)?br /><div>package com.abin.lir.axis2.client;</div><div></div><div>import javax.xml.namespace.QName;</div><div></div><div>import org.apache.axis2.AxisFault;</div><div>import org.apache.axis2.addressing.EndpointReference;</div><div>import org.apache.axis2.client.Options;</div><div>import org.apache.axis2.rpc.client.RPCServiceClient;</div><div></div><div>public class RPCClient {</div><div><span style="white-space:pre"> </span>public static void main(String[] args) throws AxisFault {</div><div><span style="white-space:pre"> </span>  // 使用RPC方式调用WebService         </div><div>        RPCServiceClient serviceClient = new RPCServiceClient(); </div><div>        Options options = serviceClient.getOptions(); </div><div>        // 指定调用WebService的URL </div><div>        EndpointReference targetEPR = new EndpointReference( </div><div>                "http://localhost:9090/universal/services/play"); </div><div>        options.setTo(targetEPR); </div><div>        // 指定Ҏ(gu)的参数?nbsp;</div><div>        Object[] requestParam = new Object[] {"1024"}; </div><div>        // 指定Ҏ(gu)q回值的数据cd的Class对象 </div><div>        Class[] responseParam = new Class[] {String.class}; </div><div>        // 指定要调用的getGreetingҎ(gu)及WSDL文g的命名空?nbsp;</div><div>        QName requestMethod = new QName("http://localhost:9090/universal/services/play", "getPassengerInfos"); </div><div>        // 调用Ҏ(gu)q输Ҏ(gu)的返回?nbsp;</div><div>        try {</div><div><span style="white-space:pre"> </span>System.out.println(serviceClient.invokeBlocking(requestMethod, requestParam, responseParam)[0]);</div><div><span style="white-space:pre"> </span>} catch (AxisFault e) {</div><div><span style="white-space:pre"> </span>e.printStackTrace();</div><div><span style="white-space:pre"> </span>} </div><div><span style="white-space:pre"> </span>}</div><div></div><div>}</div><div></div></div><div><br /><br /><br /><br />//Ҏ(gu)?br /><div><div>package com.abin.lir.axis2.client;</div><div></div><div>import org.apache.axiom.om.OMAbstractFactory;</div><div>import org.apache.axiom.om.OMElement;</div><div>import org.apache.axiom.om.OMFactory;</div><div>import org.apache.axiom.om.OMNamespace;</div><div>import org.apache.axis2.Constants;</div><div>import org.apache.axis2.addressing.EndpointReference;</div><div>import org.apache.axis2.client.Options;</div><div>import org.apache.axis2.client.ServiceClient;</div><div></div><div>public class AXIOMClient {</div><div><span style="white-space:pre"> </span>private static EndpointReference targetEPR = new EndpointReference(</div><div><span style="white-space:pre"> </span>"http://localhost:9090/universal/services/play");</div><div></div><div><span style="white-space:pre"> </span>public static OMElement getPassengerInfos(String symbol) {</div><div><span style="white-space:pre"> </span>OMFactory fac = OMAbstractFactory.getOMFactory();</div><div><span style="white-space:pre"> </span>OMNamespace omNs = fac.createOMNamespace(</div><div><span style="white-space:pre"> </span>"http://localhost:9090/universal/services/play",</div><div><span style="white-space:pre"> </span>"tns");</div><div><span style="white-space:pre"> </span>OMElement method = fac.createOMElement("getPassengerInfos", omNs);</div><div><span style="white-space:pre"> </span>OMElement value = fac.createOMElement("userID", omNs);</div><div><span style="white-space:pre"> </span>value.addChild(fac.createOMText(value, symbol));</div><div><span style="white-space:pre"> </span>method.addChild(value);</div><div><span style="white-space:pre"> </span>return method;</div><div><span style="white-space:pre"> </span>}</div><div></div><div><span style="white-space:pre"> </span>public static void main(String[] args) {</div><div><span style="white-space:pre"> </span>try {</div><div><span style="white-space:pre"> </span>OMElement getPassenger = getPassengerInfos("1024");</div><div><span style="white-space:pre"> </span>Options options = new Options();</div><div><span style="white-space:pre"> </span>options.setTo(targetEPR);</div><div><span style="white-space:pre"> </span>options.setTransportInProtocol(Constants.TRANSPORT_HTTP);</div><div><span style="white-space:pre"> </span>ServiceClient sender = new ServiceClient();</div><div><span style="white-space:pre"> </span>sender.setOptions(options);</div><div><span style="white-space:pre"> </span>OMElement result = sender.sendReceive(getPassenger);</div><div><span style="white-space:pre"> </span>String response = result.getFirstElement().getText();</div><div><span style="white-space:pre"> </span>System.err.println("Current passengers: " + response);</div><div><span style="white-space:pre"> </span>} catch (Exception e) {</div><div><span style="white-space:pre"> </span>e.printStackTrace();</div><div><span style="white-space:pre"> </span>}</div><div><span style="white-space:pre"> </span>}</div><div></div><div>}</div><div></div></div></div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/394482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2013-01-20 23:26 <a href="http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>axis2 客户?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394481.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 20 Jan 2013 15:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394481.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/394481.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/394481.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/394481.html</trackback:ping><description><![CDATA[<h2>http://blog.csdn.net/leo821031/article/details/1545974<br /><div>http://zhangjunhd.blog.51cto.com/113473/25592/</div><div>http://hi.baidu.com/lennydou/item/b57032c0ceb6f5b00c0a7b08</div><div>http://www.cnblogs.com/markxue/archive/2012/09/01/2667123.html</div><div>http://www.aygfsteel.com/zhaozhenlin1224/archive/2010/02/03/311783.html</div><div>http://blog.csdn.net/yhhah/article/details/4158487</div><br /><br /><br /><br /><br /><br /></h2><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/394481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2013-01-20 23:23 <a href="http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis2生成客户端方?Axis2提供的四U调用模?http://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394470.htmlabinabinSun, 20 Jan 2013 12:13:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394470.htmlhttp://www.aygfsteel.com/stevenjohn/comments/394470.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/01/20/394470.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/394470.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/394470.htmlAxis2生成客户端方?/strong>

ZStockQuoteServicecd建客L(fng)的四U方?/font>

构徏ZAXIOM的客L(fng)Q?/font>

使用Axis2 Databinding Frame work(ADB)生成客户端;

使用XMLBeans生成客户端;

使用JiBX生成客户端?/font>

ADBQ最单的生成Axis客户端的Ҏ(gu)。大部分情况下,q些主要的类都会以内部类的Ş式创建在stubcM。It is not meant to be a full schema bindingapplication, and has difficulty with structures such as XML Schema element extensions and restrictions?nbsp;be meant toQ有意要、打?/font>
    XMLBeans:与ADB不同Q他是一个全功能的schema~译器。他没有ADB的限制。然而,他也比ADB用v来更复杂。他会成大量的文gQ编E模型不如ADB直观?br />    JiBX:他是一个数据绑定框架。他不仅提供了WSDLQJAVA的{换,而且提供了JAVAQXML的{换。JiBX相当灉|Q允怽选择cL代表你的实体Q但是这个却不好做,但还句话_如果q些都能建好Q那么用JiBX更使用ADB一样容易?/font>

对于单应用来说ADB已经够用了,如果想用更加强大更加灉|的功能,那么你可能需要用其他两U方式?/strong>

Axis2提供的四U调用模?/strong>

Web services可以用来为用h供广泛的功能Q从单的、少旉消耗的功能到多旉消耗的业务服务。当我们使用Q调用客L(fng)的应用程序)q些Web ServiceӞ我们不能用简单的调用机制来针寚w些对旉消耗有很大要求的服务操作。例如,如果我们使用一个简单的传输通道Q如HTTPQƈ使用IN-OUT模式来调用一个需要很长时间来完成的Web ServiceQ那么多数情况下Q我们得到的l果是"connection time outs"。另一斚wQ如果我们从一个简单的客户端应用程序调用一个同步的服务Q?blocking"的客L(fng)API会降低客户端应用程序的性能。现在来分析一下一些常用的服务调用形式?/font>

许多Web Service引擎提供l客户Blocking和Non-Blocking的客L(fng)APIs?/font>

1QBlocking API-一旦服务被启用Q客L(fng)的应用程序将被挂P直到operation被执行完毕(表现为收C个response或faultQ,才能重新获得控制权。这是调用Web Service最单的方式Qƈ且这U方式适用于多C务情形?/font>

2QNon-Blocking API-q是一个回叫或轮询机制的API。因此,一旦服务被L(fng)Q客L(fng)应用E序马上得到控制权,通过使用一个callback对象来获得response。这U方式得客L(fng)应用E序可以很方便的同步启用多个Web Service?/font>

q两U机刉是工作在API层面上的。称通过使用Non-Blocking API而生的异步行ؓ方式为API Level 异步。这两种机制都用单一的传输连接来发送request和接收response。它们的性能q远落后于用两个传输连接来发送request和接收responseQ不是单工q是双工Q。所以这两种机制都不能解决需要长旉处理的事务的传输问题Q在operation处理完成之前Q很有可能你的连接已l超时了Q。一U可能的解决Ҏ(gu)是用两个独立的传输q接来发送和接收request&response。这U异步行为,我们UCؓTransport Level 异步?/font>

通过l合API Level异步和Transport Level 异步Q我们可以得到四U调用模式。如下所C?/font>

API (Blocking/Non-Blocking)

Dual Transports (Yes/No)

Description

Blocking

No

最单和常用的调用模?/font>

Non-Blocking

No

使用回叫或轮询机?/font>

Blocking

Yes

在单工模式下Qservice operation为IN-OUTӞ很有用。(如SMTPQ?/font>

Non-Blocking

Yes

此模式下的异步效果最?/font>

Axis2提供了所有上q?U调用Web Service的实现方式?/font>



abin 2013-01-20 20:13 发表评论
]]>
վ֩ģ壺 Ǽ| | ̨| ȷɽ| Ӫ| | | ˮ| û| | | | | | | | | | | | Ͽ| ϼ| | | | | | г| | Ϫ| | Զ| | ϴ| | ʡ| | Զ| | | |