jUDDI,發音(Judy),是服務於WebServices 的UDDI的Java實現開源包。
1 安裝
1.1 下載下載地址:http://ws.apache.org/juddi/releases.Html
目前的jUDDI的最新版本是0.9rc3(Release Candidate #3 for Version 0.9),不過在這個版本中有一些的bug。
juddi0.9版本發布應該是不會久,可以參考下面這段話,是VIEns Stephen(juddi主要開發者之一)在mail list中說的:we've closed 40+ issues since January 1, 2005. We'll be releasing a 0.9rc4 as soon as Axis 1.2 final is released and then releasing a 0.9 final a few weeks after that. (March 22, 2005)
1.2 數據庫安裝UDDI需要有一個地方來存儲注冊的數據,因此首先要選擇一個關系數據庫安裝。JUDDI可以使用任何支持ANSI standard SQL關系數據庫( 例如MySQL, DB2, Sybase, JdataStore等)。本實例使用MySQL。
數據庫安裝完成後,在MySQL數據庫中運行juddi-0.9rc3\sql\mysql\create_database.sql, juddi-0.9rc3\sql\MySQL\insert_publishers.sql。數據庫准備完成。
1.3 安裝juddi及配置首先將juddi-0.9rc3\webapp下的juddi文件夾復制到Tomcat下的webaPPS中,並將 mysql-connector-java-3.1.7\MySQL-connector-Java-3.1.7-bin.jar復制到Tomcat 5.0\webaPPS\juddi\WEB-INF\lib下。
下面就是連接數據庫的配置,在Tomcat/conf/server.XML的Host element中加入:
suffix=".txt" timestamp="true"/>
1.4 本地安裝檢查訪問http://127.0.0.1:8080/juddi/happyjuddi.JSP頁面,此頁面檢查了jUDDI所必須的包和配置的正確性,並測試數據庫連接是否成功。 如果沒有紅色文字,即本地安裝成功,即可進行webservices的發布發現等服務。
2 測試實例
以上安裝成功的是UDDI的服務器端,而進行發布、查找服務的客戶端的應用則要用jUDDI、UDDI4J等包來進行開發。我們可以直接使用jUDDI自 帶的測試代碼來進行客戶端使用的學習。
2.1 使用uddi4j測試使用uddi4j作為客戶端進行測試。
代碼位置:juddi-0.9rc3\src\uddi4j\org\apache\juddi\uddi4j
新建立好一個工程並引入此代碼,然後對代碼進行必要的修改,主要是包名和配置。引入必要的包,比如:junit.jar、 uddi4j.jar、juddi.jar、soap.jar等(因為歐的代碼庫中有很多種代碼,對應很多包,不知道其他哪些是必須的了:)。
接著是數據庫的初始化,需要插入一個可以添加其他Publisher的Publisher,sql 語句: INSERT INTO PUBLISHER (PUBLISHER_ID,PUBLISHER_NAME,ENABLIED,ADMIN) VALUES ('juddi','juddi user','true','true');
調試代碼後,運行TestAll測試,您可能會發現測試FAILURE很多,這些當中有些是測試代碼的錯誤,也有可能是juddi-0.9rc3的缺陷( juddi-0.9rc3不是正式發布版)。
以下列舉一些本測試案例測試失敗的可能出現的修改方法:
2.1.1 加載配置文件時訪問不到samples.prop我的解決辦法是將建立一個新配置文件位置,在工程目錄下的:conf\samples.prop。
在Configurator.load()方法中代碼可以這樣修改:
Properties config = new PropertIEs();
try {
config.load(new Java.io.FileInputStream("./conf/samples.prop"));
}
catch (Exception e) {
System.out.println("Error loading samples property file\n" + e);
}
解決方法很多,您可以自己思索。
2.1.2 TransportClassName配置錯誤如果錯誤提示中有這樣的報告,即可能是此錯誤:
org.XML.sax.SAXParseException: Element or attribute do not match QName production: QName::=(NCName':')?NCName.
在當前測試實例代碼中的默認配置(samples.prop)中,TransportClassName定義成org.uddi4j.transport.apacheSOAPTransport, 而我們使用的包是axis.jar,因此需要修改成相應的類,代碼修改如下:
# -----------------------------------------------------------------------
# Transport classname. Typically defined on commandline as
# -Dorg.uddi4j.TransportClassName=xxx.
# -----------------------------------------------------------------------
#TransportClassName=org.uddi4j.transport.apacheSOAPTransport
TransportClassName=org.uddi4j.transport.apacheAxisTransport
# TransportClassName=org.uddi4j.transport.HPSOAPTransport
2.1.3 TestFindBusiness案例不通過TestFindBusiness中有大小寫匹配測試,但是在juddi-0.9rc3中的大小寫匹配(caseSensitiveMatch)有bug,因此可以將大小寫匹配的測 試案例注釋掉。
2.1.4 PublisherManager的代碼錯誤在測試Test_save_tModel的時候_testAuthTokenExpired()中,我們測試過期驗證時,在錯誤匹配的時候,會出現測試失敗,如果捕捉這個 匹配的結果,你會發現,出錯的類型是E_authTokenRequired而不是期待的E_authTokenExpired。
這是因為在我們所獲得的AuthToken是空的,在根源就是在PublisherManager. getExpiredAuthToken(String, String)方法中,代碼:
RegistryProxy proxy = new RegistryProxy();
proxy的實例的配置是空的。因此,我們修改這個方法變成:
/**
* changed by xio
* @param publisher String
* @param passWord String
* @param testprops PropertIEs:增加的參數,傳入基本配置
* @return String
*/
public static String getExpiredAuthToken(String publisher, String passWord,
PropertIEs testprops) {
Properties props = new PropertIEs();
props.setProperty(RegistryProxy.ADMIN_ENDPOINT_PROPERTY_NAME,
testprops.getProperty("adminURL"));
props.setProperty(RegistryProxy.INQUIRY_ENDPOINT_PROPERTY_NAME,
testprops.getProperty("inquiryURL"));
props.setProperty(RegistryProxy.PUBLISH_ENDPOINT_PROPERTY_NAME,
testprops.getProperty("publishURL"));
RegistryProxy proxy = new RegistryProxy(props);
AuthToken token = null;
AuthInfo authInfo = null;
String ret = null;
try {
token = proxy.getAuthToken(publisher, passWord);
authInfo = token.getAuthInfo();
ret = authInfo.getValue();
System.out.println("getExpiredAuthToken:" + authInfo);
proxy.discardAuthToken(authInfo);
}
catch (Exception ex) {
ex.printStackTrace();
}
return ret;
}
2.2 使用jUDDI測試在juddi-0.9rc3版本中自帶的代碼中沒有客戶端的使用實例,雖然附帶了整個項目代碼的測試代碼,但是估計沒什麼人喜歡從這裡抽取學 習客戶端使用的學習。
當然,學習的實例還是有的,在cvs當前的工程代碼中,有個samples的文件夾,這部分代碼便是一個十分齊全的實例(有幾個類沒完成, 但不影響:)。
Cvs服務器數據:http://ws.apache.org/juddi/cvs.Html
Wincvs的使用請網上下載閱讀。
其他:在進行代碼學習的同時,建議閱讀webservices相關資料文檔。強烈建議閱讀:理解 UDDI 注冊中心的 WSDL 系列 (http://www-900.ibm.com/developerWorks/cn/webservices/ws-uwsdl/part1/)
參考資料:
http://wiki.apache.org/ws/jUDDI_HOW-TOs
http://ws.apache.org/juddi/lists.Html