UML软件工程组织

使用UDDI和WSDL的一种新方法,第2部分:新的OASIS UDDI WSDL Technical Note支持的查询 
John Colgrave (colgrave@uk.ibm.com)
高级软件工程师,IBM United Kingdom Limited
2003 年 10 月 
本文是关于使用WSDL和UDDI的新方法系列文章中的第二篇文章,在OASIS UDDI Technical Note中定义了这种新方法。本文描述了UDDI查询类型,这种查询类型可以使用于根据Technical Note建立的UDDI模型。

本系列文章中的第一篇文章(参阅参考资料)介绍并描述了构造WSDL描述的UDDI模型的方法。本文描述了该新方法可用的UDDI查询类型,同时使用了几个查询实例,这些查询采用了UDDI V2 API请求的形式。

该系列文章的第三篇文章提供的例子比在Technical Note中提供的例子更复杂,包括发布UDDI实体和构造Technical Note中定义的查询类型的屏幕画面。

本系列文章的最后一篇文章讲述如何编写Java应用程序,使用UDDI4J将这些模型发布到UDDI以及进行查询。

查询类型

本文讲述的查询能在设计/构建时间或在运行时间发布,这有赖于所开发的应用程序的类型。但是,在新的Technical Note生产期间,考虑的主要情景是在设计/构建期间选择portType。如果需要的话,可以是特定的绑定,可以生成存根或相似的编程制品(artifact)。在运行时间,可以查询portType和绑定(可选)的实现。

必须注意的是,虽然Technical Note只定以了了与WSDL有关的信息,将其它信息(例如:行业分类或者业务等)添加到UDDI模型也是有效的,并且在查询时也可以使用这些信息。

清单1展示了一个portType tModel简单查询,portType tModel的名称为:StockQuotePortType

清单1. 根据portType tModel名字的简单查询


<find_tModel generic="2.0" xmlns="urn:uddi-org:api_v2">
    <name>StockQuotePortType</name>
    <categoryBag>
        <keyedReference
            tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"
            keyValue="portType"/>
    </categoryBag>
</find_tModel>

清单2显示portType tModel的查询,portType tModel的名称为StockQuotePortType,命名空间是http://example.com/stockquote/ ,并且工业分类是NAICS Category System的52312 (Securities Brokerage)

清单2.使用WSDL和其它标准来查询portType

<find_tModel generic="2.0" xmlns="urn:uddi-org:api_v2">
    <name>StockQuotePortType</name>
    <categoryBag>
        <keyedReference
            tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"
            keyValue="portType"/>
        <keyedReference
            tModelKey="uuid:d01987d1-ab2e-3013-9be2-2a66eb99d824"
            keyValue="http://example.com/stockquote/"/>
        <keyedReference
            tModelKey="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2"
            keyValue="52312"/>
    </categoryBag>
</find_tModel>

查询绑定tModels

如果名字和/或绑定的命名空间的名字已知,那么作为portType tModels定义的相同类型的查询能被用来找到绑定,但是,一旦与portType相对应的tModel已知后,绑定查询的大部分查询很可能是查找特定portType的绑定。

清单3显示了查询代表了一个portType的绑定tModel(s),而这个绑定的portType对应于一个key为uuid:11111111-1111-1111-1111-111111111111的portType tModel。

清单3. portType tModel的全部绑定 tModels 的查询

<find_tModel generic="2.0" xmlns="urn:uddi-org:api_v2">
    <categoryBag>
        <keyedReference
            tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"
            keyValue="binding"/>
        <keyedReference
            tModelKey="uuid:082b0851-25d8-303c-b332-f24a6d53e38e"
            keyValue="uuid:11111111-1111-1111-1111-111111111111"/>
    </categoryBag>
</find_tModel>

categoryBag中的第一个keyedReference不是必需的。然而如果利用portType Reference Category System来查找绑定tModels,将以使用这个它。因为将来的Technical Note或最优方法将扩展portType Reference Category System的使用,使得也可以对portType之间的关系建模,因此,包括来自WSDL Entity Type Category System的keyedReference将确保返回唯一的绑定tModels。

不管在绑定中指定的协议和/或传输是什么,清单3中的查询将返回portType的绑定。如果需要特定的协议和/或传输,那么来自Protocol Category System和/或Transport Category System的额外keyedReference也是需要添加的。

清单4显示了关于必需的协议(SOAP)和传输(HTTP)的特定查询。

清单 4. portType tModel的绑定tModel特殊类型查询

<find_tModel generic="2.0" xmlns="urn:uddi-org:api_v2">
    <categoryBag>
        <keyedReference
            tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"
            keyValue="binding"/>
        <keyedReference
            tModelKey="uuid:082b0851-25d8-303c-b332-f24a6d53e38e"
            keyValue="uuid:11111111-1111-1111-1111-111111111111"/>
        <keyedReference
            tModelKey="uuid:4dc74177-7806-34d9-aecd-33c57dc3a865"
            keyName="SOAP protocol"
            keyValue="uuid:aa254698-93de-3870-8df3-a5c075d64a0e"/>
        <keyedReference
            tModelKey="uuid:e5c43936-86e4-37bf-8196-1d04b35c0099"
            keyName="HTTP transport"
            keyValue="uuid:68DE9E80-AD09-469D-8A37-088422BFBC36"/>
    </categoryBag>
</find_tModel>

查询businessService

如果用户想在自己权限范围内查询businessServices,和将它们作为bindingTemplates的部分来查询相反,那么用户就可使用WSDL相关信息(包括服务名字,服务名字空间、与WSDL服务相符合的businessService的事实)、普通的UDDI信息和主要的服务种类中的任何一种组合来查询。

清单5显示了带有局部名字为“StockQuoteService”和地址为http://example.com/stockquote/名字空间的 businessService 查询。 注意,使用categoryBag中的keyedReference来查询局部名字,而不是作为businessService的名字来查询。正如Technical Note中所提及的,为存在的UDDI businessService映射WSDL服务是有效的,在这种情况下,不能假定businessService和WSDL的服务名字是相匹配的。因此,WSDL服务名字总是存储在businessService categoryBag中,并且当根据WSDL服务名字来查询时,通常应该使用keyedReference

清单5. 与WSDL服务相符合的businessService查询 

<find_service generic="2.0" xmlns="urn:uddi-org:api_v2">
    <categoryBag>
        <keyedReference
            tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"
            keyValue="service"/>
        <keyedReference
            tModelKey="uuid:2ec65201-9109-3919-9bec-c9dbefcaccf6"
            keyValue="StockQuoteService"/>
        <keyedReference
            tModelKey="uuid:d01987d1-ab2e-3013-9be2-2a66eb99d824"
            keyValue="http://example.com/stockquote/"/>
    </categoryBag>
</find_tModel>

查询bingTemplates

当利用UDDI V2 API查询bindingTemplates时,由于V2 find_binding API需要一个serviceKey,第一次查询服务是必需的。如果对bindingTemplates的查询没有引用任何服务相关信息, 那么,将唯一使用tModelBag。但是,象前面章节中所描述的,使用tModelBag中的port/bindingTemplate信息,结合一些与服务相关的信息来做查询是可能的。

根据portType或绑定tModel可以查询bindingTemplates。如果所有portType绑定的实现是必需的,那么查询应该使用和portType相应的tModel键值。如果仅仅portType的单一绑定的实现是必需的,那么必须找到正确的绑定tModel,并且必须在find_query中使用绑定tModel的键值。如果所有portType绑定子集的实现是必需的,那么多个tModel键值必须是在tModelBag中提供的,并且必须提供orAllKeys findQualifier。否则,由于每一个bindingTemplate将只引用一个单一的绑定tModel,就不能返回bindingTemplates。因此,如果多个绑定tMode键值以缺省andAllKeys行为提供,那么bindingTemplates将与之不匹配。

如果返回多个服务,那么必须对每一个返回的服务做find_binding调用,否则几乎返回的每一个服务都会放弃。

清单6显示了一个find_service查询,后面跟着一个find_binding查询,用来查找与一个port相对应的bindingTemplate。这个port代表了一个portType的实现,而该portType是由tModel建模,key为uuid:11111111-1111-1111-1111-111111111111

清单6. 查询portType的实现

<find_service generic="2.0" xmlns="urn:uddi-org:api_v2">
    <tModelBag>
        <tModelKey>uuid:11111111-1111-1111-1111-111111111111<tModelKey>
    </tModelBag>
</find_service>

<find_binding serviceKey="key returned by previous query" 
generic="2.0" xmlns="urn:uddi-org:api_v2">
    <tModelBag>
        <tModelKey>uuid:11111111-1111-1111-1111-111111111111<tModelKey>
    </tModelBag>
</find_binding>

注意,两个查询中的tModelBag是相同的。

清单7显示了一个相似的查询,但是这次也使用一些与服务相关的信息,即希望得到的命名空间(Namespace)名字。

清单7. 在特定的命名空间中查询portType的实现

<find_service generic="2.0" xmlns="urn:uddi-org:api_v2">
<categoryBag>
        <keyedReference
            tModelKey="uuid:6e090afa-33e5-36eb-81b7-1ca18373f457"
            keyValue="service"/>
        <keyedReference
            tModelKey="uuid:d01987d1-ab2e-3013-9be2-2a66eb99d824"
            keyValue="http://example.com/stockquote/"/>
    </categoryBag>
    <tModelBag>
        <tModelKey>uuid:11111111-1111-1111-1111-111111111111<tModelKey>
    </tModelBag>
</find_service>

<find_binding serviceKey="key returned by previous query" 
generic="2.0" xmlns="urn:uddi-org:api_v2">
    <tModelBag>
        <tModelKey>uuid:11111111-1111-1111-1111-111111111111<tModelKey>
    </tModelBag>
</find_binding>

结束语

本章讲述了WSDL描述的新UDDI模型发布的的大部分通用的查询类型。在Technical Note中描述的方法允许发布灵活准确的查询,可以包括WSDL相关信息和其它信息,例如产业分类。

在这一个系列中的下一篇文章把Technical Note中描述的查询方法应用到一个样本WSDL描述,演示如何发布在这篇文章中讲述的一些查询类型。

参考资料

 

关于作者

John Colgrave是IBM WebSphere UDDI Registry的工程师,也是OASIS UDDI规范技术委员会的一位成员。他是一位关于使用UDDI和WSDL的新OASIS UDDI Technical Note的作者。



 

版权所有:UML软件工程组织