開發JAXR客戶端

小師兄.發表於2019-01-30

使用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("bob@sun.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);

新增類別

機構一般屬於一個或多個類別模式或分類體系中的一個或者多個類別。為了為一個機構在分類體系中指定類別,客戶端首先使用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 = "jane.doe@TheCoffeeBreak.com";
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的使用方法:

相關文章