使用JAXR发布和发现Web服务
用于XML注册中心的Java API(JAXR)提供了用于访问不同类型的XML注册中心的一致、标准的Java
API。
JAXR工具是Java Web服务开发包(Java WSDP)的一部分,包括一些例子程序以及演示如何编写JAXR客户端程序的注册中心浏览器工具。
对JAXR作简要的概述后,本章描述了如何实现一个JAXR客户端来将一个组织以及它的Web服务发布到注册中心,以及如何查询注册中心来找到组织以及服务。最后介绍了如何运行指南提供的例子,并给出了一些JAXR更多信息的连接。
JAXR概述
本节涉及到如下问题:
· 什么是注册中心?
· 什么是JAXR?
· JAXR的体系结构
什么是注册中心?
XML注册中心是可以编译、部署和发现Web服务的基础设施。它是中立的第三方,便于动态的、松散耦合的企业到企业(B2B)的交互。机构可以将注册中心用作共享的资源,通常是基于Web服务的形式。
当前有多种关于XML注册中心的规范说明。包括:
· ebXML注册和存储标准,该标准是由结构化信息标准促进组织(OASIS)和联合国贸易促进与电子商务中心(U.N./CEFACT)提出的。
· 统一描述、发现和集成(Universal
Description, Discovery, and Integration,UDDI)项目,它正由厂家联合开发。
注册提供者是符合XML注册中心规范的业务注册的实现。
什么是JAXR?
JAXR使得Java软件开发者可以使用单个易用的抽象API来访问多种XML注册中心。统一的JAXR信息模型描述了XML注册中心内的内容和元数据。
JAXR使得开发者可以编写注册中心客户端程序,这些客户端可以在不同的目标注册中心上移植。除了那些基本注册中心之外,JAXR还可以添加值。
JAXR规范的当前版本包括JAXR信息模型和ebXML注册中心之间以及JAXR信息模型与UDDI版本2规范间的详细绑定。最新版本的规范可以在下列地址找到:
http://java.sun.com/xml/downloads/jaxr.html
在Java WSDP的这一版,JAXR实现了由JAXR规范定义的0层权能协议子集。这一层允许在基本层访问UDDI和ebXML注册中心。在这一版,JAXR仅支持访问UDDI版本2的注册中心。
当前存在几个UDDI版本2的注册中心。Java WSDP注册中心服务提供了一个UDDI版本2的注册中心,可以使用它在私有环境中测试JAXR应用程序。关于详细信息请参见“Java
WSDP注册中心服务”。
有几个ebXML注册中心正在开发,而香港大学(HKU)的电子商贸基建研究中心(CECID),计算机科学信息系统,已经可用。具体信息请参见http://www.cecid.hku.hk/Release/PR09APR2002.html。
在http://ebxmlrr.sourceforge.net的开放资源中有一个ebXML注册中心的JAXR提供者。
JAXR体系结构
JAXR的高层体系结构由下列部分构成:
· JAXR客户端:使用JAXR
API通过JAXR提供者来访问业务注册中心的客户程序。
· JAXR提供者:是JAXR
API的一个实现,它提供了对特定注册提供者或基于通用规范的注册提供者类的访问。
JAXR提供者实现了两个主要的包:
· javax.xml.registry,它由定义了注册访问接口的API接口和类构成。
· javax.xml.registry.infomodel,它由定义了用于JAXR的信息模型的接口构成。这些接口定义了存储在注册中心里的对象的类型以及它们彼此间的关联。这个包中的基本接口是RegistryObject接口。它的子接口包括Organization,Service,和ServiceBinding。
在javax.xml.registry包中最基本的接口是
· Connection。Connection接口表示客户与一个注册提供者间的会话。为了使用注册中心,客户必须使用JAXR提供者来生成一个连接。
· RegistryService。客户从它的连接中获得一个RegistryService对象。该对象反过来使得客户获得用来访问注册中心的接口。
主接口,也是javax.xml.registry包的一部分,有:
· BusinessQueryManager,它允许客户在注册中心查找与javax.xml.registry.infomodel接口一致的信息。可选接口,DeclarativeQueryManager,允许客户使用SQL语法来进行查询。(在Java
WSDP中,JAXR的实现中没有实现DeclarativeQueryManager。)
· BusinessLifeCycleManager,它允许客户通过保存(更新)或删除的方式修改注册中心的信息。
一旦出现错误,JAXR API方法抛出JAXRException或它的某个子类。
在JAXR API中许多方法使用Collection对象作为参数或返回值。使用Collection对象允许同时对几个注册对象操作。
图13-1 显示了JAXR的体系结构。在Java WSDP中,JAXR客户使用JAXR API的第0层接口的功能来访问JAXR提供者。而JAXR提供者反过来访问注册中心。Java
WSDP为UDDI注册中心提供了一个JAXR提供者。

图 13-1 JAXR 体系结构
实现JAXR客户端
这一节描述了要实现一个可以对UDDI注册中心进行查询和更新的JAXR客户端必须遵循的基本步骤。JAXR客户端是可以使用JAXR
API来访问注册中心的客户应用程序。
指南没有说明如何实现一个JAXR提供者。JAXR提供者提供了一个JAXR规范的实现,该实现允许访问一个已经存在的注册提供者,例如一个UDDI或ebXML注册中心。Java
WSDP中JAXR的实现本身是JAXR提供者的一个例子。
指南包括几个客户端的例子,它们将在“运行客户端例子”部分说明。
JAXR发布还包含一些示例JAXR客户端,其中最完整的是注册中心浏览器,它包含图形用户接口(GUI)。关于使用浏览器的详细信息参见“注册中心浏览器”部分。
获得连接
JAXR客户端必须完成的首要任务是获得到注册中心的连接。
预备:访问注册中心
JAXR客户端的任意用户可以对注册中心执行查询。但为了增加数据到注册中心或者更新注册中心的数据,用户必须从注册中心获得访问的权限。要注册某个公共的UDDI版本2的注册中心,登陆下列Web站点,并按如下指令进行:
· http://uddi.microsoft.com/ (Microsoft)
· http://uddi.ibm.com/testregistry/registry.html
(IBM)
· http://udditest.sap.com/ (SAP)
这些UDDI版本2的注册中心是用于测试目的的。一旦注册,将获得用户名和密码。可以为一些JAXR客户端例子程序指定这一用户名和密码。
注意:JAXR API已经用Microsoft和IBM注册中心进行了测试,但没有用SAP注册中心测试过。
生成或查找连接池
客户从连接池中生成连接。JAXR提供者可以提供一个或多个预先配置好的连接池,客户可以通过使用Java命名和目录接口(JNDI)
API来查找获得连接。
在Java WSDP的这一发布版,JAXR没有提供预先配置的连接池。相反地,客户生成抽象类ConnectionFactory的实例:
import javax.xml.registry.*;
...
ConnectionFactory connFactory =
ConnectionFactory.newInstance();
生成连接
要生成连接,客户首先生成指定要访问的一个或多个注册中心的URL或URLs的属性集。例如,下面的代码提供了IBM测试注册中心的查询服务和发布服务的URLs。(在字符串中不应该有中止线。)
Properties
props = new Properties();
props.setProperty("javax.xml.registry.queryManagerURL",
"http://uddi.ibm.com/testregistry/inquiryapi");
props.setProperty("javax.xml.registry.lifeCycleManagerURL",
"https://uddi.ibm.com/testregistry/protect/publishapi");
使用JAXR的Java WSDP工具,如果客户正访问一个防火墙外的注册中心,必须指定运行的网络的代理主机和端口信息。对于查询,需要指定唯一的http代理主机和端口;对于更新,必须指定https代理主机和端口。
props.setProperty("com.sun.xml.registry.http.proxyHost",
"myhost.mydomain");
props.setProperty("com.sun.xml.registry.http.proxyPort",
"8080");
props.setProperty("com.sun.xml.registry.https.proxyHost",
"myhost.mydomain");
props.setProperty("com.sun.xml.registry.https.proxyPort",
"8080");
然后客户端为连接池设置属性,并生成连接:
connFactory.setProperties(props);
Connection
connection = connFactory.createConnection();
例子程序中的mackConnection方法显示了生成一个JAXR连接所使用的步骤。
设置连接属性
Java WSDP中的JAXR的实现允许为JAXR连接设置一组属性。其中一些属性是JAXR规范中定义的标准属性。其它属性是在Java
WSDP中的JAXR实现中指定的。表13-1和表13-2列出了这些属性,并进行了说明。
| 表13-1标准JAXR连接属性
|
| 属性名和说明 |
数据类型 |
默认值 |
| javax.xml.registry.queryManagerURL
指定目标注册提供者内部的查询管理服务的URL |
String |
None |
| javax.xml.registry.lifeCycleManagerURL
指定目标注册提供者内部的生存周期管理服务的URL(用于注册中心的更新) |
String |
与指定的queryManagerURL 的值相同 |
| javax.xml.registry.semanticEquivalences
为两个以逗号分隔的等价概念以一个或多个ID值的元组的形式指定语义等价的概念;元组由垂直竖线分隔:
id1,id2|id3,id4 |
String |
None |
| javax.xml.registry.security.authenticationMethod
为JAXR提供者提供关于将要用于注册中心提供者的身份验证的authentication方法 |
String |
None; UDDI_GET_AUTHTOKEN 是唯一支持的值 |
| javax.xml.registry.uddi.maxRows
有查找动作返回的最大行数。是UDDI提供者所特有的。 |
Integer |
None |
| javax.xml.registry.postalAddressScheme
ClassificationScheme的ID,用作默认的通信地址模式。参见用于例子的“指定通信地址”。 |
String |
None |
| 表13-2
JAXR连接实现特有的属性 |
| 属性名及说明 |
数据类型 |
默认值 |
| com.sun.xml.registry.http.proxyHost
指定Http代理主机,用于访问外部注册中心。按照Java WSDP时,如果指定了代理主机和端口,指定的值将存储在文件<JWSDP_HOME>/conf/jwsdp.properties中。 |
String |
在<JWSDP_HOME>/conf/jwsdp.properties
中指定的代理主机的值 |
| com.sun.xml.registry.http.proxyPort
指定Http代理端口,用于访问外部注册中心,通常是8080 |
String |
在<JWSDP_HOME>/conf/jwsdp.properties
中指定的代理端口的值 |
| com.sun.xml.registry.https.proxyHost
指定Https代理主机,用于访问外部注册中心 |
String |
与http代理主机的值相同 |
| com.sun.xml.registry.https.proxyPort
指定Https代理端口,用于访问外部注册中心,通常为8080 |
String |
与http代理端口的值相同 |
| com.sun.xml.registry.http.proxyUserName
如果代理要求身份验证,为代理主机指定用于Http代理的身份验证的用户名 |
String |
None |
| com.sun.xml.registry.http.proxyPassword
如果需要身份验证,为代理主机指定用于http代理身份验证的密码。 |
String |
None |
| com.sun.xml.registry.useCache
告诉JAXR工具首先在缓冲中查找注册对象,如果没有找到再去查找注册中心 |
Boolean, 以String的形式传递 |
True |
| com.sun.xml.registry.useSOAP
高诉JAXR工具使用Apache SOAP,而不是Java API来接发XML消息;调试时非常有用 |
Boolean, 以String的形式传递 |
False |
可以如下设置这些属性:
· 大多数属性必须在JAXR客户端程序中进行设置。例如:
Properties props = new Properties();
props.setProperty("javax.xml.registry.queryManagerURL",
"http://uddi.ibm.com/testregistry/inquiryapi");
props.setProperty("javax.xml.registry.lifeCycleManagerURL",
"https://uddi.ibm.com/testregistry/protect/publishapi");
ConnectionFactory factory = ConnectionFactory.newInstance();
factory.setProperties(props); connection = factory.createConnection();
· postalAddressScheme,
useCache,和useSOAP属性可以在用作Ant工具的build.xml文件的<sysproperty>标记中设置。例如:
<sysproperty key="useSOAP"
value="true"/>
这些属性也可以在Java命令行使用-D选项进行设置。
另一个Java WSDP中的JAXR工具特有的可选系统属性是com.sun.xml.registry.userTaxonomyFilenames。关于使用该属性的详细信息,请参见“定义分类”部分。
获得并使用RegistryService对象
生成连接后,客户端使用连接来获得RegistryService对象,然后使用一个或多个接口:
RegistryService
rs = connection.getRegistryService();
BusinessQueryManager bqm = rs.getBusinessQueryManager();
BusinessLifeCycleManager
blcm =
rs.getBusinessLifeCycleManager();
通常,客户端从RegistryService对象获得一个BusinessQueryManager对象和一个BusinessLifeCycleManager对象。如果使用注册中心仅用于简单查询,可以只须获得一个BusinessQueryManager对象。
查询注册中心
客户端使用注册中心的最简单的方法是查询已经将数据提交给它的机构的有关信息。BusinessQueryManager接口支持多种查找方法,允许客户使用JAXR信息模型来查找数据。许多方法返回一个满足方法的参数部分指定的各个标准的BulkResponse(某个对象的连接)。其中最有用的方法包括:
· findOraganizations,它返回满足指定标准的机构列表,指定标准通常是名字模式或某个分类模式内的分类。
· findServices,它返回由指定的机构提供的服务集。
· findServiceBindings,它返回由指定的服务支持的服务绑定(如何访问服务的信息)。
JAXRQuery程序演示了如何根据机构名称来查询注册中心以及如何显示返回的数据。JAXRQueryByNAICSClassification和JAXRQueryByWSDLClassification程序演示了如何使用分类来查询某个注册中心。所有的JAXR提供者至少为分类支持下列类别:
· 北美产业分类体系(NAICS)。详细信息参见http://www.census.gov/epcd/www/naics.html。
· 通用的标准的产品和服务分类
(UNSPSC)。详细信息请参见 http://www.eccma.org/unspsc/
。
· 由国际标准化组织维持的ISO3166国家编码分类体系(ISO)。详细信息参见http://www.iso.org/iso/en/prods-services/iso3166ma/index.html。
接下来描述了如何执行一些通用的查询。
根据名字查找机构
根据名字查找机构,通常与其它查询限定(影响排序和模式匹配)和名字模式(指定要查找的字符串)组合使用。FindOrganizations方法使用由findQualifier对象构成的集合作为它的第一个参数,namePattern对象构成的集合作为第二个参数。下面的代码段显示了如何查找注册中心中名字由指定的字符串qString开头的所有机构,并将它们按照字母次序排序。
// 定义查找限定和名字模式
Collection
findQualifiers = new ArrayList();
findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
Collection
namePatterns = new ArrayList();
namePatterns.add(qString);
//使用名字查找
BulkResponse response =
bqm.findOrganizations(findQualifiers,
namePatterns,
null, null, null, null);
Collection orgs = response.getCollection();
客户端可以使用百分号(%)来指定查询字符串可以出现在机构名称中的任意位置。例如,下面的代码段执行了区分大小写的查询,查找名字中包含qString的所有机构:
Collection
findQualifiers = new ArrayList();
findQualifiers.add(FindQualifier.CASE_SENSITIVE_MATCH);
Collection
namePatterns = new ArrayList();
namePatterns.add("%" + qString + "%");
//查找名字中包含qString的机构
BulkResponse
response =
bqm.findOrganizations(findQualifiers,
namePatterns, null
,
null, null, null);
Collection orgs = response.getCollection();
按照分类查找机构
要按照分类查找机构,需要得到指定的分类模式中的分类,然后指定分类作为findOrganizations方法的一个参数。
下面的代码段查找与NAICS类别中某个特定的分类相对应的所有机构。(可以在http://www.census.gov/epcd/naics/naicscod.txt或者文件<JWSDP_HOME>/docs/jaxr/taxonomies/naics.xml中找到NAICS编码信息。)
ClassificationScheme
cScheme =
bqm.findClassificationSchemeByName(null,
"ntis-gov:naics");
Classification classification =
blcm.createClassification(cScheme,
"Snack
and Nonalcoholic Beverage Bars", "722213");
Collection
classifications = new ArrayList();
classifications.add(classification);
// 形成JAXR请求
BulkResponse response = bqm.findOrganizations(null,
null, classifications, null, null, null);
Collection orgs = response.getCollection();
也可以使用分类来查找机构,这些机构提供了采用WSDL(Web服务说明语言)文档形式的技术规范基础上的各种服务。在JAXR中,作为代理的概念用于存储规范信息。和前面的例子相比,查找步骤相对复杂一点,因为客户端必须首先找到规范概念,然后才是使用这些概念的机构。
下面的代码段查找在给定的注册中心内部使用的所有WSDL规范实例。可以看到代码类似于NAICS查询代码,差异在于结尾时它调用的是findConcept,而不是findOrganization。
String schemeName
= "uddi-org:types";
ClassificationScheme uddiOrgTypes =
bqm.findClassificationSchemeByName(null,
schemeName);
/* 生成分类,指定方案和分类名称, 以及由UDDI规范为WSDL文档定义的值
*/ Classification
wsdlSpecClassification =
blcm.createClassification(uddiOrgTypes,
"wsdlSpec", "wsdlSpec");
Collection
classifications = new ArrayList();
classifications.add(wsdlSpecClassification);
//查找概念
BulkResponse br = bqm.findConcepts(null, null,
classifications, null, null);
为了缩小查找范围,可以使用findConcepts方法的其它参数(查找限定,名字,外部标识,或者外部链接)。
下一步是遍历概念,查找相应的WSDL文档,并显示使用每个文档的机构:
//显示找到的概念的信息
Collection
specConcepts = br.getCollection();
Iterator
iter = specConcepts.iterator();
if (!iter.hasNext())
{
System.out.println("No WSDL specification concepts
found");
} else {
while (iter.hasNext()) {
Concept concept = (Concept) iter.next();
String name = getName(concept);
Collection links = concept.getExternalLinks();
System.out.println("\nSpecification Concept:\n\tName:
" +
name
+ "\n\tKey: " +
concept.getKey().getId()
+
"\n\tDescription:
" +
getDescription(concept));
if (links.size() > 0) {
ExternalLink link =
(ExternalLink)
links.iterator().next();
System.out.println("\tURL of WSDL document: '"
+
link.getExternalURI() + "'");
}
//找到使用该概念的机构
Collection
specConcepts1 = new ArrayList();
specConcepts1.add(concept);
br = bqm.findOrganizations(null, null, null,
specConcepts1,
null, null);
//显示机构信息
...
}
如果找到了提供希望使用的服务的机构,就可以使用JAX-RPC API来调用服务。
查找服务和服务绑定
客户端找到机构后,它可以找到机构的服务以及与这些服务相关的服务绑定。
Iterator orgIter
= orgs.iterator();
while (orgIter.hasNext()) {
Organization org = (Organization) orgIter.next();
Collection services = org.getServices();
Iterator svcIter = services.iterator();
while (svcIter.hasNext()) {
Service svc
= (Service) svcIter.next();
Collection
serviceBindings =
svc.getServiceBindings();
Iterator sbIter = serviceBindings.iterator();
while (sbIter.hasNext())
{
ServiceBinding sb =
(ServiceBinding)
sbIter.next();
}
}
}
管理注册数据
如果客户端已经通过了相应的身份验证,它可以提交数据给注册中心,可以对数据进行修改、移除。是使用BusinessLifeCycleManager接口来执行这些任务的。
只要正在被修改或移除的数据是由同一个用户首先提交的,注册中心通常允许客户修改或移除数据。
从注册中心获得身份验证
可以提交数据前,客户必须发送它的用户名和密码给注册中心证明其可信任。下面的代码段演示了如何实现。
String username = "myUserName";
String password = "myPassword";
//从注册中心获得身份验证
PasswordAuthentication passwdAuth =
new PasswordAuthentication(username,
password.toCharArray());
Set creds = new HashSet();
creds.add(passwdAuth);
connection.setCredentials(creds);
生成机构
客户端生成机构,并在保存前暂时保存它的数据。
在JAXR API中,Organization对象是更复杂的数据项之一。通常包含如下内容:
· 一个Name对象
· 一个Description对象
· 一个Key对象,表示ID,通过它注册中心知道该机构。Key由注册中心生成,而不是由用户生成,当机构提交给注册中心,则返回该对象。
· 一个PrimaryContact对象,这是一个User对象,涉及到注册中心的某个已通过身份验证的用户。一个User对象通常包含一个PersonName对象和由TelephoneNumber、EmailAddress和/或PostalAddress对象构成的集合。
· Classification对象的集合
· Service对象以及相关的ServiceBinding对象
例如,下面的代码段生成一个机构,并指定了它的名字、说明和主要联系方式。当客户端生成一个机构时,它不包含关键字;当注册中心接收新生成的机构时返回新的关键字。代码段中的blcm对象是在“获得并使用RegistryService对象”部分返回的BusinessLifeCycleManager对象。InternationalString对象用作字符串值,它可能需要被局部化。
// 生成机构名称和描述
Organization org =
blcm.createOrganization("The
Coffee Break");
InternationalString s =
blcm.createInternationalString("Purveyor
of " +
"the
finest coffees. Established 1895");
org.setDescription(s);
//生成主要联系方式,设置名字
User primaryContact = blcm.createUser();
PersonName pName = blcm.createPersonName("Jane
Doe");
primaryContact.setPersonName(pName);
//设置主联系电话
TelephoneNumber tNum = blcm.createTelephoneNumber();
tNum.setNumber("(800) 555-1212");
Collection phoneNums = new ArrayList();
phoneNums.add(tNum);
primaryContact.setTelephoneNumbers(phoneNums);
//设置主联系emil地址
EmailAddress emailAddress =
blcm.createEmailAddress("jane.doe@TheCoffeeBreak.com");
Collection emailAddresses = new ArrayList();
emailAddresses.add(emailAddress);
primaryContact.setEmailAddresses(emailAddresses);
//设置机构的主要联系地址
org.setPrimaryContact(primaryContact);
添加分类
机构通常属于一个或多个基于一种或多种分类方案(分类系统)的分类。要获得使用一种分类系统时某个机构的分类,客户首先查找希望使用的分类系统。使用BusinessQueryManager来查找分类系统。FindClassificationSchemeByName方法将一组FindQualifier对象作为它的首参数,但该参数可以为空。
//设置分类方案为NAICS
ClassificationScheme cScheme =
bqm.findClassificationSchemeByName(null,
"ntis-gov:naics");
客户端使用分类方案和分类方案内部的概念(分类系统的一个元素)来生成一个分类。例如,下面的代码为NAICS分类系统中的机构建立一个分类。CreateClassificiation方法的第二个和第三个参数是名字和概念的值。
//生成并添加分类
Classification classification =
blcm.createClassification(cScheme,
"Snack
and Nonalcoholic Beverage Bars", "722213");
Collection classifications = new ArrayList();
classifications.add(classification);
org.addClassifications(classifications);
服务也使用分类,因此可以用类似的代码添加一个分类到Service对象中。
为机构添加服务和服务绑定
大多数机构将自己添加到注册中心是为了提供服务,因此JAXR API提供了增加服务和服务绑定到机构中去的工具。
和一个Organization对象类似,一个Service对象有名字和描述。而且和一个Organization对象一样,它有唯一的关键字,关键字是在服务注册时,由注册中心生成的。它还可以有相关联的分类。
通常服务还有服务绑定,它提供了如何访问服务的有关信息。一个ServiceBinding对象通常有说明、一个访问用的URI和指定的链接。链接提供了服务绑定和使用服务绑定来描述如何使用服务的技术规范间的关联。
下面的代码段显示了如何生成服务集合,如何添加服务绑定到服务中,然后如何将服务添加到机构中。它指定了一个URI,但没有指定链接。因为访问用的URI不是真实的,因为JAXR默认会检查发布的URI的有效性,而绑定将它的validateURI属性摄制成false。
//生成服务
Collection services = new ArrayList();
Service service = blcm.createService("My Service
Name");
InternationalString is = blcm.createInternationalString("My
Service Description"); service.setDescription(is);
//生成服务绑定
Collection serviceBindings = new ArrayList();
ServiceBinding binding = blcm.createServiceBinding();
is = blcm.createInternationalString("My Service
Binding " +
"Description"); binding.setDescription(is);
//允许发布一个假的没有错误的URL binding.setValidateURI(false);
binding.setAccessURI("http://TheCoffeeBreak.com:8080/sb/");
serviceBindings.add(binding);
//添加服务绑定到服务
service.addServiceBindings(serviceBindings);
//添加服务到服务集,然后添加服务集到机构
services.add(service);
org.addServices(services);
保存机构
客户端使用的用于添加或修改机构数据的主要方法是saveOrganizations方法,如果以前该机构不存在,它在注册中心生成一个或多个新的机构。如果其中的一个机构已经存在,但某些数据变化了,saveOrganizations方法更新替换数据。
客户端将要公开的信息存储在机构中,然后保存该机构。响应时,注册中心返回关键字,客户端可以查找机构。
//增加机构并提交给注册中心
//如果成功,查找关键字
Collection orgs = new ArrayList();
orgs.add(org);
BulkResponse response = blcm.saveOrganizations(orgs);
Collection exceptions = response.getException();
if (exceptions == null) {
System.out.println("Organization
saved");
Collection keys = response.getCollection();
Iterator keyIter = keys.iterator();
if (keyIter.hasNext()) {
javax.xml.registry.infomodel.Key
orgKey =
(javax.xml.registry.infomodel.Key)
keyIter.next();
String
id = orgKey.getId();
System.out.println("Organization
key is " + id);
org.setKey(orgKey);
}
}
从注册中心移除数据
注册中心允许从注册中心移除已经提交给它的数据。使用注册中心返回的关键字作为其中的一个参数,BusinessLifeCycleManager中的删除方法有:deleteOrganizations,
deleteServices, deleteServiceBindings等等。
JAXRDelete例子程序删除由JAXRPublish程序生成的机构。它删除与指定的关键字串相对应的机构,然后再次显示关键字,这样用户可以确定已经删除了一个正确的机构。
String id = key.getId();
System.out.println("Deleting organization with
id " + id);
Collection keys = new ArrayList();
keys.add(key); BulkResponse response = blcm.deleteOrganizations(keys);
Collection exceptions = response.getException();
if (exceptions == null) {
System.out.println("Organization
deleted");
Collection retKeys = response.getCollection();
Iterator keyIter = retKeys.iterator();
javax.xml.registry.infomodel.Key
orgKey = null;
if (keyIter.hasNext()) {
orgKey
=
(javax.xml.registry.infomodel.Key)
keyIter.next();
id = orgKey.getId();
System.out.println("Organization
key was " + id);
}
}
客户端可以使用类似的机制去删除服务和服务绑定。 |