使用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的更多信息,请访问以下网址:
http://www.ebxml.org
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();
}
}
}
管理注册中心数据
JAXR客户端可以提交数据到注册中心、修改现存的注册中心数据、以及从注册中心删除数据。JAXR客户端必须通过认证才能管理注册中心数据。只有已经向数据中心提交了数据的客户端才能够修改或删除它。
本节讲述了以下任务:
获得注册中心的授权
JAXR客户端通过连接上的一组证书发送它的用户名和密码到注册中心。提供者可能会使用这些证书与注册中心进行认证。
// Edit to provide your own username and password
String username = "";
String password = "";
// Get authorization from the registry
PasswordAuthentication passwdAuth = new PasswordAuthentication(username,
password.toCharArray());
Set creds = new HashSet();
creds.add(passwdAuth);
connection.setCredentials(creds);
创建一个机构
A JAXR client creates the organization and populates
it with the data before saving it. The Organization
object is used to create an organization. This object
includes the following objects:
JAXR客户端创建机构,并在保存它之前为其添入数据。使用Organization对象来创建机构,该对象中包含了以下对象:
- 一个Name对象
- 一个Description对象
- 一个Key 对象,代表注册中心唯一标识机构的ID。Key是由注册中心而不是用户生成的。
- 一个PrimaryContactObject -代表注册中心授权用户的用户对象。该对象包含以下关于授权用户的信息:
- PersonName, TelephoneNumber, EmailAddress, 和/或PostalAddress
- 一组classification对象
- Service对象及其相关的服务绑定对象
以下代码演示了如何使用Organization的方法创建一个机构:
// Create Organization in memory
Organization org = businessLifeCycleManager.createOrganization
("Sun Microsystems");
// Create User -- maps to Contact for UDDI
User user = businessLifeCycleManager.createUser();
PersonName personName = businessLifeCycleManager.createPersonName("Bob");
TelephoneNumber telephoneNumber = businessLifeCycleManager.createTelephoneNumber();
telephoneNumber.setNumber("650-241-8979");
telephoneNumber.setType("office");
Collection numbers = new ArrayList();
numbers.add(telephoneNumber);
EmailAddress email = businessLifeCycleManager.createEmailAddress("[email protected]",
"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);
添加类别
机构一般属于一个或多个类别模式或分类体系中的一个或者多个类别。为了为一个机构在分类体系中指定类别,客户端首先使用BusinessQueryManager来定位分类体系。FindClassificationSchemeByName方法接收一组FindQualifier对象作为第一个参数,该参数也可以为空。
// Set classification scheme to NAICS
ClassificationScheme cScheme = bqm.findClassificationSchemeByName(null,
"ntis-gov:naics");
然后,客户端创建一个类别。例如,以下代码为NAICS分类体系内的机构设定了类别。
// Create and add classification
Classification classification = (Classification)
blcm.createClassification(cScheme, "Snack and
Nonalcoholic Beverage Bars", "722213");
Collection classifications = new ArrayList(); classifications.add(classification);
org.addClassifications(classifications);
服务也要用到类别,所以你可以使用相似的代码为Service对象添加类别。
使用分类体系
分类体系由ClassificationScheme对象表示。本节讲述了如何在以下方面使用JAXR实现:
定义分类体系
JAXR规范要求JAXR提供者能够添加用户自定义的、能被JAXR客户端使用的分类体系。Sun ONE
Application Server的JAXR实现使用简单的基于文件的方法为JAXR客户端提供分类体系。这些文件在运行时刻,当JAXR提供者启动的时候被读取。
分类体系结构由JAXR预定义的Concepts DTD来定义,Concepts DTD在jaxrconcepts.dtd文件中被声明,同时也在jaxrconcepts.xsd文件中以XML
schema的格式被声明。jaxrconcepts.xml文件包含了用于JAXR实现的分类体系。所有这些文件都包含在install_dir/share/lib/jaxr-impl.jar文件中。
为了添加用户自定义的分类体系,请执行以下过程:
在你将要访问的注册中心中为分类体系发布JAXRClassificationScheme元素,作为一个ClassificationScheme对象。例如,你可以发布ClassificationScheme对象到UDDI注册中心服务器。为了发布ClassificationScheme对象,你必须设定它的名称。你还要在已知的类别模式,例如uddi-org:types中,给模式指定一个类别。在下面的代码中,LifeCycleManager.createClassificationScheme方法调用的第一个参数就是名称。
ClassificationScheme cScheme = blcm.createClassificationScheme("MyScheme",
"A Classification Scheme");
ClassificationScheme uddiOrgTypes = bqm.findClassificationSchemeByName(null,
"uddi-org:types");
if (uddiOrgTypes != null)
{
Classification classification = blcm.createClassification(uddiOrgTypes,"postalAddress",
"categorization" );
postalScheme.addClassification(classification);
ExternalLink externalLink = blcm.createExternalLink("http://www.mycom.com/myscheme.html","My
Scheme");
postalScheme.addExternalLink(externalLink);
Collection schemes = new ArrayList();
schemes.add(cScheme);
BulkResponse br = blcm.saveClassificationSchemes(schemes);
}
//The BulkResponse object returned by the saveClassificationSchemes
method contains the key for the classification scheme,
which you need to retrieve
if (br.getStatus() == JAXRResponse.STATUS_SUCCESS)
{
System.out.println("Saved ClassificationScheme");
Collection schemeKeys = br.getCollection();
Iterator keysIter = schemeKeys.iterator();
while (keysIter.hasNext())
{
javax.xml.registry.infomodel.Key key = (javax.xml.registry.infomodel.Key)
keysIter.next();
System.out.println("The postalScheme key is
" + key.getId());
System.out.println("Use this key as the scheme"
+ " uuid in the taxonomy file");
}
}
在XML文件中,定义一个与JAXR预定义Concepts DTD兼容的分类体系结构。在你的分类体系XML文件中输入ClassificationScheme元素,指定返回的主键
ID值作为id属性,并指定name作为name属性。例如,JAXRClassificationScheme元素的起始标签看起来好像下面这样(所有都在一行):
<JAXRClassificationScheme id="uuid:nnnnnnnn-nnnn-nnnn-nnnn-
nnnnnnnnnnnn" name="MyScheme">
The ClassificationScheme id must be a UUID.
在你的分类体系XML文件中输入每个JAXRConcept元素,按顺序指定下面的四个属性。
a) id是JAXRClassificationScheme的id值,后面接着一个/
分隔符,再接着是JAXRConcept元素的code
b) name是JAXRConcept元素的名称
c) parent是直接父元素的id(ClassificationScheme的id或者JAXRConcept的id)
d) code是JAXRConcept元素的code值
naics.xml文件中的第一个JAXRConcept元素好像下面这样(所有都在一行):
<JAXRConcept id="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2/11"
name="Agriculture, Forestry, Fishing and Hunting"
parent="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2"
code="11"></JAXRConcept>
想要添加一个用户自定义分类体系结构到JAXR提供者,请在运行客户端程序的时候指定com.sun.xml.registry.userTaxonomyFilenames属性。该命令行(都在一行)看起来好像下面这样,竖杠(|)作为文件分隔符:
java myProgram -DuserTaxonomyFilenames=c:\myfile\xxx.xml|c:\myfile\xxx2.xml
还可以在build.xml文件中使用<sysproperty>标签设定这个属性。或者,在程序中象下面这样设定这个属性:
System.setProperty ("com.sun.xml.registry.userTaxonomyFilenames",
"c:\myfile\xxx.xml|c:\myfile\xxx2.xml");
指定邮递地址
JAXR规范定义了一个邮递地址作为结构化的接口,它具有street、city、 country等属性。UDDI规范却定义邮递地址作为一个自由格式的地址行集合,每行可能被赋予一个意义。为了映射JAXR的PostalAddress格式到一个特定的UDDI地址格式,你需要指定UDDI格式作为ClassificationScheme对象,然后在格式类别模式中的concept和JAXR
PostalAddress类别模式中的comment之间指定语义对等关系。JAXR PostalAddress类别模式由Sun
ONE Application Server的JAXR实现提供。PostalAddress对象含有以下字段:streetNumber、street、
city、 state、postalCode、和country。这些是按照ClassificationScheme指定的PostalAddressAttributes,在postalconcepts.xml文件中预定义的concept。
为了在JAXR邮递地址格式和其他格式之间指定映射关系,你需要设置两个连接属性。
- javax.xml.registry.postalAddressScheme属性,它为连接指定了一个邮递地址类别模式。
- javax.xml.registry.semanticEquivalences属性,它在JAXR格式和其他格式之间指定了语义对等关系。
首先,使用来自JAXRClassificationScheme元素(UUID)的id值来指定邮递地址模式。
// Set properties for postal address mapping using
my scheme props.setProperty("javax.xml.registry.postalAddressScheme",
uuid:6eaf4b50-4196-11d6-9e2b-000629dc0a2b");
然后,指定从默认JAXR邮递地址模式的每个JAXRConcept元素id到IBM模式中对应元素id的映射。
props.setProperty("javax.xml.registry.semanticEquivalences",urn:uuid:PostalAddressAttributes/StreetNumber,"
+"urn:uuid:6eaf4b50-4196-11d6-9e2b-000629dc0a2b/StreetAddressNumber|"
+
"urn:uuid:PostalAddressAttributes/Street,"
+ "urn:uuid:6eaf4b50-4196-11d6-9e2b- 000629dc0a2b/StreetAddress|"
+ "urn:uuid:PostalAddressAttributes/City,"
+ "urn:uuid:6eaf4b50-4196-11d6- 9e2b-000629dc0a2b/City|"
+ "urn:uuid:PostalAddressAttributes/State,"
+ "urn:uuid:6eaf4b50-4196-11d6-9e2b000629dc0a2b/State|"+
urn:uuid:PostalAddressAttributes/PostalCode,"
+ "urn:uuid:6eaf4b50-4196-11d6- 9e2b-000629dc0a2b/ZipCode|"
+
"urn:uuid:PostalAddressAttributes/Country,"
+ "urn:uuid:6eaf4b50-4196-11d6-9e2b-000629dc0a2b/Country");
使用这些属性创建连接之后,在发布机构之前,你可以创建一个邮递地址并把机构主要联系方式赋给它。
例如:
String streetNumber = "99";
String street = "Imaginary Ave. Suite 33";
String city = "Imaginary City";
String state = "NY";
String country = "USA";
String postalCode = "00000";
String type = "";
PostalAddress postAddr =
blcm.createPostalAddress(streetNumber, street, city,
state, country, postalCode, type);
Collection postalAddresses = new ArrayList();
postalAddresses.add(postAddr);
primaryContact.setPostalAddresses(postalAddresses);
这时,如果邮递地址模式和查询的语义对等关系与发布时指定的一样,JAXR查询就可以使用PostalAddress方法检索出邮递地址。如果不知道以前是用何种邮寄地址模式来发布的邮递地址,你可以把它们当作一组Slot对象来检索。JAXRQueryPostal.java示例程序演示了如何这样做:
向机构添加服务和服务绑定
很多机构添加自己到注册中心是为了提供服务,所以JAXR为添加服务和服务绑定到机构提供了便利。
就象Organization对象一样,Service对象拥有一个名称和一个描述。仍和Organization一样,它也拥有在服务注册时,由注册中心生成的唯一主键。它可能还包含与其相关的类别。
服务通常还含有服务绑定,它提供了关于如何访问服务的信息。ServiceBinding对象通常含有一个描述信息,一个访问URI,以及一个规范链接,它在服务绑定和描述如何通过服务绑定使用服务的技术规范之间提供了一个链接。
以下代码演示了如何创建一组服务,添加服务绑定到服务,然后添加服务到机构。它指定一个访问URI但不指定规范链接。因为访问URI不是真实的,而且默认情况下JAXR为所有发布的URI检查有效性,所以绑定设置validateURI属性的值为false。
// Create services and service
Collection services = new ArrayList();
Service service = blcm.createService("My Service
Name");
InternationalString is = blcm.createInternationalString("My
Service Description");
service.setDescription(is);
// Create service bindings
Collection serviceBindings = new ArrayList();
ServiceBinding binding = blcm.createServiceBinding();
is = blcm.createInternationalString("My Service
Binding " + "Description");
binding.setDescription(is);
binding.setValidateURI(false);
binding.setAccessURI("http://TheCoffeeBreak.com:8080/sb/");
serviceBindings.add(binding);
// Add service bindings to service
service.addServiceBindings(serviceBindings);
// Add service to services, then add services to
organization
services.add(service);
org.addServices(services);
发布一个web服务到UDDI注册中心
JAXR提供者为发布web服务到UDDI注册中心提供了便利。本节讲述了发布现有web服务到注册中心的步骤:
发布一个服务到注册中心包括以下步骤:
- 创建一个Organization
- 创建它的类别
- 创建服务及服务绑定
- 保存信息到注册中心
为了创建发布Web服务到注册中心的JAXR客户端,请导入下面这些必需的程序包:
import javax.xml.registry.*;
import javax.xml.registry.infomodel.*;
import java.net.*;
import java.security.*;
import java.util.*;
创建一个类,其中包含一个main方法,一个makeConnection方法,用来建立到注册中心的连接,一个executePublish方法,用来发布所有与服务相关的信息到注册中心。以下代码演示了主类JAXRPublish的创建:
public class JAXRPublish {
Connection connection = null;
public JAXRPublish() {}
public static void main(String[] args) {
String queryURL = "http://www-3.ibm.com/services/uddi/v2beta/inquiryapi";
String publishURL = "https://www-3.ibm.com/services/uddi/v2beta/protect/publishapi";
String username = "";
String password = "";
JAXRPublish jp = new JAXRPublish();
jp.makeConnection(queryURL, publishURL);
jp.executePublish(username, password);
}
JAXR客户端必须建立一个到UDDI注册中心的连接,并设置连接配置属性。详细信息请参见"建立连接"。
创建连接,传入配置属性。详细信息请参见"创建连接"。
创建一个机构,以及它的类别、服务,把它保存到注册中心。
更多信息请参见以下几节:
以下代码演示了发布web服务的步骤:
public void executePublish(String username, String
password) { RegistryService rs = null;
BusinessLifeCycleManager blcm = null;
BusinessQueryManager bqm = null;
String orgName = "The Coffee Break";
String orgDesc = "Purveyor of the finest coffees.
Established 1895"; String contactName = "Jane
Doe";
String contactPhone = "(800) 555-1212";
String contactEmail = "[email protected]";
String serviceName = "My Service Name";
String serviceDesc = "My Service Description";
String serviceBindingDesc = "My Service Binding
Description";
String serviceBindingURI = "http://localhost:1024";
String scheme = "ntis-gov:naics";
String conceptName = "Snack and Nonalcoholic
Beverage Bars";
String conceptCode = "722213";
try {
java.io.BufferedInputStream bfInput = null;
Properties propTemp = new Properties();
bfInput = new java.io.BufferedInputStream (new java.io.FileInputStream("jaxr.properties"));
propTemp.load(bfInput);
bfInput.close();orgName = propTemp.getProperty("org-name");
orgDesc = propTemp.getProperty("org-desc");
contactName = propTemp.getProperty("contact-name");
contactPhone = propTemp.getProperty("contact-phone");
contactEmail = propTemp.getProperty("contact-email");
serviceName = propTemp.getProperty("service-name");
serviceDesc = propTemp.getProperty("service-desc");
serviceBindingDesc = propTemp.getProperty("service-binding-desc");
serviceBindingURI = propTemp.getProperty("service-binding-uri");
scheme = propTemp.getProperty("scheme");
conceptName = propTemp.getProperty("concept");
conceptCode = propTemp.getProperty("concept-code");
}
try {
rs = connection.getRegistryService();
blcm = rs.getBusinessLifeCycleManager();
bqm = rs.getBusinessQueryManager();
System.out.println("Got registry service, query
" + "manager, and life cycle manager");
// Get authorization from the registry
PasswordAuthentication passwdAuth = new PasswordAuthentication(username,password.toCharArray());
Set creds = new HashSet();
creds.add(passwdAuth);
connection.setCredentials(creds);
System.out.println("Established security credentials");
// Create organization name and description
Organization org = blcm.createOrganization(orgName);
InternationalString s = blcm.createInternationalString(orgDesc);
org.setDescription(s);
// Create primary contact, set name
User primaryContact = blcm.createUser();
PersonName pName = blcm.createPersonName(contactName);
primaryContact.setPersonName(pName);
// Set primary contact phone number
TelephoneNumber tNum = blcm.createTelephoneNumber();
tNum.setNumber(contactPhone);
Collection phoneNums = new ArrayList();
phoneNums.add(tNum);
primaryContact.setTelephoneNumbers(phoneNums);
// Set primary contact email address
EmailAddress emailAddress = blcm.createEmailAddress(contactEmail);
Collection emailAddresses = new ArrayList();
emailAddresses.add(emailAddress);
primaryContact.setEmailAddresses(emailAddresses);
// Set primary contact for organization
org.setPrimaryContact(primaryContact);
// Set classification scheme to NAICS
ClassificationScheme cScheme = bqm.findClassificationSchemeByName(null,scheme);
if (cScheme != null) {
// Create and add classification
Classification classification = (Classification)
blcm.createClassification(cScheme, conceptName, conceptCode);
Collection classifications = new ArrayList();
classifications.add(classification);
org.addClassifications(classifications);
}
// Create services and service
Collection services = new ArrayList();
Service service = blcm.createService(serviceName);
InternationalString is = blcm.createInternationalString(serviceDesc);
service.setDescription(is);
// Create service bindings
Collection serviceBindings = new ArrayList();
ServiceBinding binding = blcm.createServiceBinding();
is = blcm.createInternationalString(serviceBindingDesc);
binding.setDescription(is);
// allow us to publish a bogus URL without an error
binding.setValidateURI(false);
binding.setAccessURI(serviceBindingURI);
serviceBindings.add(binding);
// Add service bindings to service
service.addServiceBindings(serviceBindings);
// Add service to services, then add services to
organization
services.add(service);
org.addServices(services);
// Add organization and submit to registry
// Retrieve key if successful
Collection orgs = new ArrayList();
orgs.add(org);
BulkResponse response = blcm.saveOrganizations(orgs);
Collection exceptions = response.getExceptions();
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);
}
}
}
}
组装并部署JAXR客户端
以下步骤讲述了组装并部署JAXR客户端的步骤:
1. 执行默认目标core来编译Java文件并建立.jar文件。.jar文件包含了JAXR
API类和包装客户端类。
asant core
2. 创建Javadoc。例如:
在install_dir/samples/webservices/jaxr/src/下执行以下asant命令行来创建javadoc:
asant javadoc
3. 部署客户端
a.可以配置JAXR来访问各种注册中心。可以使用自己的注册中心服务器或者公共注册中心服务器。如果选择一个公共注册中心服务器,请确保你能够发布到注册中心服务器。使用正确的参数修改Modify
jaxr.properties,该文件包括以下参数:
- query-url –注册中心服务器的完全查询URI
- publish-url -注册中心服务器的完全发布URI
- sername – 发布机构到注册中心服务器所需的用户名
- password -发布机构到注册中心服务器所需的密码
- query-string 在注册中心中用于查询的查询字符串
- key-string – 将要从注册中心删除的机构的主键字符串
b.If you wish to publish to the registry server,
modify the publish organization info section in the
jaxr.properties, if required.
如果你想要发布到注册中心,在必要情况下,可以修改jaxr.properties中的发布机构信息一节。
4. 使用以下命令运行客户端:
asant run
JAXR客户端示例
在Sun ONE Application Server环境的如下位置,你可以得到多个例子应用程序,它们示范了JAXR
API的使用方法:
install_dir/samples/webservices/jaxr/
|