使用JAXR的客户端
Sun ONE Application Server为客户端提供了通过用于XML注册中心的Java API实现来发布、发现和管理XML注册中心内容的能力。
本模块讲述能够与注册中心进行交互并执行各种注册中心操作的客户端的开发过程。本模块包含以下几节:
开发JAXR客户端
本节讲述实现一个能够查询和更新注册中心的JAXR客户端的必要步骤:
在开发JAXR客户端之前,确保已经设置了你的客户端环境,关于设置客户端环境的更多信息,请参见""配置客户端环境 "。
实现一个JAXR客户端包含以下步骤:
访问注册中心
你必须从注册中心获得权限来访问它。然后,JAXR客户端就能够执行查询,添加数据到注册中心,或者更新注册中心的数据。想要注册到一个公共的第2版UDDI注册中心,请访问以下网址中的一个并按照指示行事:
http://uddi.microsoft.com/ (Microsoft)
https://uddi.ibm.com/ubr/registry.html (IBM)
注册之后,你将会得到一个用户名和密码。为了运行Sun ONE Application Server所带的例子,你可以注册到IBM的UDDI注册中心。
访问ebXML注册中心
ebXML注册中心允许你发布及发现Web服务。与UDDI注册中心不同,ebXML注册中心能够保存关于服务的元数据,以及任意内容,例如web服务的实际描述,它是一个WSDL文件。
关于ebXML的更多信息,请访问以下网址:
Sun ONE Application Server支持JAXR客户端通过第三方的JAXR提供者访问ebXML注册中心。ebxmlrr-client程序包提供了兼容于OASIS ebXML 注册中心V2.x ( 2.0和2.1版本) 标准的JAXR API实现。ebxmlrr-client程序包还包括了注册中心浏览器应用程序,用它能够图形化地浏览OASIS ebXML V2.x 注册中心。
想要了解更多信息,请访问以下网址:
http://ebxmlrr.sourceforge.net
建立连接
JAXR客户端必须执行的第一个任务是建立一个到注册中心的连接。当JAXR提供者调用注册中心提供者方法的时候,该连接包含了客户端的状态信息和喜好信息。
注意
为了添加数据到注册中心,或者更新数据中心数据,客户端必须在连接上设定认证信息。与注册中心建立认证信息的方式因注册中心提供者的不同而不同。
从连接工厂中创建连接。JAXR提供者可能会提供一个或多个预配置好的连接工厂,客户端可以利用JNDI API寻找它们。
以下代码示范了如何和一个JAXR提供者建立连接:
import javax.xml.registry.*;
...
public void makeConnection(String queryURL, String publishURL)
{
ConnectionFactory factory = ConnectionFactory.newInstance();
.....
}
在上面的代码中,queryURL和publishURL分别表示查询和发布注册中心的URL地址。
设置属性
Sun ONE应用服务中的JAXR API实现允许你在JAXR连接上建立一些属性。下表列出了标准的JAXR连接属性,以及Sun ONE Application ServerJAXR实现的特有属性。第一列给出了属性的名称和描述,第二列给出了属性支持的数据类型,第三列给出的是属性的默认值。
标准的JAXR连接属性
属性名称及描述
数据类型
默认值
javax.xml.Registry.queryManagerURL
在目标注册中心提供者中指定查询管理服务的URL。
String
无
javax.xml.registry.lifeCycleManagerURL
在目标注册中心提供者中指定生命周期管理服务的URL(针对注册中心更新)
String
与queryManagerURL指定的值相同
javax.xml.registry.semanticEquivalences
将概念的语义等价关系指定为两个逗号分隔的等价概念的ID值的一个或者多个元组,每个tuple包含由逗号分隔的一对对应concept的ID 值;元组之间用竖线分隔:id1,id2|id3,id4
String
无
javax.xml.registry.security.
authenticationMethod
为JAXR提供者提供暗示,指出使用何种认证方法与注册中心提供者之间进行认证。
String
无;
UDDI_GET_AUTHTOKEN是唯一支持的值
javax.xml.registry.uddi.maxRows
find方法能返回的最大行数。因UDDI提供者的不同而不同
Integer
无
javax.xml.registry.postalAddressScheme
被用作默认邮寄地址schema的ClassificationScheme的ID
String
无
Sun ONE Application Server特有JAXR实现的连接属性
属性名称及描述
数据类型
默认值
com.sun.xml.registry.http.proxyHost
指定访问外部注册中心的HTTP代理主机
String
<which file>?中指定的代理主机
com.sun.xml.registry.http.proxyPort
指定访问外部注册中心的HTTP代理端口;一般是8080
String
<which file>?中指定的代理端口
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
无
com.sun.xml.registry.http.proxyPassword
如果需要的话, 为HTTP代理认证指定代理主机的密码
String
无
com.sun.xml.registry.useCache
告诉JAXR实现首先在缓冲区查找注册中心对象,如果没有找到再到注册中心中查找
Boolean,当作String传入
True
com.sun.xml.registry.useSOAP
告诉JAXR实现使用Apache SOAP而不是用于XML消息的Java API。调试的时候可能会用到
Boolean,当作String传入
False
可以象下面这样设置属性:
String queryURL = "http://www-3.ibm.com/services/uddi/v2beta/inquiryapi";
String publishURL= "https://www-3.ibm.com/services/uddi/v2beta/protect/publishapi";
Properties props = new Properties();
props.setProperty("javax.xml.registry.queryManagerURL", queryUrl);
props.setProperty("javax.xml.registry.lifeCycleManagerURL", publishUrl);
创建连接
客户端首先创建一系列属性,用来指定被访问的一个或多个注册中心的URL。
然后客户端为连接属性设置属性并创建连接。
factory.setProperties(props);
Connection connection = factory.createConnection();
获得RegistryService和Manager
客户端使用连接获得RegistryService对象,然后获得将要使用的一个或多个接口。以下代码演示了如何获得注册中心服务。
RegistryService rs = connection.getRegistryService();
BusinessQueryManager bqm = rs.getBusinessQueryManager();
BusinessLifeCycleManager blcm = rs.getBusinessLifeCycleManager();
设置客户端认证信息
以下代码演示了如何为要求权限的注册中心操作设置客户端认证信息:
PasswordAuthentication passwdAuth = new PasswordAuthentication(username, password.toCharArray());
Set creds = new HashSet();
creds.add(passwdAuth);
查询注册中心
客户端使用注册中心是通过向它查询已经提交了数据的机构的信息。客户端可以按照下面的一条或者多条规则来查询注册中心。
FindOrganizations, 返回一系列符合特定条件——经常是一个名称模式,或者类别模式中的一种类别——的机构
FindServiceBindings,返回指定服务支持的服务绑定(关于如何访问服务的信息)。
FindService,返回指定机构提供的一系列服务。
本节讲述按照以下规则查询注册中心的步骤:
通过名称查找机构
为了通过名称找到一个机构,可以使用查询条件组合(影响排序和模式匹配)以及名称模式(指定查找字符串)。FindOrganizations方法把一组findQualifier作为它的第一个参数,把一组namePattern对象作为它的第二个参数。
以下代码演示了使用findOrganizations方法查找以qString作为名称开头的机构,并且按照字母顺序排序:
Collection findQualifiers = new ArrayList();
findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
namePatterns.add(qString);
以上代码定义了查询条件和名称模式。
想要通过名称查找机构,请象下面代码示例那样使用findOrganizations()方法。
BulkResponse response = bqm.findOrganizations(findQualifiers, namePatterns, null, null, null, null);
Collection orgs = response.getCollection();
通过类别查找机构
想要通过类别查找机构,你需要在特定的类别模式之内建立一种类别,并且指定该类别作为findOrganizations()的参数。
假定你正在浏览UDDI注册中心并且想要查找在美国范围内提供符合NAICS (北美产业分类体系)类型的计算机系统及相关服务的机构。为了使用JAXR执行这个查询,请调用findOrganizations()方法,并把著名的分类体系NAICS和ISO 3166地理编码系统(ISO 3166)下列出的类别作为参数。因为JAXR为这些类别提供了分类体系服务,所以客户端能够容易地访问作为参数传给findOrganization()的类别信息。
ClassificationScheme cScheme = bqm.findClassificationSchemeByName (null, "ntis-gov:naics");
Classification classification = (Classification)blcm.createClassification(cScheme, "Snack and Nonalcoholic Beverage Bars", "722213");
Collection classifications = new ArrayList();
classifications.add(classification);
// make JAXR request
BulkResponse response = bqm.findOrganizations(null, null, classifications, null, null, null);
Collection orgs = response.getCollection();
通过WSDL描述查找机构
你可以根据WSDL文件格式的技术规范来查找机构。在JAXR中,concept被当成持用规范的代理。客户端必须首先找到规范concept,然后再找到使用这些concept的机构。
以下代码演示了根据给定注册中心使用的WSDL规范实例来查找一个机构。
String schemeName = "uddi-org:types";
ClassificationScheme uddiOrgTypes = bqm.findClassificationSchemeByName(null, schemeName);
/*
* Create a classification, specifying the scheme
* and the taxonomy name and value defined for WSDL
* documents by the UDDI specification.
*/
Classification wsdlSpecClassification = blcm.createClassification(uddiOrgTypes, "wsdlSpec", "wsdlSpec");
ArrayList classifications = new ArrayList(); classifications.add(wsdlSpecClassification);
// Find concepts
BulkResponse br = bqm.findConcepts(null, null, classifications, null, null);
接着,你必须遍历concept,找到它们对应的WSDL文件,并显示出使用每个文件的机构:
// Display information about the concepts found
Collection specConcepts = br.getCollection();
Iterator iter = specConcepts.iterator();
if (!iter.hasNext()) {
System.out.println("No WSDL specification concepts found");
} else {
while (iter.hasNext()) {
try{
Concept concept = (Concept) iter.next();
String name = getName(concept);
Collection links = concept.getExternalLinks();
System.out.println("\nSpecification Concept:\n Name: " +name + "\n Key: " + concept.getKey().getId() + "\n Description: " + getDescription(concept));
if (links.size() > 0) {
ExternalLink link =
(ExternalLink) links.iterator().next();
System.out.println("URL of WSDL document: '" link.getExternalURI() + "'");
}
// Find organizations that use this concept
ArrayList specConcepts1 = new ArrayList();
specConcepts1.add(concept);
br = bqm.findOrganizations(null, null, null, specConcepts1, null, null);
Collection orgs = br.getCollection();
// Display information about organizations
... }
查找服务和服务绑定
JAXR客户端可以分别使用getService()和getServiceBindings()方法找到机构的服务和与之相关的服务绑定。以下代码演示了getService()和getServiceBindings()方法的使用:
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();
}
}
}