技术开发 频道

SOA存储库背后的力量

  XQuery介绍

  XQuery是一个多功能的语言。例如,表达式可以合成从而随意生成复杂的对一个或多个XML数据集合的查询。XQuery同时提供了基于XML模式和DTD的强类型机制和基于原始 XML数据的弱类型机制

  XQuery数据模型

  XQuery数据模型比XML Infoset and Post-Schema Validation Infoset (PSVI)的XML数据模型更具有扩展性。XQuery通过数据模型的操作来定义,但他约束了数据模型中文档和事例的组织。这个数据模型由被搜索的XML数据、所有中间值和最终查询结果组成。他支持可以产生非XML数据、XML碎片和类型与非类型数据的中间表达式。

  XQuery和XML模式对XML数据有相同的类型概念。XQuery提供基于XML Schema内置类型和用户自定义的Schema类型。Query同样支持在现存的XML Schema数据类型之外的数据类型

  XQuery数据模型和类型系统的组件如下:

  XQuery表达式有一个静态的类型和一个动态的类型。静态的类型适合那些编译时运行的表达式。动态的类型适合那些表达式的结果并且在运行时运用的表示式

  静态的类型和动态类型的比较:

  静态:对应文挡与查询的类型索引的集合

  动态:管理查询是如何进行的数值索引规则的集合

  XQuery syntax

  几个可以被用在语法查询中的XQuery表达式的类型

  除此之外,XQuery的实现可以被扩展。更多的复杂实现包括对文件系统、HTTP、Web Services、Java数据连接桥(JDBC),Java消息服务和其他数据源的支持

  XQuery提供了对native XML数据管理服务器的整合,作为一个灵活的和基于标准的持久性机制。

  我们推荐native XML数据管理服务器的使用(如图4所示),来作为对SOA持久化的一个好的实现。一个native的XML数据管理服务器可以被用来进行SOA内部服务的整合,因为服务是本地独立的。 David S. Linthicum在他的一篇题为"The Importance of Persistence within a SOA”,的blog中提到,服务的整合、持久性问题、存储、事务数据的处理、集中的原数据是作为面对信息服务集成的关键方面。整合的服务同样可以通过使数据接近数据处理的组件而提高系统效率。在central tier使用一个原生的XML数据管理服务器允许架构师们为分析和日志而存储事务处理信息。

  SOA中,XQuery使用实例

  XQuery在SOA中的强大能力表现在许多复杂的查询功能。下面的这些例子证明一个具体的XQuery实现是怎么被一个具体的native XML数据管理服务器无缝整合的。

  例 1:使用XQuery往WSDL中插入操作  

declare namespace wsdl = "http://schemas.xmlsoap.org/wsdl/"; insert <wsdl:operation name="testInsertOperation" parameterOrder="id"> <wsdl:input message="impl:testInsertOperationRequest" name="testInsertOperationRequest"/> <wsdl:output message="impl:testInsertOperationResponse" name="testInsertOperationResponse"/> </wsdl:operation>after doc("xxx:///SOARepository/webservices/PurchaseOrderWS.xml") /wsdl:definitions/wsdl:portType/wsdl:operation[@name=" getPODetail"] ...

  例2:使用XQuery检查服务的可用性和更新注册器的状态

... declare namespace wsdl = "http://schemas.xmlsoap.org/wsdl/"; declare namespace wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"; for $i in collection('xxx:///SOARepository/webservices')/wsdl:definitions where fn:doc-available (fn:concat($i/wsdl:service/wsdl:port/wsdlsoap:address/@location,'?wsdl' )) return <Service> <TimeStamp>fn:current-date()</TimeStamp> <Status>down</Status> </Service> ...

  例三:用XQuery测量SOPA消息的可靠性

... declare namespace wsdl = "http://schemas.xmlsoap.org/wsdl/"; declare namespace msg ="http://schemas.xyz.com/msg"; declare namespace SOAP="http://schemas.xmlsoap.org/soap/envelope/"; <ExpiredMessage> { for $i in doc('file:///c:/SOARepository/ReliableMessaging/RM14.xml')/SOAP:Envelope where $i/SOAP:Header/ReliableMessage/TimeToLive < current-dateTime() return $i } </ExpiredMessage> ...

  例4,用XQuery找回在策略文档中使用过的记号类型

...declare namespace wsp="http://schemas.xmlsoap.org/ws/2004/09/policy/"; declare namespace wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; <Tokens> { for $policy in collection('xxx:///SOARepository/WSPolicy')/wsp:Policy return $policy/wsp:ExactlyOne/wsp:All/wsse:SecurityToken/wsse:TokenType } </Tokens > ...

  结论

  在这篇文章中,我们介绍了一个native的XML数据管理服务器作为最合理的存储SOA数据的途径,因为数据本身是基于XML的。有些人可能会争论这些数据和元数据也可以用关系数据库来存储和管理。但是,由XML产生的数据和元数据必须被转换成相关的表达,从而进行大规模的映射和管理。由于企业中SOA数据和元数据迅速膨胀,复杂度将会越来越大。并且,由于这些数据经常被存取和消耗,一个由XQuery驱动的native XML数据管理服务器能被用来提供一个基于标准的中间缓存来减少运行时的负荷和提高SOA的可测量性和可靠性。

  我们要感谢Infravio 市场部副总裁Miko Matsumura,他同样是Sun Microsystems的前Java Evangelist,SOA Blueprints的共同创始人,ebXML和software engineer with Cyclone Commerce专家。同眼感谢Frank Cohen,Raining Data公司的技术主管来对本人进行审核。

0
相关文章