﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-AXIS2</title><link>http://www.blogjava.net/stevenjohn/category/53248.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Wed, 03 Apr 2013 02:59:40 GMT</lastBuildDate><pubDate>Wed, 03 Apr 2013 02:59:40 GMT</pubDate><ttl>60</ttl><item><title>Soap中RPC-style和Document-style </title><link>http://www.blogjava.net/stevenjohn/archive/2013/04/02/397298.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 02 Apr 2013 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/04/02/397298.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/397298.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/04/02/397298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/397298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/397298.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<p>主要是思维方式的不同：&nbsp;<br /><br />显然，RPC是以方法调用的方式描述WebSerivce的，也就是说，你要说清楚调用的那个方法，以及各个参数的名称和值。要描述这些东东，SOAP消息就要有一个统一的规范，指出那一部分是方法名，哪个部分是参数，哪个部分是返回值。换句话说，RPC方式调用的SOAP消息格式是有章可循的，固定的。（比如说，每个Parameter必须对应一个Part，Part的name必须和参数名一致）。&nbsp;<br /><br />而Document则是以文档传输的方式描述WebService，只要你的SoapBody里面是一个可以用Schema描述的合法的Xml文档就行了，对具体的格式没有什么要求（Schema要在WSDL里面写）。&nbsp;<br /><br />可以看出，Document形式要更加灵活&#8212;&#8212;尤其是需要传输特定格式的Xml文档的时候，而RPC的Soap消息实际上也可以用Document形式模拟（只要Schema定义得当）。所以目前Document方式应用更广泛一些（也是.NET里面的缺省方式）。&nbsp;<br /><br />对Namespace，我觉得两者应该没有明显的区别。主要是RPC通常与Encoding模式结合使用，这就要引用Soap的namespace了；而Document只要引用XmlSchema的Namespace定义类型就成了。</p></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/397298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-04-02 15:26 <a href="http://www.blogjava.net/stevenjohn/archive/2013/04/02/397298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOAP风格中 RPC与Document的区别 </title><link>http://www.blogjava.net/stevenjohn/archive/2013/04/02/397291.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 02 Apr 2013 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/04/02/397291.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/397291.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/04/02/397291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/397291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/397291.html</trackback:ping><description><![CDATA[<div style="text-indent: 22.5pt"><span style="color: #454545; font-size: 9pt">尽管是转载的，但是原文中几处错误或者不规范的表达，我已经进行了修改。</span> </div>
<div style="text-indent: 22.5pt">&nbsp;</div>
<div style="text-indent: 22.5pt"><span style="color: #454545; font-size: 9pt">大部分</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务都是围绕着远程过程调用而构建的，而</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">规范允许另外一种</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务体系结构：文档样式（</span> <span style="color: #454545; font-size: 9pt">document style</span> <span style="color: #454545; font-size: 9pt">）。在该体系结构中，整个文档在服务客户端和服务器之间进行交换。在本文中，</span> <span style="color: #454545; font-size: 9pt">James McCarthy </span><span style="color: #454545; font-size: 9pt">将向您解释文档样式以及应该何时使用它。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">在</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务描述语言（</span> <span style="color: #454545; font-size: 9pt">Web Service Definition Language</span> <span style="color: #454545; font-size: 9pt">，</span> <span style="color: #454545; font-size: 9pt">WDSL</span> <span style="color: #454545; font-size: 9pt">）规范中隐含着一个非常巧妙的转换开关，它可以将</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务的</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">绑定从远程过程调用转换成</span> <span style="color: #454545; font-size: 9pt">pass-through </span><span style="color: #454545; font-size: 9pt">文档。在</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">协议绑定中的样式属性可以包含这两个值中的一个：</span> <span style="color: #454545; font-size: 9pt">rpc</span> <span style="color: #454545; font-size: 9pt">或</span> <span style="color: #454545; font-size: 9pt">document</span> <span style="color: #454545; font-size: 9pt">。当属性被设定为文档样式时，客户端知道应该使用</span> <span style="color: #454545; font-size: 9pt">XML</span> <span style="color: #454545; font-size: 9pt">模式而不是远程过程调用约定。本文将提供对这个</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">转换开关的说明，描述它的好处，并将解释应该何时使用</span> <span style="color: #454545; font-size: 9pt">pass-through </span><span style="color: #454545; font-size: 9pt">文档。</span> </div>
<div style="text-indent: 13.5pt"><span style="color: #454545; font-size: 9pt">首先，让我们简要地谈谈</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">的一些要点，来理解这个巧妙的转换是如何发生的。</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">是一项</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">规范，它被用来描述Web服务以及对于到达端点（服务）的协议相关的需求。</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">用抽象术语来描述服务；通过可扩展的绑定定义，它能够为使用具体术语调用服务定义协议和数据格式规范。下面的语法是直接从</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">规范中摘</span> <span style="color: #454545; font-size: 9pt">录出来的，展示了在绑定中所包含的可扩展性元素：</span> <span style="color: #454545; font-size: 9pt"><br /><br /></span></div>
<p>
<table style="width: 100%;background: #eeeeee" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: #ebe9ed 1pt inset; border-left: #ebe9ed 1pt inset; padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt;background: none transparent scroll repeat 0% 0%; border-top: #ebe9ed 1pt inset; border-right: #ebe9ed 1pt inset; padding-top: 3.75pt">
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&lt;wsdl:definitions .... &gt;</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp; &lt;wsdl:binding name="nmtoken" type="qname"&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- extensibility element (1) --&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:operation name="nmtoken"&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- extensibility element (2) --&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:input name="nmtoken"? &gt; ?</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- extensibility element (3) --&gt; </span></div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:input&gt;</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:output name="nmtoken"? &gt; ?</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- extensibility element (4) --&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:output&gt;</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsdl:fault name="nmtoken"&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;-- extensibility element (5) --&gt; *</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:fault&gt;</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsdl:operation&gt;</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp; &lt;/wsdl:binding&gt;</span> </div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&lt;/wsdl:definitions&gt;</span> </div></td></tr></tbody></table></p>
<div>&nbsp;</div>
<div style="text-indent: 22.5pt"><span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">规范通常描述三种绑定扩展：</span> <span style="color: #454545; font-size: 9pt">HTTP GET/POST</span> <span style="color: #454545; font-size: 9pt">、</span> <span style="color: #454545; font-size: 9pt">MIME </span><span style="color: #454545; font-size: 9pt">以及</span> <span style="color: #454545; font-size: 9pt">SOAP version 1.1</span> <span style="color: #454545; font-size: 9pt">。</span> <span style="color: #454545; font-size: 9pt">HTTP GET/POST </span><span style="color: #454545; font-size: 9pt">和</span> <span style="color: #454545; font-size: 9pt">MIME </span><span style="color: #454545; font-size: 9pt">中定义的绑定扩展用来定义与标准的</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">应用程序进行通信的需</span> </div>
<div><span style="color: #454545; font-size: 9pt">求，这些应用程序可能返回（也可能不返回）</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">文档。在发送或返回</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">文档时，</span> <span style="color: #454545; font-size: 9pt">HTTP GET/POST </span><span style="color: #454545; font-size: 9pt">绑定的扩展是隐式的文档样式。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">绑定扩展用来定义支持</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">信封协议的服务。</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">信封是一种简单模式，它设计成能包含</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">消息，提供特定于应用程序的消息头和消息体。</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">绑定的扩展使</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">文档能够声明</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">消息的需求，这样应用程序就能够与服务正确通信。</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">扩展允许将</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">消息的样式声明为文档或</span> <span style="color: #454545; font-size: 9pt">RPC</span> <span style="color: #454545; font-size: 9pt">。如果在</span> <span style="color: #454545; font-size: 9pt">soap:binding</span> <span style="color: #454545; font-size: 9pt">元素中声明了样式属性，那么该样式将成为所有没有显式声明的样式属性的</span> <span style="color: #454545; font-size: 9pt">soap:operation</span> <span style="color: #454545; font-size: 9pt">元素的缺省值。如果在</span> <span style="color: #454545; font-size: 9pt">soap:binding</span> <span style="color: #454545; font-size: 9pt">元素中没有声明样式属性，那么缺省的样式就是文档。下面是文档样式的显式声明：</span> </div>
<p>
<table style="width: 100%;background: #eeeeee" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: #ebe9ed 1pt inset; border-left: #ebe9ed 1pt inset; padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt;background: none transparent scroll repeat 0% 0%; border-top: #ebe9ed 1pt inset; border-right: #ebe9ed 1pt inset; padding-top: 3.75pt">
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&lt;soap:binding style="document" transport="uri"&gt;</span> </div></td></tr></tbody></table></p>
<div>&nbsp;</div>
<div><span style="color: #454545; font-size: 9pt">不管</span> <span style="color: #454545; font-size: 9pt">soap:binding</span> <span style="color: #454545; font-size: 9pt">元素中的声明如何，</span> <span style="color: #454545; font-size: 9pt">soap:operation</span> <span style="color: #454545; font-size: 9pt">元素可以覆盖每个操作的声明，就像这样的：</span> </div>
<p>
<table style="width: 100%;background: #eeeeee" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: #ebe9ed 1pt inset; border-left: #ebe9ed 1pt inset; padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt;background: none transparent scroll repeat 0% 0%; border-top: #ebe9ed 1pt inset; border-right: #ebe9ed 1pt inset; padding-top: 3.75pt">
<div style="text-align: left">&nbsp;</div>
<div style="text-align: left"><span style="color: #454545; font-size: 9pt">&lt;soap:operation soapAction="uri" style="document"&gt;</span> </div></td></tr></tbody></table></p>
<div>&nbsp;</div>
<div><span style="color: #454545; font-size: 9pt">在声明了文档样式的</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">消息中，原始（</span> <span style="color: #454545; font-size: 9pt">as-is</span> <span style="color: #454545; font-size: 9pt">）或编码（</span> <span style="color: #454545; font-size: 9pt">encoded</span> <span style="color: #454545; font-size: 9pt">）的消息被直接放置在</span> <span style="color: #454545; font-size: 9pt">SOAP </span><span style="color: #454545; font-size: 9pt">信封的体部。</span> </div>
<div><span style="color: red; font-size: 9pt">如果样式声明为</span> <span style="color: red; font-size: 9pt">RPC</span> <span style="color: red; font-size: 9pt">，消息就封装在包装器元素中，同时带有从操作名属性中提取的的元素的名称以及从操作名称空间属性中提取的名称空间。</span> </div>
<div style="text-indent: 13.5pt"><span style="color: #454545; font-size: 9pt">勿庸置疑，使用</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">调用跨平台的远程过程调用的能力是非常有用的，它是使用</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务的非常有说服力的理由。但是如果</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务仅仅局限于</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息传递，这项技术的影响将是有限的。幸运的是，开发人员可以选择是使用</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">还是文档样式的消息传递，并且能够使用适合的技术来完成他们面临的任务。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">规范开发用来使通常锁定于专有格式的常规数据可以以一种人易读的、自描述的、自验证的开放格式来描述。当</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务使用文档消息传递时，它可以利用</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">的全部能力来描述和验证高级业务文档。当服务使用</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息格式化时，</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">描述方法以及为方法调用编码的参数，但是却不能用来执行高级业务规则。为了执行这些规则，</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息必须包含</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">文档作为字符串参数并且在被调用的方法中隐藏验证。出于这个原因，</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">的某些好处就丧失了，或者至少是被隐藏在后台应用程序里了。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">使用文档消息传递的另外一个原因在于，远程过程调用必须是相对静态的，并且对接口的任何变化都将破坏服务和应用程序之间的契约。如果服务是广泛分布的，那么很可能大量的应用程序已经从它的</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">文档中产生了存根代码。改变</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">将会导致所有依赖于特定方法签名的应用程序被破坏，而且许多支持行产生问题。好的设计要求</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息服务的方法签名不应该改变。使用文档消息传递，规则更严格，并且可以使</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">模式得到显著增强和改变，同时又不会破坏调用应用程序。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">当业务使用基于</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">的应用程序通过</span> <span style="color: #454545; font-size: 9pt">Internet </span><span style="color: #454545; font-size: 9pt">交换信息时，应用程序应该能够使用有保证的交付机制来提高它的可靠性、可伸缩性和性能。为了达到这个目的，应用程序通常将使用异步消息队列。由于文档消息通常是自包含的，所以它更适合于异步处理，并且可以直接放到队列中。之所以说应用程序的可靠性得到了提高，是因为即使目标应用程序当前不是活动的，消息队列也可以保证消息的交付；之所以说性能得到了提高，是因为</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">应用程序只是把文档发送到队列中，然后便可以自由地执行其他的任务；之所以说可扩展性得到了提高，是因为文档被下传到一个或多个应用程序的实例以进行处理。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">业务文档的设计通常很好地适于面向对象的体系结构。结果，两个应用程序可以设计成通过使用</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">交换对象的状态。与对象序列化相比，在对象交换中，交换的每个端点都可以自由地设计它认为合适的对象，只要交换符合达成协议的</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">文件格式即可。不使用对象序列化的一个原因是为了支持对象在客户端和服务器端的实现。许多现有的特定于行业的</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">模式被设计成客户端</span> <span style="color: #454545; font-size: 9pt">/</span> <span style="color: #454545; font-size: 9pt">服务器体系结构，在这种体系结构中，在客户端上完成的处理与预定在服务器上完成的处理是分离的。通常的情况是，客户端仅仅以服务器要求的特定文档格式请求或保存信息。当然，这种类型的交换也能用</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息完成，但是这种消息的编码方式限制了每个端点上的对象的设计。在文档样式中就不会出现这些限制问题。</span> </div>
<div style="text-indent: 18pt"><span style="color: #454545; font-size: 9pt">什么时候应该使用文档样式呢？简单地说：只要没有连接到已存在的远程过程调用，任何时候都可以使用文档方式。使用文档方式比起通常花费额外的工作来连接服务，好处要大得多。不过需要提醒的是：一般来说，构建一个使用文档消息传递的服务的工作量要比构建一个</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息服务所需的工作量大。这些额外的工作通常包括</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">模式的设计或对已存在的模式的支持、以及从文档中提取相关的信息。模式设计是重要的，因为</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">解析器使用这个模式来验证文档，支持预定的业务规则。服务需要进行额外的工作来从文档中提取用于处理请求的相关信息。相比之下，</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息只需要设计方法的接口，通过方法的接口，</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息就可以自动地编组和解组参数。</span> </div>
<div><span style="color: #454545; font-size: 9pt">当您决定发布一项服务时，您可能应该考虑下列问题。我将在下面的部分中分析您的答案的结果。</span> </div>
<ul style="margin-top: 0cm" type="disc"><li style="text-align: left; color: #454545"><span style="font-size: 9pt">这项服务是连接到已存在的过程调用，并且这个过程调用是无状态的吗？</span></li><li style="text-align: left; color: #454545"><span style="font-size: 9pt">这项服务是仅在您的组织内部使用，还是也可以被外部用户所使用？</span></li><li style="text-align: left; color: #454545"><span style="font-size: 9pt">参数之一仅仅是</span> <span style="font-size: 9pt">XML </span><span style="font-size: 9pt">文档规范吗？</span></li><li style="text-align: left; color: #454545"><span style="font-size: 9pt">这项服务需要请求</span> <span style="font-size: 9pt">/</span> <span style="font-size: 9pt">响应体系结构吗？</span></li><li style="text-align: left; color: #454545"><span style="font-size: 9pt">参数表示了可以从用于验证的</span> <span style="font-size: 9pt">XML </span><span style="font-size: 9pt">文档模式受益的复杂结构吗？</span></li><li style="text-align: left; color: #454545"><span style="font-size: 9pt">所有需要进行交换的信息都能够合理地存放在内存中吗？</span> </li></ul>
<div>&nbsp;<span style="color: #454545; font-size: 9pt">如果必须以特定的顺序调用多个过程来维护应用程序状态，您应该考虑在您的服务中使用文档体系结构。如果需要多个过程调用，那么过程就不是无状态的，并且服务必须维护应用程序状态。在</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务中维护状态可能是困难的；在远程过程调用的情况下，很少有客户端平台会产生能够支持状态信息的存根代码。一个可能的解决方案是使用文档体系结构，并在文档内部传送整个事务的内容。在这种情况下，服务将执行调用，以确保服务内部保持正确的顺序，并且状态信息的维护不超出单个事务的范围。如果仍然需要状态信息，可以将状态信息记录在最终得到的文档中，客户端应用程序也可以维护一个用于服务识别它的状态的令牌。</span> </div>
<div><span style="color: #454545; font-size: 9pt">如果一个应用程序被发布到组织以外，发布者就很难控制谁正依赖于这个服务，以及如果做出任何改动后果会怎样。在这种情况下，使用文档消息传递和支持像</span> <span style="color: #454545; font-size: 9pt">ebXML </span><span style="color: #454545; font-size: 9pt">这样的通用交换协议可能更加有利。通用交换协议正发展成能改善外部交换的管理，因此新的贸易合作伙伴协定就可以快速地部署。同样，如果您的服务不需要请求</span> <span style="color: #454545; font-size: 9pt">/</span> <span style="color: #454545; font-size: 9pt">响应体系结构，那么通用交换协议就可以更好地设计来处理认证、可靠消息交付以及异步请求</span> <span style="color: #454545; font-size: 9pt">/</span> <span style="color: #454545; font-size: 9pt">响应。</span> </div>
<div><span style="color: #454545; font-size: 9pt">如果您的服务正使用字符串参数来传递或返回</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">文档，或者它的参数之一是一个具有复杂结构且需要自定义处理的对象，那么文档消息传递就可能是较好的选择。将参数的真实含义隐藏在字符串里经常会导致带有无效参数的有效调用。如果服务发布了</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">文档模式，那么在调用服务之前根据这个模式进行验证就会更加容易。复杂结构经常用来传递组成完整事务的数百条信息。在处理复杂的结构时，远程过程服务可能不得不处理自定义的编组代码，同时应用程序仍然负责仔细地验证结构的每个元素。如果使用文档消息传递，那么应用程序程序员就可以使用</span> <span style="color: #454545; font-size: 9pt">XML </span><span style="color: #454545; font-size: 9pt">模式来将验证下传到文档设计器，并且不需要自定义的编组代码。</span> </div>
<div><span style="color: #454545; font-size: 9pt">&nbsp;&nbsp;&nbsp; </span><span style="color: #454545; font-size: 9pt">择使用文档样式的消息传递还是</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">样式的消息传递时，需要考虑的最后一个因素是需要处理的信息量大小。由于采用</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">样式的消息传递来编组参数的大部分（如果不是全部的话）实现都是在内存中执行这项操作，所以内存约束可能会使得</span> <span style="color: #454545; font-size: 9pt">RPC </span><span style="color: #454545; font-size: 9pt">消息传递行不通。许多文档消息传递服务能够选择是用</span> <span style="color: #454545; font-size: 9pt">DOM </span><span style="color: #454545; font-size: 9pt">还是用</span> <span style="color: #454545; font-size: 9pt">SAX </span><span style="color: #454545; font-size: 9pt">来处理文档，因而能够最小化内存中的处理。这对于</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务尤为关键，因为它可能需要处理成千上万的请求，而且其中许多是同时发生的。</span> </div>
<div style="text-indent: 13.5pt"><span style="color: #454545; font-size: 9pt">在您设计下一个</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务时，您需要考虑当前的</span> <span style="color: #454545; font-size: 9pt">WSDL </span><span style="color: #454545; font-size: 9pt">规范为您提供的所有选择。在开始创建过程性的接口之前，考虑好将如何使用服务，谁将使用它，以及需要交换的数据的类型和数量。设计开发文档样式的</span> <span style="color: #454545; font-size: 9pt">Web </span><span style="color: #454545; font-size: 9pt">服务可能需要稍多一些的工作量，但是在很多情况下，这些额外的工作量将会换取更高的信息质量和更可靠的交换性能。</span> </div><img src ="http://www.blogjava.net/stevenjohn/aggbug/397291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-04-02 15:02 <a href="http://www.blogjava.net/stevenjohn/archive/2013/04/02/397291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>axis2 客户端调用服务器端</title><link>http://www.blogjava.net/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.blogjava.net/stevenjohn/archive/2013/01/20/394482.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/394482.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/01/20/394482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/394482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/394482.html</trackback:ping><description><![CDATA[<div>//方法一：<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 {&nbsp;</div><div><span style="white-space:pre">			</span>ServiceClient sc = new ServiceClient();&nbsp;</div><div><span style="white-space:pre">			</span>Options opts = new Options();&nbsp;</div><div><span style="white-space:pre">			</span>opts.setTo(new EndpointReference("http://localhost:9090/universal/services/play"));&nbsp;</div><div><span style="white-space:pre">			</span>opts.setAction("urn:echo");&nbsp;</div><div><span style="white-space:pre">			</span>opts.setTimeOutInMilliSeconds(10000);</div><div><span style="white-space:pre">			</span>sc.setOptions(opts);&nbsp;</div><div><span style="white-space:pre">			</span>OMElement res = sc.sendReceive(createPayLoad());&nbsp;</div><div><span style="white-space:pre">			</span>System.out.println(res);&nbsp;</div><div><span style="white-space:pre">			</span>} catch (AxisFault e) {&nbsp;</div><div><span style="white-space:pre">			</span>e.printStackTrace();&nbsp;</div><div><span style="white-space:pre">			</span>}&nbsp;</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(){&nbsp;</div><div><span style="white-space:pre">		</span>OMFactory fac = OMAbstractFactory.getOMFactory();&nbsp;</div><div><span style="white-space:pre">		</span>OMNamespace omNs = fac.createOMNamespace("http://localhost:9090/universal/services/play", "nsl");&nbsp;</div><div><span style="white-space:pre">		</span>OMElement method = fac.createOMElement("getPassengerInfos",omNs);&nbsp;</div><div><span style="white-space:pre">		</span>OMElement value = fac.createOMElement("userID",omNs);&nbsp;</div><div><span style="white-space:pre">		</span>value.setText("1024");&nbsp;</div><div><span style="white-space:pre">		</span>method.addChild(value);&nbsp;</div><div><span style="white-space:pre">		</span>return method;&nbsp;</div><div><span style="white-space:pre">		</span>}&nbsp;</div><div></div><div></div><div></div><div>}<br /><br /><br /><br /><br /><br />//方法二<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> &nbsp;// 使用RPC方式调用WebService &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; RPCServiceClient serviceClient = new RPCServiceClient();&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Options options = serviceClient.getOptions();&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // 指定调用WebService的URL&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; EndpointReference targetEPR = new EndpointReference(&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "http://localhost:9090/universal/services/play");&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; options.setTo(targetEPR);&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // 指定方法的参数值&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Object[] requestParam = new Object[] {"1024"};&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // 指定方法返回值的数据类型的Class对象&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Class[] responseParam = new Class[] {String.class};&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // 指定要调用的getGreeting方法及WSDL文件的命名空间&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; QName requestMethod = new QName("http://localhost:9090/universal/services/play", "getPassengerInfos");&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; // 调用方法并输出该方法的返回值&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 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>}&nbsp;</div><div><span style="white-space:pre">	</span>}</div><div></div><div>}</div><div></div></div><div><br /><br /><br /><br />//方法三<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.blogjava.net/stevenjohn/aggbug/394482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-01-20 23:26 <a href="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/stevenjohn/archive/2013/01/20/394481.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/394481.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/01/20/394481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/394481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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.blogjava.net/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.blogjava.net/stevenjohn/aggbug/394481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-01-20 23:23 <a href="http://www.blogjava.net/stevenjohn/archive/2013/01/20/394481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Axis2生成客户端方式 Axis2提供的四种调用模式 </title><link>http://www.blogjava.net/stevenjohn/archive/2013/01/20/394470.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 20 Jan 2013 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/01/20/394470.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/394470.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/01/20/394470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/394470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/394470.html</trackback:ping><description><![CDATA[<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#ff0000"><strong style="font-weight: bold">Axis2生成客户端方式</strong></font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">基于StockQuoteService类创建客户端的四种方式</font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">构建基于AXIOM的客户端；</font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">使用Axis2 Databinding Frame work(ADB)生成客户端；</font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">使用XMLBeans生成客户端；</font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">使用JiBX生成客户端。</font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal"><font style="line-height: 27px; word-wrap: normal; word-break: normal" color="#ff0000">ADB：最简单的生成Axis客户端的方法。大部分情况下，这些主要的类都会以内部类的形式创建在stub类中。It is not meant to be a full schema bindingapplication, and has difficulty with structures such as XML Schema element extensions and restrictions。&nbsp;<wbr></font><font style="line-height: 27px; word-wrap: normal; word-break: normal" color="#0000ff">be meant to：有意要、打算</font></font><font style="line-height: 21px; word-wrap: normal; word-break: normal" color="#ff0000"><br /><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>XMLBeans:与ADB不同，他是一个全功能的schema编译器。他没有ADB的限制。然而，他也比ADB用起来更复杂。他会产成大量的文件，编程模型不如ADB直观。<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>JiBX:他是一个数据绑定框架。他不仅提供了WSDL－JAVA的转换，而且提供了JAVA－XML的转换。JiBX相当灵活，允许你选择类来代表你的实体，但是这个却不好做，但还句话说，如果这些都能建好，那么使用JiBX就更使用ADB一样容易。</font></font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 21px; word-wrap: normal; word-break: normal" color="#ff0000"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#009900"><strong style="font-weight: bold">对于简单应用来说ADB已经够用了，如果想用更加强大更加灵活的功能，那么你可能需要使用其他两种方式。</strong></font></font></p>
<p style="text-align: left; padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: #e4d6a7; list-style-type: none; text-indent: 2em; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; font: 14px/21px simsun; word-wrap: normal; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: #323e32; word-break: normal; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#ff0000"><strong style="font-weight: bold">Axis2提供的四种调用模式</strong></font></p>
<div style="text-align: left; widows: 2; text-transform: none; background-color: #e4d6a7; text-indent: 2em; font: 14px/21px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #323e32; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">Web services可以用来为用户提供广泛的功能，从简单的、少时间消耗的功能到多时间消耗的业务服务。当我们使用（调用客户端的应用程序）这些Web Service时，我们不能用简单的调用机制来针对那些对时间消耗有很大要求的服务操作。例如，如果我们使用一个简单的传输通道（如HTTP）并使用IN-OUT模式来调用一个需要很长时间来完成的Web Service，那么多数情况下，我们得到的结果将是"connection time outs"。另一方面，如果我们从一个简单的客户端应用程序调用一个同步的服务，使用"blocking"的客户端API将会降低客户端应用程序的性能。现在来分析一下一些常用的服务调用形式。</font> 
<p style="padding-bottom: 0px; line-height: 21px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#ff0000">许多Web Service引擎提供给客户Blocking和Non-Blocking的客户端APIs。</font></p>
<p style="padding-bottom: 0px; line-height: 21px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">1）Blocking API-一旦服务被启用，客户端的应用程序将被挂起，直到operation被执行完毕（表现为收到一个response或fault），才能重新获得控制权。这是调用Web Service最简单的方式，并且这种方式适用于多数业务情形。</font></p>
<p style="padding-bottom: 0px; line-height: 21px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">2）Non-Blocking API-这是一个回叫或轮询机制的API。因此，一旦服务被起用，客户端应用程序马上得到控制权，通过使用一个callback对象来获得response。这种方式使得客户端应用程序可以很方便的同步启用多个Web Service。</font></p>
<p style="padding-bottom: 0px; line-height: 21px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal">这两种机制都是工作在API层面上的。称将通过使用Non-Blocking API而产生的异步行为方式为API Level 异步。这两种机制都使用单一的传输连接来发送request和接收response。它们的性能远远落后于使用两个传输连接来发送request和接收response（不管是单工还是双工）。所以这两种机制都不能解决需要长时间处理的事务的传输问题（在operation处理完成之前，很有可能你的连接已经超时了）。一种可能的解决方法是使用两个独立的传输连接来发送和接收request&amp;response。这种异步行为，我们称为Transport Level 异步。</font></p>
<p style="padding-bottom: 0px; line-height: 21px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#ff0000">通过组合API Level异步和Transport Level 异步，我们可以得到四种调用模式。如下所示。</font></p>
<table style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">API (Blocking/Non-Blocking)</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Dual Transports (Yes/No)</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Description</font></p></td></tr>
<tr>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Blocking</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">No</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">最简单和常用的调用模式</font></p></td></tr>
<tr>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Non-Blocking</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">No</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">使用回叫或轮询机制</font></p></td></tr>
<tr>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Blocking</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Yes</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">在单工模式下，service operation为IN-OUT时，很有用。（如SMTP）</font></p></td></tr>
<tr>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Non-Blocking</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">Yes</font></p></td>
<td style="padding-bottom: 0px; line-height: 18px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, 宋体, sans-serif; font-size: 12px; padding-top: 0px" valign="top" width="189">
<p style="padding-bottom: 0px; line-height: 18px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#0000ff">此模式下的异步效果最大</font></p></td></tr></tbody></table>
<p style="padding-bottom: 0px; line-height: 21px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; word-wrap: normal; border-top-width: 0px; border-bottom-width: 0px; word-break: normal; border-left-width: 0px; padding-top: 0px; border-image: initial"><font style="line-height: 27px; word-wrap: normal; font-size: 18px; word-break: normal" color="#ff0000">Axis2提供了所有上述4种调用Web Service的实现方式。</font></p></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/394470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-01-20 20:13 <a href="http://www.blogjava.net/stevenjohn/archive/2013/01/20/394470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>