UDDI4J v2 编程
在 Doug Tidwell 的“UDDI4J: Matchmaking for Web services”之后,本文接下来将讨论 UDDI 客户机 API 的下一个版本,UDDI4J v2。我总结了版本 2 的 UDDI 规范中的种种变化,并更具体地讨论了新版本的 UDDI4J 中的 API 变化。新的 API 已经被修改并扩展为支持 UDDI 版本 2,并增加了一些与新的 UDDI 规范无关的一些变化。我提供了几个代码片段,并对它们进行了讨论,以说明如何使用新的 API。
UDDI4J 是什么?
Web 服务为分布式计算提供了一种新的范例。根据存储在 WSDL 中的描述而动态地调用 Web 服务,这种做法很有前景。由于 Web 服务用户越来越成熟,我们面临的下一步挑战将是如何寻找或发现他们可能感爱好的那些服务的存在。因为 Web 服务调用自动化的程度越来越高,所以对我们来说重要的是有一种能够按计划实现,而且可以用一种可预知的、可重复的方式来发现 Web 服务的方法。
统一描述、发现和集成(Universal Description,Discovery and Integration,UDDI)就提供了这样一种机制。UDDI 本身就是作为 Web 服务而定义的,它答应企业以及它们的服务在 UDDI 注册中心进行注册。一个已注册的服务可以包括象 WSDL 这样的描述性信息,还可以按照任意多种方式进行分类。对 Web 服务进行分类使您能够使用复杂的搜索,以便查找最希望得到的服务。
UDDI 被定义为一组能够从 UDDI 注册中心发送和接收的 XML 消息。UDDI4J 是用来与 UDDI 注册中心进行交互的客户机 Java API。UDDI4J 对象和方法用来构建请求消息并将其发送到注册中心。同样地,UDDI4J 解释来自 UDDI 注册中心的响应消息,并提供一组用来访问响应消息的对象和方法。
发行 UDDI4J 版本 1 是为了配合最初发行的公用 UDDI 企业注册中心(UDDI Business Registry,UBR)。UDDI 一直在不断发展,UDDI4J 也随之不断发展。UDDI 版本 2 规范几个月前就可以使用了,随之可用的还有一些测试版的注册中心。公用 UDDI 企业注册中心现在支持 UDDI 规范版本 2。2001 年 11 月 发行了 UDDI4J 版本 2 的测试版,然后 2002 年 7 月发行了非测试版。这个新的 UDDI4J 发行版增加了对规范中新特性的支持,还另外改进了可用性和配置。
UDDI4J 最初是由 IBM 于 2001 年 1 月作为一个开放源代码项目在 developerWorks 上发行的,这鼓励了其它公司和个人的加入。在版本 2 中,HP 作为 UDDI4J 的发展中一个主要的参加者加入了这一阵营,UDDI 版本 2 中的很多改进都是由它贡献的。在 IBM、HP 和 SAP 的积极支持和认可之下,UDDI4J 已经成为进行 UDDI 交互的缺省 Java API。
随着 UDDI 为了满足日益增长的 Web 服务社区的需求而继续发展,UDDI4J 将继续顺应这些变化。
UDDI4J 基础知识
UDDI4J 可以分为各种包。org.uddi4j.client.UDDIProxy 是用来与 UDDI 注册中心进行交互的主要的类。它代表将与之进行通信的那个 UDDI 注册中心的代理。UDDIProxy 提供了很紧密地与 UDDI 规范中定义的 API 进行映射的一些方法。其中的参数通常代表 UDDI 中各种元素的数据对象。
很多 API 调用都返回 org.uddi4j.response.DispositionReport 来表明操作的成功或失败。一些调用将抛出 org.uddi4j.UDDIException 来表明错误情况。根据错误的不同性质,UDDIException 可能包含 DispositionReport,其中有关于错误的更多信息。
UDDI API 可以分为查询 API 和发布 API。这些 API 使用不同的 URL。发布 URL 通常使用 SSL 来指定 https 地址。在使用 Java 编程语言中的 SSL 时,必须定义 JSSE 提供者,并将其添加到安全性治理器组中。下面的代码片段使用 Sun 的 Java 技术 JSSE 包启用了 SSL。您还可以通过修改 jdk/jre/lib/security/java.security 配置文件来添加安全性提供者。
System.setProperty("java.protocol.handler.pkgs",
"com.sun.net.ssl.internal.www.protocol");
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());