荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: gff (水手), 信区: Java
标  题: 利用JAXR发现和发布Web服务
发信站: 荔园晨风BBS站 (Fri Jul  5 13:26:56 2002), 转信


概述
Web服务最核心的部分就是服务的发布和发现,最终目的就是服务的标准化和集成
化,特别是动态集成服务的发现和使用。比较流行的注册机制,象UDDI(统一描述
、发现和集成)和ebXML等我们现在已经可以使用了,ebXML是Organization for
the Advancement of Structured Information Standards (OASIS) 和the United
 Nations Centre for the Facilitation of Procedures and Practices in
Administration, Commerce and Transport (U.N./CEFACT) 开发的。JAXR(
Java API for XML Registries)提供了一个通过先前的注册体系进行Web服务的发
行和发现的标准,本文就先看看它是如何实现的。
通过注册中心,可以允许一个组织发布和发现其Web服务。目前,占有支配地位的
有两个注册标准:UDDI和ebXML,使用两者之中的任何一个,商业公司就可以发布一
套Web服务,内部的或者外部的商业伙伴就可以发现它们。然而,要集成和注册
Web服务而不考虑对注册标准的支持,对商业行为来说,是一件具有挑战性的事情
。例如:假定ACME公司的一些商业伙伴以UDDI注册的方式发布了他们的Web服务,
而另外一些商业伙伴以ebXML注册的方式发布了另外一个Web服务,那么,ACME公司
的Web服务程序该如何能够发现他的所有商业伙伴发布的Web服务呢?假如ACME想要
在一个Web服务的程序里向UDDI和ebXML注册中心发布自己的服务该如何实现呢?

JAXR提供了一套标准的API来通过现有的注册发布和发现Web服务。目前,JAXR包含
在JAVA Web服务开发包(JWSDP)1.0和最近发布的JAVA XML包之内,此外,JAXR将
在J2EE(JAVA 2 平台企业版)1.4中占据重要作用。计划于2003年发布的J2EE1.4
将会成为Web服务开发和部署的首选平台,并且它的合作开发伙伴也需要在他们的
应用程序中集成这个API。
在本文里,我们将通过实例来描述JAXR的架构和编程模型,我们会阐述重要的注册
操作,比如组织或服务的发布和发现,服务绑定的使用方法和分类架构。同时,我
们还会对UDDI程序员给予特别提示。
注册概述
大多数B2B的业务是两个交易双方以伙伴关系的紧密协同合作,这些合作伙伴共享
一个注册,通常是以基于Web的服务形式存在。一个注册功能就象电子黄页,在那
里你就可以发布和发现有关商业、产品和所提供的服务的信息。注册中心也可以当
作数据库,或者存储共享信息库,或者有关某些事情的资料。注册中心也可以作为
电子公告板,合作伙伴就可以动态、时尚地共享信息。就象JAXR规范中描述的那样
,共享的信息可以是一般事件的通知,价格的变化,折扣活动以及促销活动等。

注册服务的客户端进行的典型操作是什么呢?提交和保存共享信息是比较重要的注
册操作,客户端需要完成注册管理操作,比如标识、命名、描述、分类、关联、分
组和标注注册元数据等。最后,客户端还必须能够从注册中心完成查询、发现和得
到共享的信息等操作,并且期望一个典型的注册中心能支持这其中的大多数的操作

什么是JAXR?
JAXR并不是定义一个新的注册标准,相反,这个标准的JAVA API对不同的注册服务
进行操作,并定义了用来描述注册内容的统一信息模型。不考虑要访问的注册服务
提供者,你的程序可以使用通用的API和通用的信息模型。JAXR定义了一套通用的
API,允许任何一个客户端通过JAXR提供者对任何一个商业注册中心进行访问和互
操作。从这种意义上讲,JAXR提供的是一次编写,处处运行的注册操作API,这样
可以大大简化Web服务的开发和集成。
JAXR专家组希望API能够同时支持UDDI和ebXML的最突出、最好的那部分特性,而不
是一些普通的特性。就象标准中阐述的那样,JAXR至少不是一种普通意义上的API

JAXR结构
JAXR定义了三个重要的结构:
1,注册提供者实现了现存的注册标准,如OASIS(Organization for the
Advancement of Structured Information)/ebXML注册服务标准2.0。
2,JAXR提供者实现了Java Community Process (JCP)在2002年5月批准的JAXR规范
。你可以把JAXR提供者当做自己的与JAXR兼容的注册提供者。然而,在你应当把
JAXR当作是现存注册提供者的前端服务,例如:UDDI和ebXML注册提供者。目前,
在JAXR的实现参考里提供了JAXR UDDI提供者的实现部分,技术开发组正在开发一
个开放源代码的JAXR ebXML提供者的实现,你可以在http://www.javaworld.
com/javaworld/jw-06-2002/jw-0614-jaxr_p.html#resources上看到这些技术。

JAXR客户端是一个JAVA程序,通过JAXR提供者使用JAXR访问注册提供者。JAXR客户
端既可以是独立的J2EE应用程序,也可以是J2EE的组件,比如:EJB(
Enterprise JavaBeans),JAVA Servlets,或JSP页面(JavaServer Pages),
JAXR实现部分的手册里也提供了一个基于Swing的注册浏览的JAXR客户端应用程序

图1说明了不同的JAXR客户端上如何利用JAXR与不同的注册中心进行交互操作的。
在结构上,JAXR客户端利用API执行注册操作,而JAXR提供者实现这个API的功能。
由于JAXR提供了一个标准的API来访问不同的注册提供者和描述注册内容的统一信
息模型,无论是HTML浏览器、J2EE组件或独立的J2SE应用程序的JAXR客户端,都能
够统一地对不同的注册提供者执行注册操作。


图2是JAXR结构的更进一步描述,图中的JAXR提供者是一种可插拔的提供者,是特
种UDDI的JAXR提供者和特种ebXML提供者的基础。JAXR提供者为JAXR客户端通过
RegistryService接口提供性能检测的方法,JAXR客户端查询RegistryService,通
过apabilityProfile发现提供者的性能水平。


在JAXR客户端能够对JAXR提供者调用性能级的方法之前,它必须先连接到提供者。
首先:客户端利用ConnectionFactory.newInstance()静态方法创建一个
ConnectionFactory实例,ConnectionFactory接口使用它的createConnection()方
法让客户端创建连接。这里必须注意:JAXR客户端连接的是JAXR提供者,而不是注
册提供者。JAXR提供者当作客户端的代理,操纵和调用适当的注册提供者的方法,
连接维护着客户端的状态信息。此外,在连接的生存期间,JAXR客户端动态设定认
证信息和通讯信息。请参照下面JAXR客户端如何连接JAXR提供者的代码。
在JAXR客户端调用JAXR性能级的方法之后,JAXR提供者把这些方法转换成特定注册
的方法,并且向底下的注册提供者发送请求。在注册提供者处理完请求并向JAXR提
供者返回特定注册结果后,JAVR提供者把这些信息转换成JAXR信息模型对象
RegistryObjects,并向JAXR客户端返回。RegistryObjects接口是一个抽象接口,
它提供了一些通用信息,如关键字,名字以及更多专门JAXR信息模型接口的描述,
注意:JAXR提供者和注册提供者之间的通讯协议是特定注册提供者,对JAXR客户端
来说是透明的。例如:JAXR提供者与UDDI注册提供者通过交换简单的SOAP信息进行
通信,而JAXR提供者与ebXML注册提供者是通过SOAP信息或ebXML信息服务进行通信
的。
性能描述
由于注册提供者性能上的多样性,JAXR专家组决定提供多层API综合描述,每一个
JAXR接口的方法都指派为一个性能级别,相同性能级别的这些JAXR方法定义成一个
JAXR提供者性能层。
目前,JAXR只定义了两个性能层,基本特性的0级层和高级特性的1级层。0级的基
本特性支持所谓的以商业为重点的API,而1级的高级特性支持一般的API,最低限
度下,所有的JAXR提供者必须实现0级架构。JAXR客户端应用程序只采用这些0级层
的这些方法来访问JAXR提供者。用于UDDI的JAXR提供者必须是与0级相兼容的。
JAXR提供者不一定非要支持1级层,被指派到这个架构的方法提供了更加高级的注
册性能,以满足某种特定的JAXR客户端的需要。对1级层的支持意味着对0级层的完
全支持,用于ebXML的JAXR提供者必须是与1级层兼容。JAXR客户端通过调用
CapabilityProfile的方法能够发现JAXR提供者的性能级别。如果客户端企图调用
JAXR提供者不支持的性能级别,那么提供者就会抛出
UnsupportedCapabilityException的例外。
注册服务接口
正如前面所描述的那样,JAXR提供者支持性能描述,通过性能级别把JAXR接口方法
分组。RegistryService是JAXR提供者的主要接口,换句话说,就是实现Web服务发
现和注册。JAXR客户端和JAXR提供者建立连接以后,JAXR客户端通过调用
getRegistryService()方法,得到一个RegistryService的实例。一旦JAXR客户端
有了RegistryService实例,它就可以得到基本的注册接口,并进行生存期间管理
和查询管理。
JAXR规范定义了两个生存期管理的接口:用于0级的BusinessLifeCycleManager管
理器用于1级的LifeCycleManager管理器。
BusinessLifeCycleManager定义了一个简单的商业级的API,这个接口就象UDDI中
UDDI开发人员都很熟悉的发布者API,而LifeCycleManager接口完全支持使用普通
API时所需要的整个生存期管理。生存期管理包括创建、保存、更新和删除注册对
象。此外,LifeCycleManager提供了几个方法来创建JAXR信息模型对象。通常,在
同时有查询管理的操作的时候,生存期管理的操作具有优先权。
JAXR进行查询管理的最高级接口QueryManager有两个扩展:用于0级的
BusinessQueryManager和用于1级的DeclarativeQueryManager。
查询管理处理对注册中心的注册信息的查询,在信息模型中,一个简单的商业级
API,BusinessQueryManager接口提供了向最重要的高级接口提供查询的能力,比
如:组织(Organizations),服务(Services),服务绑定(ServiceBindings),
(分类架构)ClassificationSchemes和(概念)Concepts。作为另外一种可选择
的办法,DeclarativeQueryManager接口提供了更为灵活的通用API,使得JAXR客户
端能够使用标准查询语言的语法进行查询。到目前为止,JAXR支持的唯一语法是
SQL-92和OASIS/ebXML注册过滤查询。就象在JAXR规范中所描述的那样,ebXML注册
提供者可以选择SQL查询。如果JAXR提供者不支持SQ查询的话,就会在
DeclarativeQueryManager方法中抛出UnsupportedCapabilityException例外。
JAXR信息模型
要调用JAXR提供者中的生存期和查询管理需要JAXR客户端创建和使用JAXR信息模型
对象。JAXR信息模型就象ebXML注册信息模型2.0版本中的一样,但也提供了UDDI数
据结构规范的数据类型。尽管UDDI开发者对UDDI信息模型比较熟悉,但需要花点工
夫去理解它,JAXR提供了更为直观和自然的接口。大多数JAXR信息模型接口是从抽
象接口RegistryObject继承下来的,RegistryObject定义了通用的状态信息和被调
用的属性。比如关键字、名字和描述等。InternationalString接口定义了国际化
兼容的属性如名字和描述。InternationalString接口包含了本地化字符串的集合
,每一个本地化字符串定义了本地的字符集和内容。
RegistryObject接口也定义了Classifications, ExternalIdentifiers,
ExternalLinks和Association集合,BusinessQueryManager常常在它的find方法里
使用这些集合作为参数。
由于RegistryObject接口的特殊化,Organization, Service, ServiceBinding,
Concept和 ClassificationScheme 这些具体的接口则提供了明确的信息,例如:
Organization接口定义了Service集合,Service则定义了ServiceBinding集合,
ServiceBinding可能包含SpecificationLink的集合。使用UDDI的开发者应当对这
些具体的接口比较熟悉了。它们和UDDI数据类型则有如下的映射关系:


JAXR规范定义了下面的消息模型:
1,Organization实例属于RegistryObject对象,提供有关在注册中心注册的组织
的信息。
2,Service实例属于RegistryObject对象,提供有关Organization提供的服务信息
(如Web 服务),一个Organization可能会有一套服务。
3,ServiceBinding实例属于RegistryObject对象,发布如何访问由Service实例提
供的接口的技术信息。一个Service可能会有ServiceBinding的集合。
4,SpecificationLink使用其技术指标链接到ServiceBinding,例如:
ServiceBinding可能有SpecificationLink的实例,它们描述了:如何使用以WSDL
文档或CORBA IDL文档形式的技术信息来访问服务。
5,ClassificationScheme实例描述了一种分类方法,使用它你可以对
RegistryObject进行分类或分组。
6,Classification实例利用分类表对RegistryObject进行分类,由于分类能够大
大加快注册簿里RegistryObject的发现速度,对RegistryObject的分类能力就成为
了注册簿最重要的性能之一。
7,Concept仅仅是一个概念,实际上它可能是任何东西。
8,Association定义信息模型里对象之间的多对多关系。
9,RegistryPackage对逻辑上相关的RegistryObject对象进行分组。一个
RegistryPackage可能包含任意数目RegistryObject对象,一个RegistryObject对
象也可能是任意数目RegistryPackage的一个成员。
10,ExternalIdentifier提供RegistryObject对象的唯一识别信息,你可以使用
DUNS (D&B's Data Universal Numbering System)号或社会保障号来作为唯一的标
识。
11,ExternalLink用URI的方式提供注册簿外可管理的内容。
12,Slot在运行期动态为RegistryObject对象添加属性,提供信息模型的扩展能力

13,大多数JAXR信息模型提供ExtensibleObject接口,为Slot实例提供添加、删除
和查找的方法。
14,AuditableEvent提供RegistryObject对象的索引。
15,与Organization有关的User实例提供注册簿里注册的用户信息,可以在
RegistryObject的索引里使用User 对象。
16,PostalAddress定义邮政编码的属性,目前它为User和Organization对象提供
地址信息。
使用JAXR进行开发
前面了解了Jaxr的技术方面的知识,现在就让我们利用这个API进行开发,下面的
例子主要完成如下的任务:
1,在Jaxr客户端和JAXR提供者之间建立连接
2,注册操作:查找一个组织
3,注册操作:得到组织的详细信息
4,注册操作:发布服务
[一]在JAXR客户端和JAXR提供者之间建立连接
正如前面描述的那样,JAXR客户端首先必须和JAXR提供者之间建立连接,这个连接
保持着客户端的状态和个性化信息,JAXR提供者在调用注册提供者的方法时会用到

在执行任何注册操作之前,JAXR客户端和JAXR提供者之间建立了连接,如果JAXR客
户端想要想注册中心提交信息,那么客户端必须为连接设定认证信息。JAXR客户端
得到Web服务发现和发表的RegistryService 接口。
/*
* 建立与JAXR提供者的连接
* 设定认证信息和通讯的设置
* 得到业务层的发现和发布接口
*/
public void makeConnection() {
String queryURL ="http://localhost:
8080/registry-server/RegistryServerServlet";
String publishURL ="http://localhost:
8080/registry-server/RegistryServerServlet";
/*
* 定义连接配置的属性,要进行简单查询,需要给定查询URL
* 要使用生存期管理器,需要一个发布URL
*/
Properties props = new Properties();
props.setProperty("javax.xml.registry.queryManagerURL", queryUrl);
props.setProperty("javax.xml.registry.lifeCycleManagerURL", publishUrl);

try {
//创建连接并传递属性信息
ConnectionFactory factory = ConnectionFactory.newInstance();
factory.setProperties(props);
connection = factory.createConnection();
System.out.println("Created connection to registry");
// 得到注册服务和管理器
RegistryService rs = connection.getRegistryService();
// 得到性能属性
CapabilityProfile capabilityProfile = registryService.
getCapabilityProfile();
if (capabilityProfile.getCapabilityLevel() == 0)
System.out.println("Capability Level 0, Business Focused API");
// 从注册中心得到管理器
BusinessQueryManager bqm = rs.getBusinessQueryManager();
BusinessLifeCycleManager blcm = rs.getBusinessLifeCycleManager();
System.out.println("Got registry service, query " + "manager, and
lifecycle manager");
// 设定认证信息
PasswordAuthentication passwdAuth = new PasswordAuthentication(username,
 password.toCharArray());
Set creds = new HashSet();
creds.add(passwdAuth);
// 为JAXR提供者设定信任度
connection.setCredentials(creds);
System.out.println("Established security credentials");
// 设定通讯方式
connection.setSynchronous(true);
} catch (Exception e) {
e.printStackTrace();
if (connection != null) {
try {
connection.close();
} catch (JAXRException je) {}
}
}
}
[二]注册操作:发现组织
刚才我们在JAXR客户端和JAXR提供者之间建立了连接,并从RegistryService获得
了BusinessQueryManager和BusinessLifeCycleManager的控制权,客户端就可以调
用这些接口的方法了。比较常见的任务是发现某组织所提供的服务。要实现这样的
任务,客户端必须调用BusinessQueryManager提供的方法。例如:某用户浏览
UDDI注册中心,想发现在美国NAICS (North American Industry
Classification System)分类下计算机系统设计和服务的组织,用JAXR进行查询,
该用户必须调用NAICS and ISO 3166 Geographic Code System (ISO 3166)分类下
的findOrganization)方法,JAXR为这些类别的服务提供了分类,客户端只需要把
这些分类做为findOrganization方法的参数即可。代码如下:
public void findOrganizations()
throws JAXRException {
// 查找规则:发现的组织将以这个排序方式返回
Collection findQualifiers = new ArrayList();
findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);


// 查询JAXR分类服务
ClassificationScheme naics = businessQueryManager.
findClassificationSchemeByName(findQualifiers, "ntis-gov:naics:1997");


// 创建一个分类,并作为findOrganization()方法的参数
Classification computerSystemsDesign = businessLifeCycleManager.
createClassification
(naics, "Computer Systems Design and Related Services", "5415");
// 查询JAXR分类服务
ClassificationScheme geography = businessQueryManager.
findClassificationSchemeByName
(findQualifiers,"iso-ch:3166:1999");

// 创建一个分类,并作为findOrganization()方法的参数
Classification us = businessLifeCycleManager.
createClassification(geography,
"United States", "US");

// 向分类集合添加分类
Collection classifications = new ArrayList();
classifications.add(computerSystemsDesign);
classifications.add(us);


// 调用findOrganizations()方法
BulkResponse bulkResponse = businessQueryManager.
findOrganizations(findQualifiers, null, classifications, null, null,
null);
if (bulkResponse.getStatus() == JAXRResponse.STATUS_SUCCESS) {
System.out.println("Found Organization located in the United States
categorized Computer Systems Design and Related Service");

}
}
大多数注册服务提供者通过JAXR提供者的函数调用都会返回一个BulkResponse,里
面包含了操作中的任何例外和一个具体的 RegistryObject对象和关键字的集合,
为了确保注册中心能够返回响应的结果,由注册提供者产生的任何例外都被包装成
RegistryException,并保存到BulkResponse的例外集合中,任何发现的
RegistryObject对象也都保存在BulkResponse集合中。

[三]注册操作:得到组织的详细信息

在上面的findOrganization方法中,BulkResponse包含了在注册中心找到的、符合
条件的组织,但这些信息只是有关该组织极其提供服务的有限信息,如关键字、名
字和描述。JAXR提供一个很有用的特性就是提供注册对象的详细信息。例如:在
Jaxr UDDI提供者里,一个JAXR findOrganization()方法能够转换成UDDI的
find_Business请求,如果成功,find_Business请求将返回很少的业务和服务信息
,如:ID号,名字和描述,使用UDDI API,UDDI客户端需要调用
get_BusinessDetail()来得到组织的详细信息。下面是使用
getOrganizationDetail()方法的例子:


public void getOrganizationDetail(BulkResponse bulkResponse)
throws JAXRException {

// 从BulkResponse得到组织的集合
Collection organizations = bulkResponse.getCollection();
// 遍历得到要查找的组织
Iterator orgIter = organizations.iterator();
while (orgIter.hasNext()) {
Organization organization = (Organization)orgIter.next();
// 从组织中得到服务的集合
Collection services = organization.getServices();
// 遍历服务
Iterator serviceIter = services.iterator();
while (serviceIter.hasNext()) {
Service service = (Service)serviceIter.next();

// 从服务中得到一个服务绑定集合
Collection serviceBindings = service.getServiceBindings();
// 遍历服务绑定
Iterator sbIter = serviceBindings.iterator();
while (sbIter.hasNext()) {
ServiceBinding serviceBinding = (ServiceBinding)sbIter.next();

// 得到服务的地址,你可以通过该地址访问服务
String accessURI = serviceBinding.getAccessURI();
System.out.println("Access the service " +
service.getName().getValue() + " at this URI " + accessURI);

// 从ServiceBinding中得到SpecificationLinks集合,SpecificationLinks提供
了访问服务的进一步的技术细节
Collection specificationLinks = serviceBinding.getSpecificationLinks();

// 遍历SpecificationLink
Iterator linkIter = specificationLinks.iterator();
while (linkIter.hasNext()) {
SpecificationLink specificationLink = (SpecificationLink)linkIter.
next();

// 从SpecificationLinks中得到ExternalLinks。它指向详细技术细节
Collection externalLinks = specificationLink.getExternalLinks();
// 遍历ExternalLink集合
Iterator elinkIter = externalLinks.iterator();
while (elinkIter.hasNext()) {
ExternalLink externalLink = (ExternalLink)elinkIter.next();
// externalURI指向详细的技术细节
String externalURI = externalLink.getExternalURI();
System.out.println(" Use the technical detail at this URI,
" + externalURI + " to invoke the service, " + service.getName().
getValue());
}

// 得到使用方法的描述
InternationalString usageDescription = specificationLink.
getUsageDescription();
Collection usageParameters = specificationLink.
getUsageParameters();
Concept specificationConcept = (Concept) specificationLink.
getSpecificationObject();
}
}
}
}


[四]注册操作:发布服务

JAXR客户端可以发布服务和其他注册操作,除了发现合作伙伴的信息和服务外,也
可以自己注册自己的信息和服务以供其他伙伴使用。如果JAXR客户端想要向注册中
心发布信息和服务,那他可以使用生存期管理器或业务生存期管理器,对UDDI比较
熟悉的人应当使用业务生存期管理器,它向注册服务提供者提供了保存信息的方法
。因此应该优先使用这个操作,使用者必须提供认证信息,JAXR提供者与注册服务
提供者之间进行身份验证,这种认证方式对JAXR客户端来说是透明的。
假定Fly Away航空公司的旅游代理商有一个基于Web的飞机座位预定服务,他的合
作伙伴也可以使用这种服务。下面的代码创建这样一个服务并保存到注册中心,其
中有合同信息,所提供的服务说明以及得到这些服务的技术信息等。


public void saveOrganization()
throws JAXRException {

// 在内存中先创建组织对象
Organization org = businessLifeCycleManager.createOrganization("Fly Away
 Airline Travel Agents");

// 创建用户
User user = businessLifeCycleManager.createUser();
PersonName personName = businessLifeCycleManager.createPersonName("Marie
 A Traveler");


TelephoneNumber telephoneNumber = businessLifeCycleManager.
createTelephoneNumber();
telephoneNumber.setNumber("781-333-3333");
telephoneNumber.setType("office");
Collection numbers = new ArrayList();
numbers.add(telephoneNumber);


EmailAddress email = businessLifeCycleManager.
createEmailAddress("marieb@airlinetravel.com", "office");
Collection emailAddresses = new ArrayList();
emailAddresses.add(email);


user.setPersonName(personName);
Collection telephoneNumbers = new ArrayList();
telephoneNumbers.add(telephoneNumber);
user.setTelephoneNumbers(telephoneNumbers);
user.setEmailAddresses(emailAddresses);
org.setPrimaryContact(user);


// 创建服务名称和描述
Service service = businessLifeCycleManager.createService("Fly Away
Airline Reservation Service");
service.setDescription(businessLifeCycleManager.
createInternationalString("Flight Reservation Service"));

// 创建服务绑定
ServiceBinding serviceBinding = businessLifeCycleManager.
createServiceBinding();
serviceBinding.setDescription(businessLifeCycleManager.
createInternationalString
("Information for airline reservation service access"));

// 关闭URI检查验证
serviceBinding.setValidateURI(false);
serviceBinding.setAccessURI("http://www.airlinetravel.com:
8080/services.reservations.html");


// 创建SpecificationLink信息
SpecificationLink specificationLink = businessLifeCycleManager.
createSpecificationLink();

// 设定使用描述
specificationLink.setUsageDescription(businessLifeCycleManager.
createInternationalString("Search for Reservations when prompted"));
String usageParameter = "Enter travel agent id when prompted";
Collection usageParameters = new ArrayList();
usageParameters.add(usageParameter);

// 设定使用参数
specificationLink.setUsageParameters(usageParameters);

// 在specificationLink上设定specificationConcept
Concept httpSpecificationConcept = (Concept) businessLifeCycleManager.
createObject(businessLifeCycleManager.CONCEPT);
Key httpSpecificationKey = businessLifeCycleManager.createKey("uuid:
68de9e80-ad09-469d-8a37-088422bfbc36");
httpSpecificationConcept.setKey(httpSpecificationKey);
specificationLink.setSpecificationObject(httpSpecificationConcept);

// 添加specificationLink到serviceBinding中
serviceBinding.addSpecificationLink(specificationLink);

// 添加serviceBinding到服务中
service.addServiceBinding(serviceBinding);

// 添加服务到组织中
org.addService(service);


// 添加分类到组织中
ClassificationScheme naics = businessQueryManager.
findClassificationSchemeByName(null, "ntis-gov:naics");
Classification classification = businessLifeCycleManager.
createClassification
(naics, "Air Transportation", "481");
org.addClassification(classification);
Collection orgs = new ArrayList();
orgs.add(org);

BulkResponse br = businessLifeCycleManager.saveOrganizations(orgs);
if (br.getStatus() == JAXRResponse.STATUS_SUCCESS) {
System.out.println("Successfully saved the " + " organization
to the registry provider .");
}
}


JAXR的执行

现在你是不是想要利用JAXR开始进行Web服务的开发呢?或者只是想使用一下上面
的例子?要开始我们的开发,必须有下面的三个软件或模块:为某一特定注册规范
的注册服务提供者,像UDDI和ebXML;为该注册服务提供者的JAXR提供者和一个注
册浏览器。
目前,我们可以得到的是使用UDDI和ebXML注册服务提供的两个JAXR提供者,JWSDP
 1.0 包含了JAXR1.0的参考,UDDI2.0的JAXR提供者,UDDI注册服务器和注册浏览
器。下图就是JAXR实现的注册浏览器,你可以使用它向UDDI注册服务提供者添加组
织和分类服务信息。


JAXR提供了一个标准的JAVA API和统一的信息模型,可以向不同的注册服务提供者
执行注册操作,尤其是UDDI和ebXML注册服务提供者。典型的注册操作包括发布和
发现Web服务。为了从不同的注册服务提供者提供不同的功能,JAXR提供了分层的
结构,功能作为一个性能层进行分组,0级的功能层提供一个简单的但常用的高级
业务级API,而1级功能层则提供了可伸缩的、低级的通用的API。我们应当对JAXR
很熟悉,因为JAXR将作为J2EE1.4中很重要的一部分,是实现Web服务的基于JAVA的
平台开发和部署工具。更多的信息可参考sun的网站:http://java.sun.
com/xml/jaxr

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 218.17.10.48]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店