内容


发布服务:UDDI

Comments

关于本教程

本教程的目的

本教程是两篇研究统一描述、发现和集成(Universal Description, Discovery and Integration,UDDI)协议的教程中的第一篇。本教程提供了 UDDI 的高级概述,然后研究了如何用几种方法发布到 UDDI 注册中心。 我们将研究与 WSDK 一起提供的私有注册中心的 Web GUI 界面。然后,我们将研究与 WSDK 一起提供的 UDDIPublish 和 UDDIUnpublish 工具,最后,我们将深入研究 UDDI4J 并研究 UDDI Publish API。所有这些方法都提供了注册(“发布”)组织及其提供的服务的能力。 研究完 API 之后,将探讨发布过程。本教程还提供了用于设置和利用与 WSDK 一起提供的 UDDI 注册中心的指示信息。

从实用观点看,您将获得使用 WSDK 内置 UDDI 注册中心的实际经验。 通过使用各种可用的方法,可将企业和服务发布到该注册中心。还将构造使用 UDDI4J 的应用程序客户机,UDDI4J 能够将服务发布到 UDDI 注册中心。我们还将探讨如何发布到外部注册中心。

有了如此多有关 UDDI、各种 API 和所提供 Web 服务发现过程的背景信息,本教程的实验就变得相当简单易懂。 只要遵循下列步骤,就可以完成客户机应用程序,它可以将服务发布到 WSDK 的 UDDI 注册中心。

学习本教程所必备的知识

这篇教程假定您已具备了 Web 服务的应用知识,您知道如何使用 IBM WSDK 执行一些基本操作,譬如启动和停止服务器以及部署 Web 服务。还假定您已具备了 Java 编程语言和 XML 的应用知识。了解 J2EE 和 Ant 对学习本教程会有所帮助,但不是必需的。

所有的示例应用程序将部署在与 WSDK 一起提供的嵌入式 IBM WebSphere Application Server 上。提供的 Ant 构建脚本可以使构建和部署这些示例应用程序更方便和更可靠。在参考资料中,提供了有关 Ant、Java 编程语言、XML、IBM WebSphere 和 J2EE 方面的入门参考材料。

这篇教程包含的内容

本教程讲述了 UDDI 以及如何发布到 UDDI 注册中心。其中包含以下主题、工具和技术:

主题

  • 理解 UDDI 的基础知识
  • 使用 WSDK UDDI 注册中心 GUI
  • 使用 UDDIPublish 和 UDDIUnpublish 工具
  • 研究 UDDI4J
  • 通过使用 UDDI4J API 来使用 WSDK UDDI 注册中心

工具

  • UDDI GUI
  • UDDIPublish ― 发布到 UDDI 注册中心
  • UDDIUnpublish ― 从 UDDI 注册中心撤销发布
  • UDDI4J ― 发布到 UDDI 注册中心

教程技术

  • 通过其 GUI 界面与内部的 WSDK UDDI 注册中心进行交互
  • 通过使用 UDDIPublish 发布到 UDDI 注册中心
  • 通过使用 UDDIUnpublish 从 UDDI 注册中心撤销发布
  • 通过使用 UDDI4J API 发布到 UDDI 注册中心

工具

最起码您需要一个简单的文本编辑器和一个 Java SDK 1.3.1(WSDK 中包含了它)或者更高版本,用于编译示例。您还需要 IBM WebSphere SDK for Web Services(WSDK)。下载并获取关于 IBM WSDK 的信息。您也可以索取免费的 CD,在这些 CD 中包含 WSDK 和其它 IBM Web 服务现成产品(譬如来自 developerWorks Speed-start Web services 计划的 WebSphere Studio)。WSDK 提供了它自己的 Java SDK,以及一些批处理文件和程序,它们用于启动、停止和管理随 WSDK 一起提供的嵌入式 WebSphere 应用程序服务器。

虽然以手工方式构建和部署应用程序可能会有趣些,但教程中的所有示例都包含了 Ant 构建脚本,可以用这些脚本来构建和部署我们将创建的 Web 服务。在 Apache 的 Ant 主页上可以找到 Ant。

因为有大量的 jar 文件要管理,所以建议您使用集成开发环境(IDE)。我们使用 Eclipse 来构建样本应用程序,Eclipse 是一个可免费使用的 IDE。Eclipse 项目文件包含在实验练习 zip 文件中(请参阅参考资料)。由于 Eclipse 工作台还是 IBM WebSphere Studio Application Developer(Application Developer)的基础,因此项目文件与 Eclipse 和 Application Developer 均兼容。只要您按所建议的那样配置好环境,就可以直接使用这些 Eclipse 项目文件,而无需任何额外的工作。虽然 Eclipse 和 WebSphere Studio Application Developer 都不是必需的,但在以下位置可以找到这两者:它们分别位于 Eclipse 网站IBM WebSphere 开发人员专区。没有必要一定要使用 Eclipse 或 Application Developer,但它俩是功能齐全的 IDE,可以使您更方便地构建和使用 Web 服务项目。

UDDI 概述

UDDI 概述

UDDI(统一描述、发现和集成)是一个规范,用于创建分布式的基于 Web 的 Web 服务注册中心。UDDI 注册中心存储了关于企业的信息、这些企业提供的服务以及有关这些服务的技术信息。UDDI 所使用的数据模型和编程 API 是基于 XML 和 SOAP 的, 该数据模型和编程 API 提供了发布和定位各种各样的服务的方法。 这些服务不一定必需是 Web 服务。实际上,它们甚至可以完全不与计算机相关。

可以将 UDDI 注册中心与因特网搜索引擎相比较。搜索引擎包含经过索引和分类的有关万维网网页的信息。 然而,因特网搜索引擎只返回 Web 页面的 URL,而 UDDI 注册中心不仅需要返回服务的位置, 而且还需要返回有关服务、服务的工作方式、所使用的参数及其返回值等信息。

具体而言,UDDI 支持三种注册中心数据:白页(White Page)(按照名称将企业组织起来)、黄页(Yellow Page)(按照类别将企业组织起来)和绿页(Green Page)(按照服务将企业组织起来)。 这三种规范类型都属于 UDDI 规范,它们很好地概述了可以存储在注册中心中的不同类型的数据。

白页、黄页和绿页

白页

白页包含有关企业自身的信息,包括企业的名称、详细的联系人信息和企业地址。 另外,可以添加如税款标识或 D-U-N-S 编码之类的唯一标识来唯一地标识该企业。 一旦将该信息输入到注册中心中,客户就能够根据企业信息搜索注册中心。

白页信息借助 <businessEntity> 元素变得易于使用。(稍后将讨论 <businessEntity> 元素的用法)

黄页

黄页包含有关企业所提供服务的分类信息。分类是通过对企业采用一个或多个分类法完成的。 例如,一个服务可能被分类为“网上商店”服务,同时可能被分类为“音乐商店”服务。

黄页信息也与 <businessEntity> 元素相关。(稍后将讨论 <businessEntity> 元素的用法)

绿页

绿页包含有关企业所提供的服务的技术信息。该信息包括使用该服务所需的所有技术信息。 可以在绿页中找到象服务位置、该服务所属的类别以及服务的详细说明之类的信息。

绿页信息借助 <businessService> <bindingTemplate> 元素变得易于使用。(稍后将讨论 <businessService><bindingTemplate> 元素的用法)

在不久的将来,应用程序可以在 UDDI 注册中心中动态搜索它所需的服务。 然而,现在,更有可能的情况是:业务分析员手工搜索注册中心来查找他们所需的服务,以解决手头问题。 即使大多数注册中心包含用户友好的界面,但业务分析员也不太可能直接访问注册中心。 与 UDDI 注册中心的交互将通过现今可用的某个 UDDI 门户网站来进行。

程序员 API

UDDI 注册中心的接口被定义为一组 SOAP 消息,UDDI 注册中心接受这些消息来发布和定位服务。 这很有意义,因为创建了规范,以将它用作 Web 服务的注册中心。

正如在本教程中说明的那样,想要访问 UDDI 注册中心的开发人员可以用各种方法来实现这一点, 例如,通过使用基于 Java 的 SOAP API,或者通过使用定制的、基于 Java 的 UDDI 客户机 API。

本教程将 IBM UDDI4J 作为其编程 API。UDDI4J 是 UDDI 协议的开放源码的基于 Java 的实现, 它包含了一整套用于发布、查找和绑定 Web 服务的类。 最新版本的 UDDI4J(V2)提供了对 UDDI V2 规范的完全支持,同时提供了完整的日志记录能力, 另外还包含与以前版本相比经过改进的配置能力。本教程中展示的所有示例都是用 UDDI4J V2 编写的。

使用 WSDK UDDI GUI

使用 UDDI GUI

通过使用与 WSDK 一起预安装的 GUI,我们首先研究一下 UDDI。该 GUI 提供了在注册中心中定位服务和企业的功能, 以及发布和维护这些企业和服务的功能。我们将在本教程的其它部分使用 GUI(也称为“用户控制台”或简称为“控制台”)来发布一些企业和服务。该控制台还将用来检查在注册中心中发布的企业和服务信息。

要使用该控制台,应用程序服务器必须正在运行。要启动应用程序服务器,使用可在 &lt;<i>wsdk_home</i>&gt;/bin 目录(<i>wsdk_home</i> 是应用程序服务器的安装目录)中找到的 appserver 脚本。 如果需要有关运行应用程序服务器的更多信息,可以查看本系列中的第一篇教程。

要启动应用程序服务器:

  • 从命令行输入 appserver start
  • 请等待,直到屏幕上显示消息 Server <servername> open for e-business

要启动用户控制台,打开 Web 浏览器,转至 http://localhost:6080/uddigui。花一会儿功夫查看该控制台。

 UDDI 注册中心

UDDI 注册中心

稍后我们将更详细地讨论它。如果这是第一次启动该控制台,那么在注册中心中几乎没有什么信息, 但您可以花点儿时间四处看看。如果单击 Publish,则将要求您输入用户名和密码。 对于用户名,输入缺省值 admin,对于密码,输入缺省值 adminpwd。 因为发布需要 HTTPS 连接,所以可能会要求您接受一些证书。在出现的安全性对话框上单击 OKContinue(根据情况而定)。

注:
本教程假设应用程序服务器安装在本地系统上。本教程中的所有示例都是在新安装的 UDDI 注册中心上创建的。 因此,如果您已将其它企业或服务发布到了注册中心,那么该控制台的抓屏可能与您实际所看到的会有所不同。

深入研究 UDDI

UDDI 数据结构

UDDI 数据结构

UDDI 数据结构

UDDI 定义了五种数据类型结构,以指定注册中心中的某个项。 将一项分成这五种数据结构会使搜索和理解不同类型的信息变得容易许多。 这五种数据结构均各用一个 XML 文档表示,包含技术和描述性信息。

下面简要地描述了该模型中的每种数据结构。

<businessEntity>
<code>businessEntity</code> 结构包含有关企业及其提供的服务的所有描述性信息。 这些信息包括企业名称和对企业的描述以及联系人信息、分类以及与其它企业的关系。 可以将这种结构看作是注册中心中最顶层的服务结构。

<businessService>
每个 businessEntity 结构包含一个或多个 businessService 结构。businessService 结构描述由企业提供的经过分类的一组服务。businessService 元素不是由一个 businessEntity 元素拥有,而是可以在多个企业之间共享。

<bindingTemplate>
bindingTemplate 结构包含一个服务的技术性描述。每个 bindingTemplate 只属于单个 businessService 元素。

<tModel>
UDDI 的关键元素之一是 tModeltModel 描述服务所遵循的规范、行为、概念以至是共享的设计。 它提供有关如何与该服务交互的具体信息。tModel 结构的内容由键、名称、描述(可选)和 URL 元素组成。大多数情况下,URL 指向可以找到更多有关该特定 tModel 信息的位置。对于使用 tModel 一直采用了两个约定。这两个约定用于确定兼容性,或者用作带有键的名称空间引用。

<publisherAssertion>
publisherAssertion 结构包含有关双方之间由一方或者双方断言的关系。 许多企业(如大公司或商场)不能用单个 businessEntity 来有效地表示。publisherAssertion 可用来表示企业之间的关系。publisherAssertion 结构的内容包含第一家企业的键(fromKey)、第二家企业的键(toKey)和引用(keyedReference),该引用按照 tModel 中的 keyName、keyValue 对指定断言的关系。

称为 UUID(唯一通用标识,Unique Universal Identifier)的唯一标识是在将每个数据实例插入注册中心时为其生成的。UDDI 规范没有规定生成这个唯一数字的方法。 然而,在大多数情况下,这个数字是由硬件地址、时间戳记和随机种子数相结合而计算出来的。 按照需要使用 UUID 来访问特定的数据实例,可以将 UUID 用作外键,使属于同一项的多个数据结构绑定在一起。

标识符和类别

可以在 UDDI 注册中心中注册数量极其庞大的企业和服务。 为了以后能够定位这些企业和服务,必须很好地对内容进行分类。

在 UDDI 中,引入了标识符和类别来处理分类问题。UDDI 规范定义两个名为 <identifierbag> <categorybag> 的 XML 元素。 每个元素都可以包含一个或多个标识符或类别。

标识符是限定的键-值对,它们在注册中心中用附加信息标记一个项。 例如:在美国,Dun & Bradstreet, Inc. 几乎为每一家大型公司创建和维护了一个 D-U-N-S 号 (一个标识系统),以监控企业的信用概要信息。这个号码可以标识从事任何类型事务的企业。

该标识符的键是对 tModel 的引用,它描述了 D-U-N-S 号。正如前面叙述的那样,tModel 描述了技术规范。在 D-U-N-S 示例中,创建 tModel 来表示 DUNS 名称空间。在标识符中将引用该 tModeltModel 指出这个标识符的值表示 DUNS 号。

类别非常类似于标识符。类别是带有预定义名称空间的标识符。UDDI 的创建者已经预定义了四个名称空间, 从而使 UDDI 中各项的分类变得更容易。这四个预定义名称空间都用 tModel 表示。就象标识符一样,类别包含对其所属的 tModel 的引用(该引用表示这个 tModel)。

预定义的名称空间:

UNSPSC ― 通用标准和产品分类
不同产品的标准定义。可以在 UNSPSC 网站上找到更多信息。
NAICS ― 北美行业分类系统(North American Industry Classification System)
基于公司所属行业的企业分类系统。可以在 NAICS 网站 上找到更多信息。
ISO 3166 ― 地理分类系统
全球不同地域和位置的标准定义。可以在 ISO 网站上找到更多信息。
其它
企业可能想要建立的通用的协会。用于那些与其它分类名称空间不兼容的分类法。

使用 GUI 将服务发布到注册中心

概述

本教程中使用的企业和服务是虚构的在线 DVD 商店服务。 在这一部分中,通过使用 GUI,您将手工输入 DVDOnline 企业和服务。我们将完成这一步,以便您可以方便地查看注册中心的信息和结构。一旦完成了这一步,我们将探讨发布到注册中心的其它方法,包括使用 UDDIPublish 工具,以及使用 UDDI4J Publishing API,以编程方式来发布 DVDOnline 企业和服务。

WebSphere UDDI 注册中心附带了用于发布和定位服务的 Web 控制台。当注册中心运行在本地机器上时,可以在 http://localhost:6080/uddigui 上找到这个控制台应用程序。

一旦启动 GUI 之后,左侧窗格就会提供用于定位企业、服务和技术模型的菜单。我们将在下一篇教程中讨论服务的定位和绑定。

发布 businessEntity

将信息发布到 UDDI 注册中心需要安全地连接到注册中心,但查询注册中心无需任何权限便可进行。 这意味着,可以通过使用 HTTP 来建立用于查询注册中心的连接,但发布信息时,需要 HTTPS。

单击控制台顶部面板上的 Publish。该应用程序试图通过使用 HTTPS 建立与注册中心的安全连接。 为了能够创建这个连接,需要用户名和密码。对于本教程,使用缺省的 Administrator 帐户来发布服务。用户名是 admin,密码是 adminpwd。 登录后,左侧窗格显示三个单独的面板,它们用于发布和维护企业和服务。

注册中心允许仅根据企业或服务的名称创建企业或服务。

  • Quick Publish 面板中,选择 business,在标示为 called: 的文本输入域中输入名称 DVDOnline,然后单击 Publish Now

右侧面板显示了有关刚才所输入的企业的概述。

企业概述

企业概述

在该企业的 Discovery URLS 下面,您将看到这一项的 Use typebusinessEntity。 所显示的另一段信息是该项的 Business Key(即 UUID)。它应该类似于:24851C0A-0E73-469A-9805-0635125C00B3。 该键是自动生成的,它唯一地定义了注册中心中的企业。

添加描述性信息

您刚创建的企业不包含任何描述性信息。为了添加这类信息,需要编辑该项的内容。 为了做到这一点,在屏幕左侧窗格的 Registered information 面板上选择 Show owned entities。 当前用户(admin)所拥有的所有企业、企业关系和技术模型都将显示在右侧面板中。 在 Registered Businesses 下,单击刚才创建的 DVDOnline 企业的 Edit 选项。

添加描述性信息

添加描述性信息

Edit Business 页上,有几个选项可用来提供完整的企业描述。

可以用另一种语言输入该企业的另一个名称。输入 DVDOnline-es,在 Language 这一项选择 Spanish,然后单击 Add

Description 部分中,可以输入公司的文本描述。请牢记:一些注册中心为输入的值定义了最大内容长度, 所以描述应该简洁。就象公司名称一样,可以用多种语言输入该企业的描述。 对于本示例,用英文提供一个简单的描述就够了。

输入 Online DVD store 作为描述,然后单击 Add

:只有在选择了 Update Business 选项之后,才会使对注册中心进行的更改生效。 如果输入信息时花了太多时间,则可能会发生会话超时(Session Timeout)。为了避免超时错误, 可以间或选择 Update Business 来更新服务。如果您这样做了,并且想返回到 Edit Business 控制台, 则只要在左侧窗格中再次单击 Show Owned entities,然后针对您正在处理的企业,选择 Edit

添加定位器信息

该企业的下一个描述部分包含定位器信息。在这一部分中,将类别添加到企业,搜索该企业时就是根据这些类别进行的 - 类别和标识符在本教程前文中有述。

控制台使您可以手工输入键名和键值。当您不熟悉每个规范确切的预定义键名及键值时, 控制台还提供了在多个名称空间中搜索所需类别的可能性。现在,我们将搜索类别。

  • 在 Locator 部分中,单击 Show Category tree

左侧窗格显示了可用的名称空间。将为您指定的第一个类别是该企业的地理位置。

  • 在左侧窗格中,单击 geo 名称空间前面的加号 +,以展开该节点。
  • 现在,展开 World 节点,在 World 下查找 United States [US],然后单击 United States 节点以选中它。

在右侧窗格中,将该类别的值输入到相应的域中。

  • 确认正确后,单击 Add
  • World 下查找 Mexico 节点,然后添加 Mexico 作为另一个地理位置。

要添加的另一个类别是 NAICS Electronic Shopping and Mail-Order Houses 类别。就象在添加地理类别时那样, 使用左侧面板上的名称空间树来查找该类别。可以在 naics -> Retail Trade[45] -> Nonstore Retailers [454] 下找到它。

找到之后,单击该类别,然后在右侧面板中单击 Add,以将该类别指定给该企业。

Edit Business 面板的最后部分是 Contacts 部分。可以指定任意数量的人作为该服务的联系人。

  • 将您自己的姓名添加为该服务的联系人。
  • 输入您希望在该企业中担任的角色。
  • 单击 Add

输入完所有描述性信息之后,单击 Update Business,以将更新的企业信息发布到注册中心。 该控制台显示了整个企业的概述,包括您刚才输入的信息。

businessEntity XML 描述

当单击 Discovery URLS 部分中的 URL 时,会显示该 businessEntity 的 XML 描述。

<?xml version="1.0" encoding="UTF-8"?>
<businessDetail generic="2.0" xmlns="urn:uddi-org:api_v2"     
   operator="www.mycompany.com/uddi" truncated="false">
	<businessEntity businessKey="17303311-25B7-41C4-9441-035E236B3A72" 
          operator="www.mycompany.com/uddi" authorizedName="admin">
		<discoveryURLs>
			<discoveryURL useType="businessEntity">  
                          http://localhost:6080/uddisoap/get?businessKey=
                          17303311-25B7-41C4-9441-035E236B3A72
                     </discoveryURL>
		</discoveryURLs>
		<name xml:lang="en">DVDOnline</name>
		<name xml:lang="es">DVDOnline-es</name>
		<description xml:lang="en">Online DVD store</description>
		<contacts>
			<contact useType="Director">
				<personName>Jack Smith</personName>
			</contact>
		</contacts>
		<categoryBag>
			<keyedReference 
                       tModelKey="UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88"             
                       keyName="United States" keyValue="US"/>
			<keyedReference 
                       tModelKey="UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88"             
                       keyName="Mexico" keyValue="MX"/>
			<keyedReference 
                       tModelKey="UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" 
                       keyName="Electronic Shopping and Mail-Order Houses" 
                       keyValue="4541"/>
		</categoryBag>
	</businessEntity>
</businessDetail>

正如您所见,categoryBag 元素已经被添加到 businessEntity 中。categoryBag 包含对您先前所选择类别的引用。请特别注意对该企业的地理位置的引用。美国的 keyNamekeyValue 的值与墨西哥的值是不同的,但对指定数据的 tModel 的引用仍然都相同。 这两类数据都是根据这同一个 tModel 中的说明构造的。

发布技术模型

正如前面叙述的那样,我们将在本教程中发布多个 Web 服务示例 ― 在本章中以手工方式发布,然后, 在稍后使用 UDDIPublish 发布,再后面,以编程方式发布 Web 服务。所有这些 Web 服务都在 Online DVD Store 环境中, 并且遵循相同的技术说明。换言之,我们将发布的服务都将以完全相同的方式运作。为了表达这种相似行为,可以将该服务的技术说明作为技术模型(tModel)添加到 UDDI 注册中心中。 一旦输入到注册中心之后,该 tModel 将接收一个唯一的标识符(UUID)。 该标识符将成为在创建实际服务时添加到服务中的引用。

  • 单击 UDDI 控制台顶部面板中的 Publish
  • 在左侧面板中,选择 Advanced Publish 部分中的 Add a technical model

右侧面板显示 Publish Technical Model 屏幕,在该屏幕中,可以输入该技术模型的信息。

  • 输入名称 Online DVD Order,以作为该技术模型的名称。

就象处理 businessEntities 时一样,可以为该 tModel 输入简短的描述。对于每种可用的语言,只能输入一段描述。

  • 为该 tModel 输入简短描述,然后单击 Add

还可以为该技术模型输入定位器信息(标识符和类别)。 该信息可用于根据这里指定的类别来定位该 tModel

  • 单击 Show category tree

名称空间树出现在控制台的左侧面板中。

  • 选择 Specification for a Web Service described in WSDL 名称空间(udditype -> These types are used for tModels [tModel] -> Specification for a Web Service [specification])。
  • 在右侧面板中单击 Add,以添加该定位器。

Overview URL 部分中,必须输入实际说明的位置以及该说明的简短描述。

在上一步中,定义了说明(tModel),它是用 WSDL 文档说明的。 这里将要输入的 URL 是 WSDL 文档所在位置的 URL。

  • 输入 WSDL 的 URL http://localhost:6080/DVDOnline/services/OrderDVDService.wsdl
  • 输入该 WSDL 文档的简短描述。

正确输入所有信息之后,单击 Publish Technical Model。在此阶段,生成该模型的 UUID, 而且可以查看该技术模型的详细信息。

发布 businessService

在前几章中,您发布了企业信息以及有关服务的技术信息。然而,还没有创建实际的服务。 要实现这一点,可以将服务添加到 DVDOnline businessEntity。

  • 单击页面顶部的 Publish 按钮。
  • 单击控制台左侧面板中的 Show owned entities
  • 针对先前创建的 DVDOnline 企业,单击 Add service

Publish Service 页面出现在控制台的右侧面板中。

发布 businessService

发布 businessService

  • 输入服务名称(Service Name)OrderDVD 然后单击 Add
  • 提供该服务的简短描述,然后单击 Add

该页上的下一部分是 Access Points 部分。提供该服务的访问点。请牢记,在 UDDI 注册中心中注册的每一项服务并非都是 Web 服务。这里提供的访问点可以是电子邮件地址、电话号码或者任何其它可以与该特定服务联系的类型。 对于该示例,访问点是实际 Web 服务的 Web 地址。

  • 选择 http 作为 URL 类型(URL type)。
  • 输入服务所在的地址(Address)http://localhost:6080/DVDOnline/services/OrderDVD,然后单击 Add

可以按分类企业实体和技术模型的方式对服务进行分类。 可以向该服务添加定位器信息,以便今后可以根据这里提供的类别来定位该服务。 可以随便浏览一下名称空间树,然后找到您认为最适合的类别。对于该示例,将添加地理类别。

  • 添加 United States 作为定位器信息。可以在 geo 名称空间中找到该类别。
  • 单击该页面底部的 Publish Service

将出现一个显示该服务详细信息的页面。

添加技术模型引用

可以向 businessService 添加的最后一点信息是对技术模型的引用。您先前已经创建了名为 Online DVD Order 的技术模型。为了指定该服务将遵循这个特定说明,现在,可以将对该技术模型的引用添加到该服务中。

  • Technical Models 部分中,单击 Add。会显示 Find Technical Models 屏幕。在该屏幕上,您将看到:可以用几种不同方式定位服务。

查找技术模型

查找技术模型

  • Starting with 文本框中输入单词 Online,然后单击 Find Technical Models

这时会出现您先前发布的技术模型。

查找技术模型

查找技术模型

  • 选择该模型(选中 Select 复选框),然后单击 Update

这将把您带回到 Publish Service 屏幕。如果您对所有已正确输入的信息感到满意,则单击 Publish Service;这样将发布该服务并显示该服务的详细信息。

服务的详细信息

服务的详细信息

服务的 XML 结构

如果您回到前面关于企业的那部分并查看它的 XML 结构(单击 Find,搜索您的企业,然后单击 Discovery URLS 部分中的 URL),您将看到 businessService 元素已经被添加到 businessEntity。下面显示了该服务的 XML 结构:

<businessService serviceKey="302813FA-0ECB-49A9-A4D8-3D3F18F03627" 
    businessKey="24851C0A-0E73-469A-9805-0635125C00B3">
	<name xml:lang="en">OrderDVD</name>
	<bindingTemplates>
		<bindingTemplate 
                bindingKey="2294343A-03D6-4980-B92A-3E0D0EFB15B9" 
                serviceKey="302813FA-0ECB-49A9-A4D8-3D3F18F03627">
			<accessPoint URLType="http">   
                        http://localhost:6080/DVDOnline/services/OrderDVD
                    </accessPoint>
			<tModelInstanceDetails>
		         <tModelInstanceInfo 
                        tModelKey="UUID:1B830749-20BB-4F97-BADF-24353B5424E8"/>
			</tModelInstanceDetails>
		</bindingTemplate>
	</bindingTemplates>
	<categoryBag>
		<keyedReference 
                 tModelKey="UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88" 
                 keyName="United States" 
                 keyValue="US"/>
	</categoryBag>
</businessService>

如果您再仔细地看一下,您将注意到 businessKey 属性的值是 businessEntity 的 UUID,已经给 businessEntity 指派了该服务。

serviceKey 属性包含 UUID,可根据该 UUID 来唯一定义该服务。

tModelInstanceInfo 元素的 tModelKey 属性包含先前创建的技术模型的 UUID。

bindingTemplates 中包含对 tModel 的引用。绑定模板包含 tModel 引用和可选的对远程托管的服务的引用。

从命令行发布服务

UDDIPublish 概述

在本教程的上一章中,我们了解了如何使用 GUI 控制台将服务发布到 UDDI 注册中心。 当您第一次学习注册中心时,GUI 工具非常有用,但如果有许多服务要发布,那么 GUI 就有点儿笨拙。WSDK 还包含两个用于发布和撤销发布服务和实体的命令行工具:UDDIPublish 和 UDDIUnpublish。

UDDIPublish 工具可用于从命令行发布 BusinessEntityBusinessService。 该工具位于 <wsdk_home>\bin 目录中。

使用命令行工具发布 BusinessEntity

要发布 BusinessEntity,UDDIPublish 工具需要两个必要参数:

  • business:指出将新的 BusinessEntity 项添加到注册中心。
  • businessName <name> :指定 BusinessEntity 的名称。

用法:

UDDIPublish -business -businessName 
                        <name>

当发布操作成功完成时,该工具返回输入到注册中心的这一项的 UUID。 如果您不告诉该工具使用其它用户名和密码,那么它将使用缺省用户名 admin 和缺省密码 adminpwd,正如下面所描述的。 下面的示例使用 UDDIPublish 来发布另一个名为 DVDOnline 的企业,还带有该工具返回的输出。

\bin\UDDIPublish -business -businessName DVDOnline

Publish operation was successful.
Created Business with key = 38B620EF-15C4-48F8-BE82-292F13B535EC

这里,您可以看到,已经创建了一个带给定键的企业。如果我们再次浏览注册中心,将看到:现在有两个具有该名称的企业。 这次,让我们使用 GUI 的 Find 功能进行浏览。单击 GUI 顶部的 Find 按钮,转至左侧面板,单击 business。在文本域中填入 %(通配符),然后单击 browse。您应该看到下面这个屏幕。

发布

发布

除了必要的参数外,该工具还接受其它一些参数来确定有关 BusinessEntity 的其它信息。

  • businessDescription <description> :确定新企业的文本描述。如果 &lt;description&gt; 包含任何空格,那么用引号将它括起来。
  • username <name> :如果您不想使用缺省的用户名,则指定一个用户名,将它传递给私有的 UDDI 注册中心。
  • password <password> :如果您不想使用缺省的密码,则为所提供的用户名指定 UDDI 注册中心密码。
  • uddiprops <location of properties file> :指定一个常规的 Java 特性文件,该文件包含用等号分隔的名称-值对。

-uddiprops 的特性文件可以包含名称-值对,它定义了有关 BusinessEntity 的附加信息。 您可以在帮助文档中查找许多特性。有两个重要的特性允许您向不同于内部 WSDK 注册中心的其它注册中心进行发布或查询,我们将略微地研究一下它们。

使用命令行工具发布 BusinessService

要发布 BusinessService,UDDIPublish 工具需要五个必要的参数。

  • service:指定将新的 BusinessService 添加到注册中心中。
  • serviceName <name> :指定 BusinessService 的名称。
  • businessName <name> :指定包含这个服务的 BusinessEntity 的名称。
  • wsdlLocation <URI of WSDL> :是指向描述这个服务的 WSDL 文档位置的 URI。
  • accessPoint <URL of the service> :实际企业服务的 URL。

用法(请注意已对下面的命令添加了断行符;应该在一行上输入每条命令。):

UDDIPublish -service -serviceName 
                        <name>
                        
                     -businessName &lt;name&gt;
   -wsdlLocation 
                        <URI of WSDL document>
                        
                      -accesspoint &lt;URL of web service&gt;

发布操作成功完成后,该工具返回已输入到注册中心的这一项的 UUID。

除了这两个必要的参数之外,该工具还接受其它一些参数来指定有关 BusinessService 的其它信息。

UDDIUnpublish - 使用命令行工具除去 BusinessEntity

UDDIUnpublish 工具可以用于从命令行除去(撤销发布)BusinessEntityBusinessService。UDDIUnpublish 工具位于 <wsdk_home> \bin 目录。

要除去 <code>BusinessEntity</code>,UDDIUnpublish 工具需要两个必要参数:

  • business:指出将新的 <code>BusinessEntity</code> 项添加到注册中心。
  • businessName <name> :指定 BusinessEntity 的名称。

用法:

UDDIUnPublish -business -businessName 
                        <name>

该工具还接受其它参数。例如,当两个企业实体注册名称相同时,就必须使用 -businessKey <key> 参数。businessKey 用于唯一地定义可以从注册中心除去的服务。

一旦从注册中心成功除去了 BusinessEntity,该工具就显示被除去项的 UUID。

Business test
 with business key 1F7126DC-34DA-40DC-9600-2D5A20312CAC
 was successfully deleted from registry.

UDDIUnpublish - 使用命令行工具除去 BusinessService

要除去 BusinessService,UDDIUnpublish 工具需要四个必要参数:

  • service:指定将新 BusinessService 添加到注册中心。
  • serviceName <name> :指定 BusinessService 的名称。
  • businessName <name> :指定包含这个服务的 BusinessEntity 的名称。
  • removeTModels:指定还必须从注册中心除去与该服务关联的绑定模板(Binding Template)和 tModel。

用法:

UDDIUnpublish -service -serviceName 
                        <name>
                        
                     -businessName <name> -removeTModels

在发布操作成功完成后,该工具返回刚才从注册中心除去的这一项的 UUID。

发布到外部注册中心(IBM Test Registry)

要发布到外部注册中心,就要在 UDDIPublish 的特性文件中包含以下两个特性:

  • wsdk.uddi.publish.url= <URL of registry to publish to> :将该 URL 覆盖为远程 UDDI 注册中心的发布 API。除非设置了这个特性,否则该工具将发布到 WSDK 私有注册中心。
  • wsdk.uddi.inquiry.url:将该 URL 覆盖为远程 UDDI 注册中心的查询 API。除非设置了这个特性,否则该工具将把查询发送到 WSDK 私有注册中心。

由于 IBM Test Registry 是 IBM Speed-start Web services 计划的一部分,所以您可以使用它发布您的测试数据。需要向这个测试注册中心进行注册,从而能有效地登录到该测试注册中心。您可以到 https://uddi.ibm.com/testregistry/registry.html 注册。一旦登录,就可以使用这个注册中心以及使用 WSDK 附带的特性文件向该测试注册中心进行发布。这个特性文件位于 <wsdk_home> /appserver/properties/speedstart.properties,它具有登录到这个测试注册中心的正确特性。以下列出了它的内容。

# Properties specific to IBM Speed Start

# URLs pointing to IBM test registry
wsdk.uddi.publish.url=https://uddi.ibm.com/testregistry/publishapi
wsdk.uddi.inquiry.url=https://uddi.ibm.com/testregistry/inquiryapi

# Added to category bags belonging to published services
wsdk.uddi.publish.bs.keyref.name.1=Web service information for the developerWorks 
   Web services community
wsdk.uddi.publish.bs.keyref.value.1=General
wsdk.uddi.publish.bs.keyref.tmodelkey.1=UUID:8F497C50-EB05-11D6-B618-000629DC0A53
wsdk.uddi.publish.bs.keyref.name.2=Web service information for the developerWorks 
   Speed Start community
wsdk.uddi.publish.bs.keyref.value.2=Speed Start
wsdk.uddi.publish.bs.keyref.tmodelkey.2=UUID:8F497C50-EB05-11D6-B618-000629DC0A53

# Added to category bags belonging to published business
wsdk.uddi.publish.be.keyref.name.1=Web service information for the developerWorks 
   Web services community
wsdk.uddi.publish.be.keyref.value.1=General
wsdk.uddi.publish.be.keyref.tmodelkey.1=UUID:8F497C50-EB05-11D6-B618-000629DC0A53
wsdk.uddi.publish.be.keyref.name.2=Web service information for the developerWorks 
   Speed Start community
wsdk.uddi.publish.be.keyref.value.2=Speed Start
wsdk.uddi.publish.be.keyref.tmodelkey.2=UUID:8F497C50-EB05-11D6-B618-000629DC0A53

假设您的用户名是 <i>DVDOnline</i>,而您的密码是 <i>musicrocks</i>,那么就可以使用以下命令将企业发布到该测试注册中心。 注:已对下面的命令添加了断行符;这条命令位于一行上。还必须连接到因特网,以真正发布到 Speed Start 注册中心。

c:\WSDK_v5\bin\UDDIPublish -business -businessName DVDOnline 
  -username DVDOnline -password musicrocks 
  -uddiprops c:\WSDK_v5\appserver\properties\speedstart.properties  

Using properties in file c:\WSDK_v5\appserver\properties\speedstart.properties
Using publish URL : https://uddi.ibm.com/testregistry/publishapi
Using inquiry URL : https://uddi.ibm.com/testregistry/inquiryapi
Publish operation was successful.
Created Business with key = AE9D23B0-33B5-11D7-9F18-000629DC0A53

要搜索您的企业,请转至 <a href="https://uddi.ibm.com/testregistry/registry.html">IBM 测试注册中心</a>并登录。

您应该在搜索结果中看到您的企业。

如果想查看详细信息,可以单击企业名称,会发现这个企业键就是创建该企业时所返回的同一企业键。

使用 UDDIUnpublish 工具以及同一个 speedstart.properties 文件使该工具指向 IBM 测试注册中心,以此来撤消发布。注:已对下面的命令添加了断行符;这条命令位于一行上。

c:\WSDK_v5\bin\UDDIUnpublish -business -businessName DVDOnline 
   -username DVDOnline -password musicrocks 
   -uddiprops c:\WSDK_v5\appserver\properties\speedstart.properties 
   -businessKey AE9D23B0-33B5-11D7-9F18-000629DC0A53 
   
Using properties in file c:\WSDK_v5\appserver\properties\speedstart.properties
Using publish URL : https://uddi.ibm.com/testregistry/publishapi
Using inquiry URL : https://uddi.ibm.com/testregistry/inquiryapi
Business DVDOnline
 with business key AE9D23B0-33B5-11D7-9F18-000629DC0A53
 was successfully deleted from registry.

如果您现在搜索这个注册中心,就会看到那里已经没有这个企业了。

用 UDDI4J 发布

UDDI4J 概述

正如本教程前面提到的,注册中心的编程接口是凭借一组在 UDDI 规范中定义的 SOAP 消息。要创建与 UDDI 注册中心交互的程序,程序员需要创建 UDDI 注册中心可以理解的 SOAP 消息。

编写创建这些 SOAP 消息的程序有许多种方法。最轻松也最常见的方法是使用位于 SOAP 之上的某种高级 API。IBM UDDI4J 就是这样一个 API。它是 UDDI 协议的开放源码 Java 技术实现。

在本教程的前面,我们已经看到了 UDDI 注册中心内的数据结构,还以不同方式与注册中心进行了交互。这里,我们将继续讨论这一点,向您展示如何使用 UDDI4J 与注册中心交互。

UDDI4J 基础知识

UDDI4J 是由 org.uddi4j 下的一些包构成的。这些包有:

  • org.uddi4j.client -包含重要的客户机类 UDDIProxy
  • org.uddi4j.datatype - 表示 UDDI 数据对象
  • org.uddi4j.request - 包含发送到服务器的消息
  • org.uddi4j.response - 表示来自 UDDI 服务器的响应消息
  • org.uddi4j.transport - 支持可插入的传输
  • org.uddi4j.util - 用于各种任务的实用程序类

您将使用的主类之一是 org.uddi4j.client.UDDProxy 类。它是可通过客户机代码访问 UDDI 服务器的代理。它的方法映射到 UDDI 程序员 API 规范(UDDI Programmer's API Specification)中的消息。

在这一章中,我们的方法是一步一步地研究一个示例,这个示例详述了使用 UDDI4J 的重要步骤。我们将跳过这些详述部分中的某些细节(如包导入和变量声明),但在本章最后的完整代码清单中可以获得所有这些细节。

要获得其它大量的信息,请访问 UDDI4J 网站。推荐您下载该站点上 UDDI4J 的二进制发行版,并浏览该库的 Javadoc。

设置环境

正如下面的代码所演示的那样,需要设置许多特性。其中的许多特性设置必须针对 HTTPS,因为正如您在前面看到的,需要使用 HTTPS 发布到 UDDI 注册中心。这里我们不讨论 HTTPS 的细节,因为这超出了本教程的范围。不过可以参阅本系列的安全性教程以获得更多信息。

用编程方式获得 HTTPS 连接有点复杂,因为 JDK 中的 java.net.URL 类不支持 HTTPS 协议。要使用 HTTPS,就需要它的一个实现,而 WSDK 就附带了这样一个实现。要启用对 HTTPS 的支持,需要在运行时指定这个 HTTPS 实现,如下所示:

System.setProperty("java.protocol.handler.pkgs","com.ibm.net.ssl.internal.www.protocol");

代码清单 1:设置环境

// imports ...

public class Publisher {

  // ...

  // Trust file supplied with the WSDK.
  private static final String trustStoreFilename = "DummyClientTrustFile.jks";
  // Password for WSDK trust store.
  private static final String trustStorePassword = "WebAS";

  // ...

  private void setEnvironment() {
    //Set appserver username and password
    System.setProperty("http.basicAuthUserName", "admin");
    System.setProperty("http.basicAuthPassword", "adminpwd");
    String WAS_HOME =   
         System.getProperty("wsdk.app.server.home");
    if ( WAS_HOME == null || WAS_HOME.equals("") ){
       // Can't find WAS - print error message and exit ...
    }
    trustStoreDirPath = WAS_HOME + java.io.File.separatorChar
                        + "etc" + java.io.File.separatorChar;
    //Set the trust store file and password 
    System.setProperty("javax.net.ssl.trustStore", 
                        trustStoreDirPath +
                        trustStoreFilename);
    System.setProperty("javax.net.ssl.trustStorePassword", 
                        trustStorePassword);
    //Add SSL as a supported protocol.
    System.setProperty("java.protocol.handler.pkgs", 
                   "com.ibm.net.ssl.internal.www.protocol");
  }

访问注册中心

UDDI4J 包中最重要的类是 org.uddi4j.client.UDDIProxy 类。它是访问 UDDI 注册中心时的主要对象。它包含连接到注册中心、查询注册中心和处理结果所必需的所有方法。它有一个构造函数,该函数使用向 UDDI 注册中心发布信息的 URL。

将信息发布到安装在本地机器上的 WSDK 注册中心的 URL 是:https://localhost:6443/uddisoap/publishapi

代码清单 2:创建 UDDIProxy

  private static String publishURLsecure = 
      "https://localhost:6443/uddisoap/publishapi";

// ...

  private void setupProxy(){
    //set up proxy
    proxy = new UDDIProxy();
    try {
      proxy.setPublishURL(publishURLsecure);
    } catch (MalformedURLException e) {
      // Can't create proxy - exit ...
    }
  }

获得权限标记

为了能够发布服务,必须使用权限标记。通过安全的连接将有效的用户名和密码提交给注册中心就可以获得此标记。所返回的对象是 org.uddi4j.response.AuthToken 对象。所有发布者 API 调用都需要这个对象。

代码清单 3:获取标记

  //Get authorization token
  private String getAuthorization(String usr, String pwd){

    String authInfo = null;
    try {
      AuthToken authToken = proxy.get_authToken(usr,pwd);
      authInfo = authToken.getAuthInfoString();
    }catch (Exception e){
    
    }
    return authInfo;
  }

创建 businessEntity

一旦获得了权限标记,就必须创建 org.uddi4j.datatype.BusinessEntity 对象。BusinessEntity 对象包含所有构成 businessEntity 元素的参数,在数据模型中描述了 businessEntity 元素。由于您将为这个企业提供两个名称(一个用英文,一个用西班牙文),所以缺省构造函数用于创建 BusinessEntity 对象,而稍后设置其名称。

必须为这个企业实体提供企业键。因为将发布一个新 businessEntity,所以要提供一个空字符串作为企业键。这将告知注册中心:在将这个企业实体项插入到注册中心时要为该项生成唯一键。

创建了 java.util.Vector 对象,它可以包含任意个 org.uddi4j.datatype.name 对象。每个 name 对象包含一种特定语言的企业名称。setLang() 方法的参数是一个包含语言标识符的 String 对象。(ISO3166 中规定了一些允许的语言标识符值。)

在定义了英文名和西班牙文名后,通过调用 setNameVector() 方法将 Name 对象的向量添加到 businessEntity 对象。

注:用编程方式发布的企业和服务与使用控制台发布的企业和服务相同。完成发布后,可以对通过这两种方式发布的服务进行比较,以确保您的程序正确有效。这两种方式发布的企业和服务的 UUID 将不同,这是很自然的。

代码清单 4:创建 BusinessEntity 对象

  void publishBusinessEntity() {
    try {
  
      //Create the DVDOnline businessEntity Object
      BusinessEntity businessEntity = new BusinessEntity();
      businessEntity.setBusinessKey("");

      Vector businessNames = new Vector();

      Name businessName_EN = new Name();
      businessName_EN.setLang("en");
      businessName_EN.setText("DVDOnline");
      businessNames.add(businessName_EN);

      Name businessName_ES = new Name();
      businessName_ES.setLang("es");
      businessName_ES.setText("DVDOnline-es");
      businessNames.add(businessName_ES);

      businessEntity.setNameVector(businessNames);

      // ...

向 BusinessEntity 添加描述

调用 BusinessEntity 对象上的 setDescriptionVector() 方法可以向服务添加描述。

因为可以用多种语言添加描述,所以 setDescriptionVector() 方法使用 java.util.Vector 对象作为其唯一参数。Vector 包含许多 org.uddi4j.datatype.Description 对象。每个 Description 对象包含针对某一种特定语言的描述。

setLang() 方法的参数是一个包含语言标识符的 String 对象。ISO3166 中规定了一些允许的语言标识符值。

语言标识符和描述文本还可以作为构造函数的参数输入。

代码清单 5:添加描述

      // ... 
      //The description for this businessEntity
      Description description = new Description();
      description.setLang("en");
      description.setText("Online DVD store");

      Vector descriptionVector = new Vector();
      descriptionVector.add(description);
      businessEntity.setDescriptionVector(descriptionVector);

向 BusinessEntity 添加定位器信息

在向 businessEntity 添加定位器信息时,可以使用 Inquiry API 定位相应的类别或 tModel。由于我们将在下一篇教程中讨论 Inquiry API,所以在这里手工输入定位器信息。

org.uddi4j.util.KeyedReference 对象用于表示对某个特定类别的引用。KeyedReference 类包含各种构造函数以便只用一行代码就可以创建 KeyedReference 对象。该示例使用各种 set 方法以添加相应的数据,而不是使用构造函数进行添加。

在门户网站上有每个类别的名称空间,搜索门户网站可以找到每个类别下所有字段的值。

正如前面说明的,类别包含在 CategoryBag 元素内。在 UDDI4J 中,该元素是用 org.uddi4j.util.CategoryBag 对象表示的。将所有三个 KeyedReference 对象添加到 CategoryBag 对象,之后通过调用 setCategoryBag() 方法将 CategoryBag 添加到 businessEntity

代码清单 6:添加定位器信息

      // ...
      KeyedReference reference_US = new KeyedReference();
      reference_US.setKeyName("United States");
      reference_US.setKeyValue("US");
      reference_US.setTModelKey("UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88");

      KeyedReference reference_MX = new KeyedReference();
      reference_MX.setKeyName("Mexico");
      reference_MX.setKeyValue("MX");
      reference_MX.setTModelKey("UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88");

      KeyedReference reference_naics = new KeyedReference();
      reference_naics.setKeyName("Electronic Shopping and Mail-Order Houses");
      reference_naics.setKeyValue("4541");
      reference_naics.setTModelKey("UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2");
      CategoryBag categoryBag = new CategoryBag();
      categoryBag.add(reference_US);
      categoryBag.add(reference_MX);
      categoryBag.add(reference_naics);

      businessEntity.setCategoryBag(categoryBag);

向 BusinessEntity 添加联系人信息

org.uddi4j.datatype.business.Contact 对象包含联系人的所有信息,可以通过联系他了解有关企业的信息。

使用 Contact 对象的 setUseType() 方法可以设置这个人的角色。

由于对于一个企业可以定义多位联系人,所以在通过调用 setContacts() 方法将多个 Contact 对象添加到 businessEntity 对象之前,将这些对象添加到 org.uddi4j.datatype.business.Contacts 对象。

代码清单 7:添加联系人信息

      // ...

      //Add contact information for this businessEntity
      Contact contact = new Contact();
      contact.setPersonName("Jack Smith");
      contact.setUseType("Director");
      Contacts contacts = new Contacts();
      contacts.add(contact);
      businessEntity.setContacts(contacts);

Contact 对象包含多个添加有关联系人信息的方法。除了设置这个联系人的名称和角色的方法外,它还包含添加地址信息和电子邮件信息等内容的方法。可以向联系人添加的大多数其它信息都是通过使用 java.util.Vector 对象添加的。对于特定的某类信息,使用向量(vector)可以灵活地添加一些项。向量中的每段信息都用手边信息的一个对象进行表示。例如,要添加联系人的电子邮件地址,就向该联系人添加包含一个或多个 org.uddi4j.datatype.business.Email 对象的向量。

在指定多个电子邮件地址时,必须对每个电子邮件地址设置 UseType。例如:“Business”和“Private”等。

注:因为在使用控制台发布 DVDOnline businessEntity 时还没有指定任何电子邮件地址,所以可以不添加这段代码,从而获得与前面完全相同的结果。我们在这里显示这段代码是为了演示说明。

代码清单 8:添加联系人信息

      // ... 

      Vector emailaddresses = new Vector();

      Email email_1 = new Email();
      email_1.setText("J.Smith@DVDOnline.lpc");
      email_1.setUseType("Business");
      emailaddresses.add(email_1);

      Email email_2 = new Email();
      email_2.setText("J.Smith@quicknet.lpc");
      email_2.setUseType("Private");
      emailaddresses.add(email_2);

      contact.setEmailVector(emailaddresses);

发布 businessEntity

UDDIProxy 对象的 save_business() 方法用于将一个或多个 BusinessEntity 对象发布到注册中心。在可以发布 businessEntity 之前,必须将它添加到 java.util.Vector 对象。通过这种方法,就可以用一次方法调用发布多个 businessEntity 对象。

save_business() 方法的第一个参数是前面获得的权限标记。权限标记会在一段时间后到期,这样就不可能再使用该标记发布或更新服务。当权限到期时,通过调用 UDDIProxy 对象上的 get_AuthToken() 方法可以请求一个新标记。

save_business() 方法返回一个 org.uddi4j.response.BusinessDetail 对象,该对象包含有关刚发布的企业实体的信息。(包括这些企业实体的 UUID)

一旦发布了 businessEntity,如果不需要任何其它发布操作,就可以废弃权限标记。

代码清单 9:发布 BusinessEntity

      // ...

      Vector businessEntities = new Vector();
      businessEntities.add(businessEntity);
      BusinessDetail businessDetail = 
                proxy.save_business(authInfo, businessEntities);
      proxy.discard_authToken(authInfo);

    } // end publishBusinessEntity

查看结果

在启动应用程序时,第二个 DVDOnline businessEntity 被添加到注册中心。

  • 打开 Web 浏览器,然后转至 UDDI 控制台:http://localhost:6080/uddigui
  • 单击控制台顶部面板上的 Publish

输入这个操作所需的用户名和密码。

用户名是 admin,而密码是 adminpwd

  • 单击控制台左侧面板上的 Show owned entities

右边的页面显示了发布的两个企业实体。

这两个企业应该相同,只不过用于每个服务的 UUID 不同。

下图显示了企业中信息的概述,该信息是用编程方式添加的。

businessEntity 的 XML 结构

要查看这个 businessEntity 的 XML 表示,请单击 Discovery URLS。下面显示了这个服务的 XML。

<?xml version="1.0" encoding="UTF-8"?>
<businessDetail generic="2.0" xmlns="urn:uddi-org:api_v2" 
   operator="www.mycompany.com/uddi" truncated="false">
	<businessEntity 
          businessKey="3FA5353C-2856-4C88-BBA3-23881A9E09EF" 
          operator="www.mycompany.com/uddi" authorizedName="admin">
		<discoveryURLs>
			<discoveryURL useType="businessEntity"> 
                       http://localhost:6080/uddisoap/get?businessKey=3FA5353C- 
                                  2856-4C88-BBA3-23881A9E09EF
                    </discoveryURL>
		</discoveryURLs>
		<name xml:lang="en">DVDOnline</name>
		<name xml:lang="es">DVDOnline-es</name>
		<description xml:lang="en">Online DVD store</description>
		<contacts>
			<contact useType="Director">
				<personName>Jack Smith</personName>
			</contact>
		</contacts>
		<categoryBag>
			<keyedReference 
                       tModelKey="UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88" 
                       keyName="United States" 
                       keyValue="US"/>
			<keyedReference 
                       tModelKey="UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88" 
                       keyName="Mexico" 
                       keyValue="MX"/>
			<keyedReference 
                       tModelKey="UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" 
                       keyName="Electronic Shopping and Mail-Order Houses" 
                       keyValue="4541"/>
		</categoryBag>
	</businessEntity>
</businessDetail>

创建服务并将它添加到 businessEntity

为了发布 businessService,创建了 org.uddi4j.datatype.service.BusinessService 对象。BusinessService 对象包含所有构成 businessService 元素的参数,正如数据模型中描述的那样。

要将这个 businessService 添加到 businessEntity,必须在 BusinessService 对象中设置 businessKey 值。该企业键是 BusinessEntity 对象的 UUID,我们将服务添加到该对象。

当这个值已知时,通过调用 setBusinessKey() 方法可以在 BusinessService 对象中设置该值。

在本示例中,要将服务注册到前面发布的 businessEntity 中。可以从 save_business() 方法返回的 BusinessDetail 对象获得这个 businessEntity 的 UUID。由于只发布了一个 businessEntity,所以向量只包含一个 BusinessEntity 对象。

调用 getBusinessKey() 方法返回这个 businessEntity 的 UUID。

代码清单 10:添加 BusinessService

    public void publishBusinessService(){

      BusinessService businessService = new BusinessService();

      //obtain businessKey
      Vector businessVector = businessDetail.getBusinessEntityVector();
      String businessKey=null;
      if(businessVector.size()>0){
         businessKey=
           ((BusinessEntity)businessVector.get(0)).getBusinessKey();
      }else{
         // ... Fail 
      }

      businessService.setBusinessKey(businessKey);

设置 BusinessService 特性

设置名称

设置服务的名称所采用的方法与设置 businessEntity 名称的方法相同。针对不同的语言可以向 java.util.Vector 对象添加不同的名称。

由于只向这个服务添加一个名称,所以只要三行代码就完成添加名称。通过调用 setNameVector() 方法向 businessService 对象添加包含 Name 对象的 Vector。

代码清单 11:设置 BusinessService 名称

      // ...

      Vector serviceNames = new Vector();
      serviceNames.add(new Name("OrderDVD"));
      businessService.setNameVector(serviceNames);

设置服务键

必须为服务提供服务键。因为创建了一个新服务,所以一个空字符串被传递给了 setServiceKey() 方法。这将告知注册中心:在将该项插入到注册中心时为它生成唯一键。

代码清单 12:设置服务键

      businessService.setServiceKey("");

添加描述

添加这个服务的简短描述。同样,针对多种语言可以向服务添加多种描述。通过将多个 Description 对象添加到 java.util.Vector 对象,可以实现这一点。

在这里,对这个服务只添加一个描述。通过调用 setDescriptionVector() 方法,包含一个 Description 对象的 Vector 就被添加到了该服务中。

代码清单 13:添加 Description

      Vector descriptions = new Vector();
      descriptions.add(new Description("Online service for ordering DVDs"));
      businessService.setDescriptionVector(descriptions);

定义服务的访问点

必须将这个服务的访问点(位置)添加到 BindingTemplate 对象。我们创建了 org.uddi4j.datatype.binding.AccessPoint 对象。将这个访问点的 URLType 设置成 http。在定义一个服务的访问点时可以使用多种 URLType。例如,这个服务需要安全连接时,必须将 URLType 设置成 https

setText() 方法用于设置这个服务的实际访问点,在本例中是该服务的 URL。无需多言,在设置其它 URLType 时,当然要更改访问点的值以反映所指定的 URLType 的相应访问点。

一旦设置好了这个服务的 URLType 和实际位置,就必须将 AccessPoint 添加到表示一个元素的 BindingTemplate 中。通过调用 setAccessPoint() 方法来将 AccessPoint 添加到 BindingTemplate

BindingTemplate 对象包含对技术模型的引用和这个服务的访问点。bindingKey 将成为注册中心的单独项,并因此成为一个 UUID 值。由于您正将一个新项创建到注册中心,所以需要提供一个空字符串作为初始值。在插入该项时,这将告诉注册中心生成新的 UUID。

代码清单 14:添加访问点

      // ...

      BindingTemplate bindingTemplate = new BindingTemplate();
      bindingTemplate.setBindingKey("");
      AccessPoint accessPoint = new AccessPoint();
      accessPoint.setURLType("http");
      accessPoint.setText("http://localhost:6080/DVDOnline/services/OrderDVD ");
      bindingTemplate.setAccessPoint(accessPoint);

添加对 tModel 的引用

要指出这里发布的服务符合特定的技术说明,必须添加对技术模型(服务应符合该技术模型)的引用。一种方法是通过使用 UDDI4J Inquire API 找到相应的模型。但是,由于我们要在查询(Inquiry)教程中才说明这个 API,所以在这里使用 UDDI 控制台来获得有关技术模型的必要信息。在教程发现 Web 服务:UDDI(Discovering Web Services: UDDI)中,我们展示如何使用 UDDI4J API 做到这一点。

您已经在前面发布了一个技术模型,而且根据发布到注册中心的项,向该模型提供了 UUID。您将需要使用控制台找到您刚才发布的技术模型的 UUID。通过使用控制台的 Quick find 选项,或通过使用 show owned entities 选项,可以实现这一点。使用这两个选项都会产生一个包含您想要技术模型的列表,而且在该列表上的链接中,您会看到 UUID。当然,使用 UDDI Inquiry API,我们将看到完成该任务的更佳方法。

TModelInstanceInfo 对象包含对一个技术模型的引用。由于对一个服务可以分配多个技术模型,所以可以将一个或多个 TModelInstance 对象添加到 TModelInstanceDetails 对象。接着,将 TModelInstanceDetails 对象添加到 bindingTemplate

代码清单 15:添加 tModel

      // ...
      //Adding tModel instance data
      // NOTE - You need to use the actual UUID from your technical model
      TModelInstanceInfo tModelInstanceInfo = 
         new TModelInstanceInfo("UUID:1B830749-20BB-4F97-BADF-24353B5424E8");
      Vector tModelInstanceInfoList=new Vector();
      tModelInstanceInfoList.addElement(tModelInstanceInfo);
      TModelInstanceDetails tModelInstanceDetails = 
                   new TModelInstanceDetails();
      tModelInstanceDetails.setTModelInstanceInfoVector(tModelInstanceInfoList);
      bindingTemplate.setTModelInstanceDetails(tModelInstanceDetails);

向服务添加 BindingTemplates

一旦添加完所有必要的信息,就可以将 BindingTemplate 对象添加到 BusinessService

因为可以为一个服务定义多个绑定模板,所以我们创建了 org.uddi4j.datatype.binding.BindingTemplates 对象。BindingTemplates 对象可以不包含 BindingTemplate 对象,或包含多个这样的对象。

通过调用 setBindingTemplates() 方法,将 BindingTemplates 对象被添加到了 BusinessService

代码清单 16:向服务添加绑定模板

      // ...
      BindingTemplates bindingTemplates = new BindingTemplates();
      bindingTemplates.add(bindingTemplate);
      businessService.setBindingTemplates(bindingTemplates);

向服务添加定位器信息

将类别信息添加到 BusinessService 所采用的方法与将类别信息添加到 BusinessEntity 的方法相同。

使用 org.uddi4j.util.KeyedReference 对象,以表示对特定类别的引用。

对于这个服务,只创建了一个类别。这个类别指定了该服务的地理位置 - 本例中,是 United States

通过使用 Inquiry API 来找到相应的类别,也可以确定 KeyedReference 对象的每个字段的值。由于我们将在下一篇教程中才讨论 Inquiry API,所以必须手工输入该信息。

代码清单 17:向服务添加定位器信息

      // ...
      //Add category information for this businessEntity
      KeyedReference reference_US = new KeyedReference();
      reference_US.setKeyName("United States");
      reference_US.setKeyValue("US");
      reference_US.setTModelKey("UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88");
      CategoryBag categoryBag = new CategoryBag();
      categoryBag.add(reference_US);
      businessService.setCategoryBag(categoryBag);

发布服务

UDDIProxy 对象的 save_service() 方法用于将一个或多个 businessService 对象发布到注册中心。在可以发布 businessService 之前,必须将它添加到 java.util.Vector 对象。通过这种方法,就可以用一次方法调用发布多个 businessService 对象。

save_service() 方法的第一个参数是前面获得的权限标记。由于权限标记可能已到期,或者在发布 businessEntity 之后已被废弃,所以在可以发布服务之前,可能需要一个新的权限标记。通过调用 UDDIProxy 对象上的 get_AuthToken() 方法可以请求一个新标记。

save_service() 方法返回一个 org.uddi4j.response.ServiceDetail 对象,它包含有关刚发布的服务的信息(包括这些企业服务的 UUID)。

代码清单 18:发布服务

      // ...
      Vector businessServices = new Vector();
      businessServices.add(businessService);
      try{
        ServiceDetail serviceDetails = 
            proxy.save_service(authInfo,businessServices);
      }catch(Exception e){
         // Failed ...
      }

您已完成了

如果您已经做到了这一步,那么祝贺您!使用 Java API 与注册中心交互不适合那些做事没有毅力的人。它们很复杂,且需要花大量精力关注细节问题。但是,还是可以完成它的。

您可以查看本章最后的完整代码清单,并在您自己的系统上运行这个代码。尝试修改这个代码,以发布其它服务,然后浏览具有 GUI 的注册中心以查看结果。

请继续关注下一篇教程,我们讲述 Inquiry API。

完整的代码清单

下面显示的编码样本说明了将 BusinessEntityBusinessService 发布到 UDDI 注册中心的各个步骤。 在深入研究实际代码之前,我们将先粗略查看一下这个应用程序的各部分。

由于发布一项需要与注册中心进行安全连接,所以必须设置本地环境,从而能够创建与服务器的 HTTPS 连接。必须注册 HTTPS 连接的协议处理程序以及使用这个连接交换的证书。

在设置完使用 HTTPS 的环境之后,需要创建与注册中心的实际连接。通过创建 UDDIProxy 对象并向该对象提供注册中心的 Publishing URL,就完成了与注册中心连接的创建。在本地机器上运行 WSDK 时,这个 URL 将是 https://localhost:6443/uddisoap/publishapi

UDDIProxy 类包含与注册中心通信的几个方法。通过调用 UDDIProxy 类上的方法,就可以真正地发布企业或服务。此外,UDDIProxy 类还包含一些删除注册中心项的方法以及一些获取和废弃权限标记的方法。

发布或更新 UDDI 注册中心中的项需要权限标记。UDDIProxy 类上用于以任何方式操作注册中心的所有方法都需要权限标记。通过提供管理手边 UDDI 项的用户的用户名和密码,就可以从 UDDIProxy 类获得权限标记。权限标记是在指定的时间段内使用的。一旦过了这个时间段,就不能再使用这个标记更新或发布 UDDI 项。

一旦建立了与注册中心的连接,并获得了权限标记,那么就可以准备将企业信息、服务信息或技术模型发布到注册中心。

由于服务是由一个或多个企业提供的,所以要先发布一个 businessEntity。在 UDDI4J 中,businessEntity 是由 BusinessEntity 对象表示的。一旦创建了这个对象,就必须添加有关该企业的信息。作为开头,必须设置企业的名称。此外,还可以向 BusinessEntity 添加诸如类别和联系人信息之类的描述性信息。

一旦发布了这个企业后,这个企业所提供的企业服务就被输入到注册中心。在 UDDI4J 中,businessService 项是由 BusinessService 对象表示的。就象 businessEntity 一样,必须设置该服务的名称,不过除此之外,还必须将提供这个服务的企业(前面发布的企业)的 businessKey(UUID)添加到 BusinessService 对象。这样就在注册中心建立了 BusinessServiceBusinessEntity 对象之间的关系。

还可以向该服务添加有关该服务的描述性信息。这样就向搜索特定服务的业务分析员提供了这个服务功能的简要概述。

在添加了描述性信息后,还需要添加有关该服务的技术信息以使以后的客户机应用程序查找指定的服务并与它连接。

BindingTemplate 对象内指定了对服务的实际位置的所有引用以及与该服务密切相关的技术模型。BindingTemplate 对象包含该服务实际 accessPoint 的 URL 以及这个访问点的类型。注册中心的 Web 服务并不总是业务组件,它也可以只是一个电子邮件地址,在这种情况下,可以将访问点的类型定义为 SMTP

除了访问点以外,BindingTemplate 还包含对某一技术模型的引用,这个服务就是根据该技术模型创建的。在业务组件充当 Web 服务的情况中,这个技术模型定义用于这个服务的接口、它们的参数和它们的返回值。

一旦设置完 BindingTemplate 对象中的所有值,还要将模板添加到 BusinessService 对象。

最后,将类别信息添加到 businessService。类别信息可用于定位服务。例如,可能用它来查找那些只位于美国的服务。在添加完所有有关 businessService 的信息后,将 businessService 发布到注册中心。

完成下面这部分后,您将能够通过编程方式发布 BusinessEntity 和 BusinessService。正如前面描述的,可以通过使用 UDDI 控制台检查结果。

在下一篇教程发现 Web 服务:UDDI(Discovering Web Services: UDDI)中,您将了解如何定位和检索 UDDI 注册中心的项。下一篇教程最后的编程示例使用 UDDI4J Publishing API 发布一对企业和服务,并通过使用 UDDI4J Inquiry API 检索已发布的信息。无需使用硬编码的 UUID,就可在注册中心找到所需的一切。它是一个完整示例,包含编译和运行发布代码的脚本。

:请参阅发现 Web 服务:UDDI(Discovering Web Services: UDDI)教程以获得一个完整的示例,那个示例包含了以更实际的方法进行的发布。

package com.ibm.wsdk.tutorial6.ex1;

import java.util.*;
import java.net.MalformedURLException;
import org.uddi4j.response.*;
import org.uddi4j.client.UDDIProxy;
import org.uddi4j.util.*;
import org.uddi4j.datatype.*;
import org.uddi4j.datatype.business.*;
import org.uddi4j.datatype.binding.*;
import org.uddi4j.datatype.service.BusinessService;

public class Publisher {
    //UDDI proxy object representing the UDDI registry.
    protected static UDDIProxy proxy;

    private static String authInfo=null;

    //Paths to inquiry and publish api.
    private static String inquiryURL = 
           "http://localhost:6080/uddisoap/inquiryapi";
    private static String publishURLnonsecure = 
           "http://localhost:6080/uddisoap/publishapi";
    private static String publishURLsecure    = 
            "https://localhost:6443/uddisoap/publishapi";

    //UDDI User ID and password.
    private static String uddiUserID   = "admin";
    private static String uddiPassword = "adminpwd";

    // trustStoreDirPath depends on the location of the application server
    // which is obtained by reading the System property "wsdk.app.server.home".
    private String trustStoreDirPath  = null;
    private static final String trustStoreFilename = "DummyClientTrustFile.jks";
    private static final String trustStorePassword = "WebAS";

    private BusinessDetail businessDetail = null;

  private void setEnvironment(){
    //Set appserver username and password
    System.setProperty("http.basicAuthUserName", "admin");
    System.setProperty("http.basicAuthPassword", "adminpwd");

    String WAS_HOME = System.getProperty("wsdk.app.server.home");
    if ( WAS_HOME == null || WAS_HOME.equals("") ){
        System.out.println("Unable to determine location of application server.");
        System.exit(1);
    }

    trustStoreDirPath = 
      WAS_HOME + java.io.File.separatorChar + "etc" + java.io.File.separatorChar;

    //Set the trust store file and password (see comments near top of this sample.)
    System.setProperty("
    javax.net.ssl.trustStore", trustStoreDirPath + trustStoreFilename);
    System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);

    //Add SSL as a supported protocol.
    System.setProperty("
    java.protocol.handler.pkgs", "com.ibm.net.ssl.internal.www.protocol");
  }

  private void setupProxy(){
    //set up proxy
    proxy = new UDDIProxy();
       try{
         proxy.setInquiryURL(inquiryURL);
         proxy.setPublishURL(publishURLsecure);
       } catch (MalformedURLException e) {
            System.out.println(
"MalformedURLException was thrown when attempting to set the UDDI proxy's URLs");
            System.out.println(e.getMessage());
            System.exit(1);
        }
  }

    protected String getAuthorization(String usr,String pwd){
        //Get authorization token
        String authInfo=null;
        try{
            AuthToken authToken = proxy.get_authToken(usr,pwd);
            authInfo = authToken.getAuthInfoString();
        }catch (Exception e){
            System.out.println(
            "An exception was thrown when getting the authorization token:\n"+e);
            System.exit(1);
        }
        if(authInfo!=null){
            System.out.println("
Successfully obtained authorization token and its info string.");
        }
        return authInfo;
    }

    void publishBusinessEntity() {
        System.out.println("Publishing the businessEntity to the UDDI");

            try {
                //The DVDOnline businessEntity Object
                BusinessEntity businessEntity = new BusinessEntity();

                businessEntity.setBusinessKey("");

                Vector businessNames = new Vector();
                Name businessName_EN = new Name();
                businessName_EN.setLang("en");
                businessName_EN.setText("DVDOnline");
                businessNames.add(businessName_EN);

                Name businessName_ES = new Name();
                businessName_ES.setLang("es");
                businessName_ES.setText("DVDOnline-es");
                businessNames.add(businessName_ES);

                businessEntity.setNameVector(businessNames);

                //The description for this businessEntity
                Description description = new Description();
                description.setLang("en");
                description.setText("Online DVD store");
                Vector descriptionVector = new Vector();
                descriptionVector.add(description);

                businessEntity.setDescriptionVector(descriptionVector);

                //Add category information for this businessEntity
                KeyedReference reference_US = new KeyedReference();
                reference_US.setKeyName("United States");
                reference_US.setKeyValue("US");
                reference_US.setTModelKey("UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88");

                KeyedReference reference_MX = new KeyedReference();
                reference_MX.setKeyName("Mexico");
                reference_MX.setKeyValue("MX");
                reference_MX.setTModelKey("UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88");

                KeyedReference reference_naics = new KeyedReference();
                reference_naics.setKeyName("Electronic Shopping and Mail-Order Houses");
                reference_naics.setKeyValue("4541");
                reference_naics.setTModelKey("UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2");

                CategoryBag categoryBag = new CategoryBag();
                categoryBag.add(reference_US);
                categoryBag.add(reference_MX);
                categoryBag.add(reference_naics);

                businessEntity.setCategoryBag(categoryBag);

                //Add contact information for this businessEntity
                Contact contact = new Contact();
                contact.setPersonName("Jack Smith");
                contact.setUseType("Director");

                Vector emailaddresses = new Vector();
                Email email_1 = new Email();
                email_1.setText("J.Smith@DVDOnline.lpc");
                email_1.setUseType("Business");
                emailaddresses.add(email_1);

                Email email_2 = new Email();
                email_2.setText("J.Smith@quicknet.lpc");
                email_2.setUseType("Private");
                emailaddresses.add(email_1);

                contact.setEmailVector(emailaddresses);

                Contacts contacts = new Contacts();

                contacts.add(contact);

                businessEntity.setContacts(contacts);

                Vector businessEntities = new Vector();
                businessEntities.add(businessEntity);
                businessDetail = proxy.save_business(authInfo, businessEntities);


            }catch (Exception e){
                System.out.println("
Attempting to publish the service provider to the UDDI:\n"+e);
                e.printStackTrace();
                System.exit(1);
         }
    }

  public void publishBusinessService(){
     BusinessService businessService = new BusinessService();

     //obtain businessKey
     Vector businessVector = businessDetail.getBusinessEntityVector();
     String businessKey=null;
     if(businessVector.size()>0){
        businessKey=((BusinessEntity)businessVector.get(0)).getBusinessKey();
     }else{
        System.exit(1);
     }
     businessService.setBusinessKey(businessKey);

     Vector serviceNames = new Vector();
     serviceNames.add(new Name("OrderDVD"));
     businessService.setNameVector(serviceNames);
     businessService.setServiceKey("");

     Vector descriptions = new Vector();
     descriptions.add(new Description("Online service for ordering DVDs"));

     businessService.setDescriptionVector(descriptions);

     BindingTemplate bindingTemplate = new BindingTemplate();
     bindingTemplate.setBindingKey("");

     AccessPoint accessPoint = new AccessPoint();
     accessPoint.setURLType("http");
     accessPoint.setText("http://localhost:6080/DVDOnline/services/OrderDVD ");
     bindingTemplate.setAccessPoint(accessPoint);


     //Adding tModel instance data
     TModelInstanceInfo tModelInstanceInfo = new 
     TModelInstanceInfo("UUID:1B830749-20BB-4F97-BADF-24353B5424E8");
     Vector tModelInstanceInfoList=new Vector();
     tModelInstanceInfoList.addElement(tModelInstanceInfo);
     TModelInstanceDetails tModelInstanceDetails = new TModelInstanceDetails();
     tModelInstanceDetails.setTModelInstanceInfoVector(tModelInstanceInfoList);
     bindingTemplate.setTModelInstanceDetails(tModelInstanceDetails);

     BindingTemplates bindingTemplates = new BindingTemplates();
     bindingTemplates.add(bindingTemplate);

     businessService.setBindingTemplates(bindingTemplates);

     //Add category information for this businessEntity
     KeyedReference reference_US = new KeyedReference();
     reference_US.setKeyName("United States");
     reference_US.setKeyValue("US");
     reference_US.setTModelKey("UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88");

     CategoryBag categoryBag = new CategoryBag();
     categoryBag.add(reference_US);

     businessService.setCategoryBag(categoryBag);

     Vector businessServices = new Vector();
     businessServices.add(businessService);
     try{
        ServiceDetail serviceDetails = proxy.save_service(authInfo,businessServices);
     }catch(Exception e){
       e.printStackTrace();
     }
  }

  public static void main(String[] args) {
    Publisher p = new Publisher();
    p.setEnvironment();
    p.setupProxy();
    authInfo = p.getAuthorization(uddiUserID,uddiPassword);
    p.publishBusinessEntity();
    p.publishBusinessService();
  }

}

结束语

回顾

在本教程中,我们已经完成了以下内容:

  • 概述了 UDDI
  • 了解了 UDDI 数据结构
  • 使用 UDDI GUI 浏览了 WSDK 内部注册中心
  • 使用 UDDI GUI 将服务发布到 WSDK 内部注册中心
  • 使用了 UDDIPublish 和 UDDIUnpublish
  • 通过编程方式使用 UDDI4J 发布到内部注册中心

UDDI 是一个复杂的主题,它包含的信息是如此之多,使我们无法在这里一一讲述。本教程向您提供了理解 UDDI 并使用它的一个良好开端。要进一步了解它,请查看更多有关 UDDI API 的内容并进一步研究 UDDI4J。

在下一篇教程中,我们将讨论用于查询 UDDI 注册中心的 Inquiry API。毫无疑问,它比 Publish API 更复杂,但只要您坚持学习该教程,我们将带您了解它。

反馈

请将您对本教程的反馈发送给我们。我们期待收到您的来信!


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=85042
ArticleTitle=发布服务:UDDI
publish-date=09082003