跳到导航
首页      资源中心      dev2dev学堂      在线技术论坛      User Group      CodeShare
dev2dev 首页 > 资源中心 > 技术文章
用于创建自描述数据来实现SOA的一种技术

时间:2004-08-31
作者:Som Sengupta
浏览次数:
本文关键字:soa描述耦合xml
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章

该项技术的价值主张

该项技术使得业务服务能够无中断运营,即便其对等所生成的输入数据流也发生变化的情况也是如此。该项技术确保了各业务服务间的数据格式语义的松散耦合。该解决方案适用于任何半结构化的数据表示。

下载作者提供的与本文相关的文件。


背景

今天,企业计算的大部分资源正被投入到解决如何使企业内或者企业间已有的应用程序彼此协同工作的问题上。引导应用程序间交互的两个主要因素是:

·                 两个不同应用程序之间的不同交互语义

·                 两个不同应用程序之间的不同数据格式和语义


该项提议试图专门解决因应用程序之间的数据共享而引起的挑战,即多个参与方如何能够适应共享数据在格式语义方面的更改。

现状

当前的方法受限于下列约束:

·                 预先知道对等应用程序使用的格式

·                 预先定义映射,以便将输入消息转换为接收方业务服务能理解的格式

该项技术将要解决的问题

在前面的一节中描述的当前可用的技术不能以动态的方式解决与数据格式语义相关的松散耦合问题。当前的方法是适配器驱动的,会话的各方必须提前知道对方的数据定义。而所提议的方法则克服了这种限制。除此之外,该项技术还提供了如下一些重要好处:

·                 即使当一个或者多个订阅者想要一组不同于其他订阅者的信息时,基于多方广播的通信仍能正常进行

·                 消息产生者不需要知道每个订阅者支持的数据格式语义

·                 该项技术支持强类型验证

·                 即使产生者曾经发布了消息,每个业务服务也只能看到它们被授权阅读的数据部分

·                 产生者可以更改数据而不会打断任何订阅者

·                 即使服务本身只能理解一部分数据,每个业务服务也可以将数据发送到另外的服务

·                 如果一个业务服务向一个业务服务组广播数据,而组中的每个订阅者理解不同数据描述语言的情况下,只要使用由不同语言描述的独立部分并且符合不同的格式的混合集合,就能够使发送者一次就能将同样的数据发送到一组订阅者。

解决该问题的方式

关于能够被自描述的数据的假定是:

·                 数据能够被结构化或者半结构化


定义数据采用的技术如下:

·                 每组元素预先围绕一个xml元素(如< NewElements >)来进行包装

·                 在数据中使用的每一组元素与定义那组元素的类型和语义的模式相关联

·                 在数据中使用的每一组元素与关于格式名称和格式版本等的信息相关联

·                 在数据中使用的每一组元素与熟知的符合诸如XMLrdf等模式的数据描述语言的信息相关联

·                 数据被表示成一个无界的元素序列,其中每个元素自己可以有子元素

·                 没有一种用于所有数据的模式



每一组元素的基本数据结构是XML,并且符合下列模式

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

            <xs:complexType name="buildingBlocks">

            <xs:sequence>

            <xs:element name ="schemaName" type ="xs:string"/>

            <xs:element name= "schemaVersion" type ="xs:string"/>

            <xs:element name= "schemaLanguage" type ="xs:string"/>

            <xs:element name= "schemaDef" type = "xs:base64Binary"/>

            <xs:element name="body" type ="xs:anyType"/>

            </xs:sequence>

            </xs:complexType>

            <xs:element name="NewElements">

                        <xs:complexType>

                                     <xs:sequence>

            <xs:element name="NewElement" type ="buildingBlocks" maxOccurs="unbounded" minOccurs="0" />

                                     </xs:sequence>

                                     </xs:complexType>

            </xs:element>

</xs:schema>



1:符合该模式的数据实例

<NewElements>

<NewElement>

<schemaName>Schema1.xsd</schemaName>

<schemaVersion>1</schemaVersion>

<schemaLanguage>xml</schemaLanguage >

 <schemaDef>base64 encoded schema content</schemaDef>

 <body>

 … .. xml structure

 </body>

</NewElement>

<NewElement>

<schemaName>Schema2.xsd</schemaName>

<schemaVersion>1</schemaVersion>

<schemaLanguage>rdf</schemaLanguage >

 <schemaDef> base64 encoded schema content</schemaDef>

 <body>

 … .. rdf structure

 </body>

</NewElement>

… … … ..

 </newElements>

2更新后的数据实例仍然符合该模式

<NewElements>

<NewElement>

<schemaName>Schema1.xsd</schemaName>

<schemaVersion>1</schemaVersion>

<schemaLanguage>xml</schemaLanguage>

 <schemaDef>base64 encoded schema content</schemaDef>

 <body>

… .. xml structure

 </body>

</NewElement>

<NewElement>

<schemaName>Schema2.xsd</schemaName>

<schemaVersion>1</schemaVersion>

<schemaLanguage>rdf</schemaLanguage>

 <schemaDef> base64 encoded schema content</schemaDef>

 <body>

 … .. rdf structure

 </body>

</NewElement>

… … … … ..

<NewElement>

<schemaName>Schema3.xsd</schemaName>

<schemaVersion>1</schemaVersion>

<schemaLanguage>rdf</schemaLanguage>

 <schemaDef>base64 encoded schema content</schemaDef>

<body>

 … .. rdf structure

<body>

 </NewElement>

</NewElements>


用于读取数据适当部分的技术如下:

·                 读取模式名称

·                 读取模式版本

·                 读取模式语言

·                 用适当的模式和分析器组合来分析该组元素,例如,如果模式语言是rdf就使用rdf分析器



该项技术不强迫每一个参加会话的业务服务必须与该模式一致。它们可以在内部使用任何模式,但是只能在与其他各方共享数据之前;它们应该将消息转换成这里建议的模式。简而言之,这是一种可扩展的数据格式,它可以适应在多个参与方之间共享的数据结构中的改变。

示例如何工作

下面是示例中使用的组件,用于展示如何在SOA环境中使用该技术。

·                 ProcessSender.jpd


JPD
创建了一个类似于例1的消息。然后JPD将它更新为像例2的消息并将它发送到Process.jpd。该动作反映了现实生活中消息产生者不考虑接收方而改变了数据格式的情形。

·                 Process.jpd

JPD验证输入消息并且使用SelfDescriberImpl.jcs来验证相应schema的每一组xml消息。

·                 SelfDescriberImpl.jcs


该工具类提供了如下功能:

1.               xml提供多种模式支持

2.               将模式作为所发送的xml消息的一部分传送

3.               对模式内容进行基本编码


要运行示例,如下操作:

1.               通过IDE打开SelfDescribedDataExample.work文件。

2.               Integration Domain中构建并部署它。

3.               使用文本浏览器运行ProcessSender.jpd。参数值如下:

1.                            schemapath=workingdirectory\SelfDescribedDataExample\Schemas

2.                            xmlpath=SelfDescribedDataExample\SelfDescribedData\processes

4.               服务器控制台将打印“Document Valid”两次,每一次对应于一组通过相应格式验证的元素。

dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分

   
相关技术