close

【安裝 uddi4j】是我在 2006-05-29所記錄的

 

安裝 uddi4j

Install uddi4j Prerequisites (預先安裝套件與軟體)

 

A SOAP transport. Supported transports include:

Apache Axis. (Available from xml.apache.org/axis. Currently supports Axis alpha 3 release).

Apache SOAP 2.2, available from xml.apache.org/soap

HP SOAP, available from http://hp.com/go/webservices

Each transport has additional prerequisites. Consult the SOAP transport documentation for prerequisite information.

JDK version 1.2.2 or later.

Ant is required to build UDDI4J. Ant is available at the Apache ANT website.

 

C:\uddi4j\samples>javac HelloWorldSaveBusiness.java

Note: HelloWorldSaveBusiness.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecation for details.

Note: HelloWorldSaveBusiness.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

 

 

C:\uddi4j\samples>java HelloWorldSaveBusiness

Get AuthenToken

service 'urn:uddi-org:api_v2' unknown

at org.uddi4j.UDDIElement.(UDDIElement.java:40)

at org.uddi4j.response.AuthToken.(AuthToken.java:85)

at org.uddi4j.client.UDDIProxy.get_authToken(UDDIProxy.java:1626)

at HelloWorldSaveBusiness.main(HelloWorldSaveBusiness.java:19)

 

 

C:\uddi4j\samples>java HelloWorldFindBusiness

service 'urn:uddi-org:api_v2' unknown

at org.uddi4j.UDDIElement.(UDDIElement.java:40)

at org.uddi4j.response.BusinessList.(BusinessList.java:85)

at org.uddi4j.client.UDDIProxy.find_business(UDDIProxy.java:676)

at HelloWorldFindBusiness.main(HelloWorldFindBusiness.java:22)

 

 

C:\uddi4j\samples>javac DeleteBusiness.java

Note: DeleteBusiness.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecation for details.

 

 

C:\uddi4j\samples>java DeleteBusiness

service 'urn:uddi-org:api_v2' unknown

at org.uddi4j.UDDIElement.(UDDIElement.java:40)

at org.uddi4j.response.AuthToken.(AuthToken.java:85)

at org.uddi4j.client.UDDIProxy.get_authToken(UDDIProxy.java:1626)

at DeleteBusiness.main(DeleteBusiness.java:15)

 

Some private UDDI Registries

• Microsoft: Windows 2003

• IBM: WebSphere

• BEA: WebLogic (the most widely used )

• Apache: JUDDI (Java Servlet)

• Systinet: Systinet Registry (support UDDI v3.0)

• Novell: Novell Nsure UDDI Server

• Oracle: OracleAS UDDI Registry

• Acumen Technology: AUDDI Standard Edition

 

 

 

新的 Java API(UDDI4J) 已經被修改並擴展為支持 UDDI 版本 2,並增加了一些與新的UDDI 規範無關的一些變化。 


UDDI4J

UDDI4J 基礎知識 
UDDI4J 
可以分為各種包。org.uddi4j.client.UDDIProxy 是用來與 UDDI 註冊中心進行交互的主要的類。它代表將與之進行通信的那個 UDDI 註冊中心的代理。UDDIProxy 提供了很緊密地與 UDDI 規範中定義的 API 進行映射的一些方法。其中的參數通常代表 UDDI 中各種元素的數據對象。
 

很多 API 調用都返回 org.uddi4j.response.DispositionReport 來表明操作的成功或失敗。一些調用將拋出 org.uddi4j.UDDIException 來表明錯誤情況。根據錯誤的不同性質,UDDIException 可能包含 DispositionReport,其中有關於錯誤的更多訊息。
 

UDDI API 
可以分為查詢 API 和發布 API。這些 API 使用不同的 URL。發布 URL 通常使用SSL 來指定 https 位址。在使用 Java 編程語言中的 SSL 時,必須定義 JSSE 提供者,並將其添加到安全性管理器組中。下面的代碼片段使用 Sun  Java 技術 JSSE 包啟用了SSL。您還可以透過修改 jdk/jre/lib/security/java.security 配置文件來添加安全性提供者。
 


System.setProperty("java.protocol.handler.pkgs", 
"com.sun.net.ssl.internal.www.protocol"); 
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 

UDDIProxy 
要求同時指定查詢 URL 和發布 URL。一旦設置之后,在修改這些值前所有的方法調用都使用這些 URL。在使用發布 API 時,需要輸入用戶名和密碼。通常情況下是透過用與所選的註冊中心有關的 Web 站點創建一個帳戶來獲得用戶名和密碼。
 

下面的代碼片段是使用發布 API 的代碼所需的典型的設置步驟: 


// Construct a UDDIProxy object 
UDDIProxy proxy = new UDDIProxy(); 

try { 
// Select the desired UDDI server node 
  proxy.setInquiryURL("inquiryURL"); 
  proxy.setPublishURL("publishURL"); 

// Pass in userid and password registered at the UDDI site 
  AuthToken token = proxy.get_authToken("userid", "password"); 
  ... 

catch (UDDIException e) 

  ... 

}

UDDI4J 的變化 
UDDI 
版本 2 中有很多重要的變化,包括對版本 2 規範中內容的支持,還改進了 UDDI4J 的行為,但這些改進與規範無關。
 

 UDDI 版本 2 特性的支持,包括︰
 
企業關係
 
服務投影
 
增強的查詢
 
國際化功能
 

 

Apache SOAP 項目已經被接下來的 Apache Axis 項目取代了。UDDI4Jv2 的主要貢獻者之一 HP 也提供 SOAP 傳輸。UDDI4Jv2 支持這三種 SOAP 傳輸。Apache SOAP 還是缺省的傳輸。可以透過設置下面的屬性來指定使用其它的傳輸。 

org.uddi4j.TransportClassName=transport_class_name 

被指定的傳輸類名稱可以是下麵包括的傳輸之一,也可以是第三方提供的 SOAP 傳輸。
 

org.uddi4j.transport.ApacheSOAPTransport
(缺省)
 
org.uddi4j.transport.ApacheAxisTransport 
org.uddi4j.transport.HPSOAPTransport 
源自傳輸的通信錯誤將導致 org.uddi4j.transport.TransportException 被拋出。這種異常將包裝可能包含其它詳細訊息的特定于傳輸的異常。
 

調試支持
 
UDDI4J 
增強了記錄進入和發出消息的日誌的能力。這在診斷 UDDI 註冊中心的通信問題時非常有用。輸出是透過設置下面的系統屬性實現的︰
 

org.uddi4j.logEnabled=true 

所有 SOAP 傳輸都支持日誌記錄。HP SOAP 傳輸還有能用于決定日誌到達站的屬性。
 

代理 
代理通常用于穿過防火牆進行通信,使得我們能夠從公司內部網與網際網路進行通信。代理可以透過 HTTP  socks 實現。UDDI4J 現下支持常用的 Java 屬性,以定義 HTTP socks 代理,從而實現穿越防火牆的通信。所需的值倚賴于公司的網路配置,可以從網路管理員處獲得。UDDI4J 處理將一組基本的 http 代理屬性傳送到底層傳輸的任務。它支持的屬性包括︰
 

http.proxyHost ? 
代理伺服器的主機名。 

http.proxyPort ? 
代理伺服器使用的端口,缺省值為 80。 
https.proxyHost ? 
代理伺服器的主機名(如果不同于 http 代理主機)。 
https.proxyPort ? 
代理伺服器使用的 SSL 端口,缺省值為 80。 
http.proxyUserName ? 
如果代理伺服器需要認証,請指定用戶名。 
http.proxyPassword ? 
如果給定了代理用戶名,請指定與其匹配的密碼。 
JDK 
直接支持下面與代理有關的屬性,為了完整起見,我們將連它們一起討論。 


socksProxyHost ? socks 
代理伺服器的主機名。 
socksProxyPort ? socks 
代理伺服器的端口名。 
改進的可用性
 
很多 UDDI4J 類都與 UDDI 模式中定義的元素直接一一對應。在 UDDI4J v1 中,這將產生若干聽起來象集合類,但實際上只是真正集合的容器的類。UDDI4J v2 透過向這些類添加一組集合類方法改進了這些類的可用性。這些方法並沒有增強包含屬性以及集合的更複雜的類的可用性。
 

被添加的方法是︰
 
public void add(KeyedReference) 
public boolean remove(KeyedReference) 
public KeyedReference get(int index) 
public int size() 

可以修改了下面的類別,用以包括這些新的方法︰
 

util.IdentifierBag collection of KeyedReferences 
util.CategoryBag collection of KeyedReferences 
util.DiscoveryURLs collection of DiscoveryURL objects 
util.FindQualifiers collection of FindQualifier objects 
util.TmodelBag collection of Tmodel objects 
response.BusinessInfos collection of BusinessInfo objects 
response.PublisherAssertions collection of PublisherAssertion objects 
response.RelatedBusinessInfos collection of RelatedBusinessInfo objects 
response.ServiceInfos collection of ServiceInfo objects 
response.TmodelInfos collection of TmodelInfo objects 
datatype.binding.BindingTemplates collection of BindingTemplate objects 
datatype.binding.TModelInstanceDetails collection of TmodelInstanceInfo objects 
datatype.business.Contacts collection of Contact objects 
datatype.service.BusinessServices collection of BusinessService objects 

我們還為 KeyedReference 類提供了一個新的構造器,允許提供 KeyedReference 類的全部屬性來構造這個類。
 

public KeyedReference(String keyName, String keyValue, String tModelKey) 
下面的示例說明了如何在使用和不使用新方法的情況下向標識符包添加一個用鍵值標識的引用。
 

使用舊的集合類方法需要下面的代碼︰ 
Vector ibVector = new Vector(); 
KeyedReference kr1 = new KeyedReference("name", "value"); 
kr1.setTModelKey("tmodelKey"); 
ibVector.add(kr1); 
IdentifierBag ib = new IdentifierBag(); 
// The identifierbag is not really a collection, simply a container for a vector 
ib.setKeyedReferenceVector(ibVector); 

如果使用新的集合類方法,上面的代碼就被簡化為︰
 
KeyedReference kr1 = new KeyedReference("name", "value", "tmodelKey"); 
IdentifierBag ib = new IdentifierBag(); 
// New identifierBag method, it now acts like a simple collection class 
ib.add(kr1); 


UDDI



為了處理這些關係,還增加了兩種新的 UDDI 構件︰發布者聲明和服務投影。發布者聲明是由企業的發布者作出的表明兩個企業之間存在關係的聲明。當每個發布者都聲明了同樣的關係之后,就建立了兩個企業之間的關係。當 UDDI 註冊中心收到一個聲明時,它將關係置於未決狀態。當收到來自另一個企業的發布者的匹配的聲明之后,它們就建立了企業關係。共定義了三種類型的關係。父子關係描述分級關聯,如子公司或部門。對等關係代表兩個企業都不被認定為父企業的關聯。等同關係表明兩個企業實體都代表相同的企業,這類似于創建企業的一個別名。
 

一旦兩個企業之間建立了關係,其中一個企業中定義的服務就可以被另一個企業引用。當其中一個企業中出現另一個企業的服務時,這就是所謂的服務投影。公用 UDDI v2 企業註冊中心目前還不支持服務投影。不久以後將增加這種支持。
 

使用發布者聲明
 
UDDI4J 
在實現 API 時嚴格遵循 UDDI 規範。理解 UDDI4J 所需的最好的、唯一的參考就是UDDI 規範本身,您可以從 UDDI 組織站點(請參閱參考資料)獲得它。UDDI 版本 2 規範的附錄 J 中有關於如何使用企業關係的參考資料。
 

下面幾個與企業關係有關的新的 API 已經在 UDDI 版本 2 中得到定義。這些 API UDDI4J 中是作為 UDDIProxy 類上的新方法表現的。 


RelatedBusinessesList find_relatedBusinesses (FindQualifiers findQualifiers, 
String businessKey 
KeyedReference keyedReference); 

DispositionReport add_publisherAssertions (String authInfo, 
PublisherAssertion publisherAssertion); 
DispositionReport add_publisherAssertions (String authInfo,Vector publisherAssertion); 

DispositionReport delete_publisherAssertions (String authInfo, 
PublisherAssertion publisherAssertion); 
DispositionReport delete_publisherAssertions (String authInfo,Vector publisherAssertion); 

AssertionStatusReport get_assertionStatusReport (String authInfo, 
CompletionStatus completionStatus); 
AssertionStatusReport get_assertionStatusReport (String authInfo, 
String completionStatus); 

PublisherAssertions get_publisherAssertions (String authInfo); 

PublisherAssertions set_publisherAssertions (String authInfo,Vector publisherAssertion); 
PublisherAssertions set_publisherAssertions (String authInfo,PublisherAssertion pub); 

下面的示例將說明第一個發布者如何創建發布者聲明。首先要創建一個用鍵值標識的引用來描述要建立的關係。鍵值表明要聲明的關係的類型。定義的值類型為對等、父子或等同類型,它們在 UDDI 數據架構規範中定義。在使用父子類型時,from key 代表父企業,to key 代表子企業。要創建發布者聲明,您需要兩個發布者,每一個發布者都有自己的註冊中心用戶標識。 

// Follows example in v2 spec appendix J 
KeyedReference kr = new KeyedReference("Holding Company", // Key name 
"parent-child", // Key value 
TModel.RELATIONSHIPS_TMODEL_KEY);// Tmodelkey 
PublisherAssertion pa = new PublisherAssertion(bk1, // from key 
bk2, // to key 
kr); // keyed reference 
// Add publisher assertion linking two businesses 
DispositionReport dr = proxy.add_publisherAssertions(token1.getAuthInfoString(),pa); 

當一個發布者添加聲明時,註冊中心將關係置為未決狀態,等待受到影響的企業附應,作出相同的聲明,表明雙方都同意該關係聲明。第二個發布者的回應是添加相同的聲明。一旦雙方都聲明了相同的關係,UDDI 註冊中心將創建它們的企業關係。下面的代碼片段中執行了一個查詢,尋找影響該發布者的未決聲明。來自聲明報告的企業鍵值用來重新創建最初與之匹配的聲明。 

// List available assertions (relationships) 
AssertionStatusReport asr = proxy.get_assertionStatusReport(token2.getAuthInfoString(), 
CompletionStatus.TOKEY_INCOMPLETE); 
Vector v = asr.getAssertionStatusItemVector(); 
for (int i = 0; i < v.size(); i++) { 
AssertionStatusItem asi = (AssertionStatusItem)v.elementAt(i); 
PublisherAssertion pa = new PublisherAssertion(asi.getFromKeyString(), 
asi.getToKeyString(), 
asi.getKeyedReference()); 
DispositionReport dr = proxy.add_publisherAssertions(pa); 


使用服務投影 
請注意,在撰寫本文之時,公用 UDDI 企業註冊中心還不支持服務投影。下面的訊息供您將來參考。
 

在下面的代碼片段中,第二個發布者創建一個服務投影。我們在相關的(第一個)企業上執行查詢,這個企業中包含要投影的服務。代碼將存儲 BusinessService 對象,在之后的save_business() 調用中被用來向第二個企業添加該服務作為投影。 


BusinessDetail bd1 = proxy.get_businessDetail(bk1); 
BusinessEntity be1 = (BusinessEntity)bd1.getBusinessEntityVector().elementAt(0); 
BusinessServices bss1 = be1.getBusinessServices(); 
BusinessService serviceProjection = bss1.get(0); // Desired service 

// Update a business and include the service projection 
BusinessDetail bd2 = proxy.get_businessDetail(bk2); 
BusinessEntity be2 = (BusinessEntity)bd2.getBusinessEntityVector().elementAt(0); 
BusinessServices bs = new BusinessServices(); 
bs.add(serviceProjection); 
be2.setBusinessServices(bs); 
Vector entities = new Vector(); 
entities.addElement(be2); 
proxy.save_business(token2.getAuthInfoString(),entities); 

您可以檢查服務,以確定它們是否為使用下面代碼的投影。在本示例中,您將檢索關於企業實體的訊息,包括其服務的列表。您可以檢查服務,以確定它們是否屬于企業本身還是屬于相關的企業。投影產生的服務會指定被投影的企業(而不是被查詢的企業)的 businesskey(企業鍵值)。 

// How to look at services and see if one is a service projection 
BusinessDetail bd = proxy.get_businessDetail("businessKey"); 
BusinessEntity be = (BusinessEntity)bd.getBusinessEntityVector().elementAt(0);
BusinessServices bss = be.getBusinessServices(); 
for (int i = 0; i < bss.size(); i++) { 
BusinessService bs = bss.get(i); 
String businessKey = bs.getBusinessKey(); 
if (!businessServiceKey.equals(businessKey)) { 
System.out.println("Service " + bs.getName() + " is a projection"); 



國際化 
我們還實現了若干描述性字元串,作為允許使用特定于語言的標識符的對象。UDDI 透過允許用戶指定這些對象的集合來處理國際化,每個對象中有一個值和語言標識符。如果提供的是一個單值,那么語言標識符缺省為創建發布者帳戶時註冊中心決定的語言,通常為英語。語言值是那些允許在 xml:lang 屬性中使用的值,在 RFC 1766 中指定。
 

造成混淆的一個常見原因是錯誤地認為多個值將被連接起來,從而能夠使用更長的字元串。事實並非如此。提供的每個對象都只有唯一的語言。將一個以上的對象指定為相同(或沒有指定)語言標識符是錯誤的做法。UDDI4J 不會驗証這些值。UDDI 註冊中心將產生錯誤。
 

加入了新的 NLS 功能,那就是向 Name 類增加了語言標識符。
 

Name(string, language) 
UDDIProxy 
上的 find_business  find_service 方法現下接受“Name”對象的集合,而不是只接受一個單值。
 

 UDDI 版本 出現就可以使用的 org.uddi4j.datatype.Description 類也有同樣的行為和使用情況。
 

增強的查詢
 
查詢操作得到了鞏固,這樣我們就能夠使用單獨的 find_business() 調用來根據DiscoveryURLsIdentifierBagCategoryBag  TmodelBag 進行搜索,而不必循環進行多個搜索。
 

UDDIProxy 
上的 find_business() 方法的新簽名是︰
 

BusinessList find_business (FindQualifiers findQualifiers, 
Vector names, 
DiscoveryURLs discoveryBag, 
IdentifierBag identifierBag, 
CategoryBag categoryBag, 
TmodelBag tModelBag 
Int maxRows); 

 UDDI v2 規範的文檔所示,還增加了另外的 findQualifier

版本 2 的改變︰企業關係
 
UDDI 
版本 2 為複雜的組織增加了建模支持。企業關係這個概念是 UDDI 版本 2 中影響到UDDI4J 的最大的一個改變。大型組織一直在使用 UDDI,它們碰到過如何表示企業的部門或企業的一部分的問題。通常,每個部門都將創建它們自己的 UDDI 企業實體,然而我們很難建立這樣一種關係,用來表明這些不同企業實際上都是同一個整體企業的一部分。UDDI 版本加入了添加這種關係的能力。UDDI4J 中所反映出的大部分變化的都與這種表達企業之間相互關係的能力有關。
 
 UDDI 版本 2 無關的改進︰
 
包名稱的變化
 
可插的傳輸
 
調試日誌記錄
 
集合類的改進
 
兼容性
 
UDDI 
版本 2 修改了一些已有的消息 API,並改變了所有進入和發出的消息上的版本標識符。結果,UDDI 版本 2 和版本 1 之間出現了不兼容性。UDDI 版本 2 註冊中心能夠接受版本 1 和版本 2 的消息。然而,版本 1 註冊中心卻不能處理版本 2 的消息。
 

UDDI4Jv2 
只生成和處理版本 2 的消息,不支持版本 1 的消息。UDDI4Jv1 可以用來發送和接收版本 1 的消息。您可以在同一個 JVM 中同時使用 UDDI4Jv1  UDDI4Jv2 來與版本或版本 2 的註冊中心進行通信。我們並不期望有很多版本 1 的註冊中心將繼續營運下去,因為大部分註冊中心都將升級以支持版本 2
 

包名稱的變化
 
作為對開放源代碼的進一步承諾,UDDI4J 的包名稱已被從 com.ibm.uddi 改為org.uddi4j。同樣地,還定義了一個新的 Web 站點,http://www.uddi4j.org,以容納發行版和關於該項目訊息。透過郵件列表,您不僅可以得到對常見問題的解答,而且還可以參與UDDI4J 的開發。
 

樣本
 
UDDI4J 
版本 2 提供了一組擴展樣本。它們使用配置器(configurator)類根據屬性文件中提供的訊息建立 SSL 提供者、設置 URL 等等,從而簡化了一些較為常規的設置工作。由於提供註冊中心的是擴展的供應商,有關當前公共註冊中心 URL 的訊息已經從樣本中刪除了。您可以在 http://www.uddi4j.org 站點的“links”主題下找到一個較為常用的註冊中心 URL的列表。
 

配置改進
 
UDDI4J 
版本 2 增加了使用屬性來設置的配置選項。這些屬性可以作為系統屬性來指定,如果需要,還可以在屬性對象中設置它們,並傳送到新構造器的 UDDIProxy。如果同一個 JVM中需要 UDDI4J 的多個副本,這個新的構造器能夠使用一種機製,根據屬性文件配置環境,並允許 UDDI4J 的每個副本按不同的配置營運。使用系統屬性是一種更簡單和更直觀的配置UDDI4J 的方法。
 

可以在代碼中或在命令行設置系統屬性,如下所示︰
 
java -DpropertyName=propertyValue Pluggable transports 

UDDI4Jv2 
增加了對可插傳輸層的支持。UDDI4Jv1 需要使用 Apache SOAP。自從第一次發行之後,出現了更多的 SOAP 實現。
是什麼? 
Web 
服務為分佈式計算提供了一種新的範例。根據存儲在 WSDL 中的描述而動態地調用Web 服務,這種做法很有前景。由於 Web 服務用戶越來越成熟,我們面臨的下一步挑戰將是如何尋找或發現他們可能感興趣的那些服務的存在。因為 Web 服務調用自動化的程度越來越高,所以對我們來說重要的是有一種能夠按計畫實現,而且可以用一種可預知的、可重複的模式來發現 Web 服務的方法。
 

統一描述、發現和集成(Universal DescriptionDiscovery and IntegrationUDDI)就提供了這樣一種機製。UDDI 本身就是作為 Web 服務而定義的,它允許企業以及它們的服務在 UDDI 註冊中心進行註冊。一個已註冊的服務可以包括象 WSDL 這樣的描述性訊息,還可以按照任意多種模式進行分類。對 Web 服務進行分類使您能夠使用複雜的搜索,以便查找最希望得到的服務。
 

UDDI 
被定義為一組能夠從 UDDI 註冊中心發送和接收的 XML 消息。UDDI4J 是用來與UDDI 註冊中心進行交互的客戶機 Java APIUDDI4J 對象和方法用來構建請求消息並將其發送到註冊中心。同樣地,UDDI4J 解釋來自 UDDI 註冊中心的附應消息,並提供一組用來訪問附應消息的對象和方法。
 

發行 UDDI4J 版本 1 是為了配合最初發行的公用 UDDI 企業註冊中心(UDDI Business RegistryUBR)。UDDI 一直在不斷發展,UDDI4J 也隨之不斷發展。UDDI 版本 2 規範幾個月前就可以使用了,隨之可用的還有一些測試版的註冊中心。公用 UDDI 企業註冊中心現下支持 UDDI 規範版本 22001  11 月發行了 UDDI4J 版本 2 的測試版,然後 2002 月發行了非測試版。這個新的 UDDI4J 發行版增加了對規範中新特性的支持,還另外改進了可用性和配置。
 

UDDI4J 
最初是由 IBM  2001  1 月作為一個開放源代碼項目在 developerWorks 上發行的,這鼓勵了其它公司和個人的加入。在版本 2 中,HP 作為 UDDI4J 的發展中一個主要的參加者加入了這一陣營,UDDI 版本 2 中的很多改進都是由它貢獻的。在 IBMHP SAP 的積極支持和認可之下,UDDI4J 已經成為進行 UDDI 交互的缺省 Java API
 

隨著 UDDI 為了滿足日益增長的 Web 服務社區的需求而繼續發展,UDDI4J 將繼續順應這些變化。
 

arrow
arrow
    全站熱搜

    白努力電腦日記 發表在 痞客邦 留言(0) 人氣()