服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

uddi4j v2 编程


  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());

uddiproxy 要求同时指定查询 url 和发布 url。一旦设置之后,在修改这些值前所有的方法调用都使用这些 url。在使用发布 api 时,需要输入用户名和密码。通常情况下是通过用与所选的注册中心有关的 web 站点创建一个帐户来获得用户名和密码。

下面的代码片段是使用发布 api 的代码所需的典型的设置步骤。

// construct a uddiproxy object
uddiproxy proxy = new uddiproxy();

try {
// select the desired uddi server node
proxy.setinquiryurl("inquiryurl");
proxy.setpublishurl("publishurl");

// pass in userid and password registered at the uddi site
authtoken token = proxy.get_authtoken("userid", "password");
...
} catch (uddiexception e) {
...

uddi4j 的变化
uddi 版本 2 中有很多重要的变化,包括对版本 2 规范中内容的支持,还改进了 uddi4j 的行为,但这些改进与规范无关。

对 uddi 版本 2 特性的支持,包括:
企业关系
服务投影
增强的查询
国际化功能
与 uddi 版本 2 无关的改进:
包名称的变化
可插的传输
调试日志记录
集合类的改进
兼容性
uddi 版本 2 修改了一些已有的消息 api,并改变了所有进入和发出的消息上的版本标识符。结果,uddi 版本 2 和版本 1 之间出现了不兼容性。uddi 版本 2 注册中心能够接受版本 1 和版本 2 的消息。然而,版本 1 注册中心却不能处理版本 2 的消息。

uddi4jv2 只生成和处理版本 2 的消息,不支持版本 1 的消息。uddi4jv1 可以用来发送和接收版本 1 的消息。您可以在同一个 jvm 中同时使用 uddi4jv1 和 uddi4jv2 来与版本 1 或版本 2 的注册中心进行通信。我们并不期望有很多版本 1 的注册中心将继续运行下去,因为大部分注册中心都将升级以支持版本 2。

包名称的变化
作为对开放源代码的进一步承诺,uddi4j 的包名称已被从 com.ibm.uddi 改为 org.uddi4j。同样地,还定义了一个新的 web 站点,http://www.uddi4j.org,以容纳发行版和关于该项目信息。通过邮件列表,您不仅可以得到对常见问题的解答,而且还可以参与 uddi4j 的开发。

样本
uddi4j 版本 2 提供了一组扩展样本。它们使用配置器(configurator)类根据属性文件中提供的信息建立 ssl 提供者、设置 url 等等,从而简化了一些较为常规的设置工作。由于提供注册中心的是扩展的供应商,有关当前公共注册中心 url 的信息已经从样本中删除了。您可以在 http://www.uddi4j.org 站点的“links”主题下找到一个较为常用的注册中心 url 的列表。

配置改进
uddi4j 版本 2 增加了使用属性来设置的配置选项。这些属性可以作为系统属性来指定,如果需要,还可以在属性对象中设置它们,并传送到新构造器的 uddiproxy。如果同一个 jvm 中需要 uddi4j 的多个副本,这个新的构造器能够使用一种机制,根据属性文件配置环境,并允许 uddi4j 的每个副本按不同的配置运行。使用系统属性是一种更简单和更直观的配置 uddi4j 的方法。

您可以在代码中或在命令行设置系统属性,如下所示:

java -dpropertyname=propertyvalue pluggable transports

uddi4jv2 增加了对可插传输层的支持。uddi4jv1 需要使用 apache soap。自从第一次发行之后,出现了更多的 soap 实现。创建抽象和工厂层是为了支持多个 soap 传输提供者。apache soap 项目已经被接下来的 apache axis 项目取代了。uddi4jv2 的主要贡献者之一 hp 也提供 soap 传输。uddi4jv2 支持这三种 soap 传输。apache soap 还是缺省的传输。您可以通过设置下面的属性来指定使用其它的传输。


org.uddi4j.transportclassname=transport_class_name

被指定的传输类名称可以是下面包括的传输之一,也可以是第三方提供的 soap 传输。

org.uddi4j.transport.apachesoaptransport(缺省)
org.uddi4j.transport.apacheaxistransport
org.uddi4j.transport.hpsoaptransport
源自传输的通信错误将导致 org.uddi4j.transport.transportexception 被抛出。这种异常将包装可能包含其它详细信息的特定于传输的异常。

调试支持
uddi4j 增强了记录进入和发出消息的日志的能力。这在诊断 uddi 注册中心的通信问题时非常有用。输出是通过设置下面的系统属性实现的:

org.uddi4j.logenabled=true

所有 soap 传输都支持日志记录。hp soap 传输还有能用于决定日志目的地的属性。

代理
代理通常用于穿过防火墙进行通信,使得我们能够从公司内部网与因特网进行通信。代理可以通过 http 或 socks 实现。uddi4j 现在支持常用的 java 属性,以定义 http 和 socks 代理,从而实现穿越防火墙的通信。所需的值依赖于公司的网络配置,可以从网络管理员处获得。uddi4j 处理将一组基本的 http 代理属性传送到底层传输的任务。它支持的属性包括:

http.proxyhost ? 代理服务器的主机名。
http.proxyport ? 代理服务器使用的端口,缺省值为 80。
https.proxyhost ? 代理服务器的主机名(如果不同于 http 代理主机)。
https.p

扫描关注微信公众号