WebSphere Service Registry and Repository 外掛的功能及使用

CloudSpace發表於2010-07-30
杜 冰冰, 軟體工程師, IBM
劉 力, 高階軟體工程師, IBM 中國開發試驗室  

簡介: 這是介紹 IBM WebSphere Service Registry and Repository 主要概念和功能的系列中的第 7 篇文章。前幾篇文章介紹了業務模型、訪問控制及 API 使用等相關內容。本文詳細介紹了 WSRR 外掛的功能以及使用方法,包括 :Validation(驗證)外掛,Modification(修改)外掛,Notification(通知)外掛和 WSDL parser extension WSDL 解析擴充套件)外掛。

引言

在 WebSphere Service Registry and Repository(以下稱為 WSRR)中,通過使用外掛可以實現使用者自定義的功能,以便滿足實際的需求。此自定義的功能可以根據使用者的要求執行資料或流程的驗證、修改、通知等操作。WSRR 提供了四種型別的外掛:驗證、修改、通知和 WSDL 解析擴充套件。這四種型別的外掛分別在不同的階段起作用,如:驗證外掛是在建立、更新或刪除 WSRR 物件之前呼叫的;修改外掛是在建立、更新或刪除 WSRR 物件過程中呼叫的;通知外掛是在建立、更新或刪除 WSRR 物件之後呼叫的;WSDL 擴充套件元素解析外掛是在處理 WSDL 時呼叫的。將外掛本身的功能和呼叫階段結合使用,可以完成更多的功能,使 WSRR 的使用更加靈活和方便。

在本文中,您將學習如何在 WSRR 中實現並使用這 4 種外掛。

JK 是一家向境內外投資機構提供服務的證券公司,隨著業務的增長以及公司規模的不斷擴大,公司採用 WSRR 作為其服務管理平臺,統一管理公司所有的服務。在服務的管理過程中,公司希望執行一些特定的 IT 規則,確保服務遵守適當的業務規則,以提高服務的質量及管理的水平。

JK 公司為了對服務進行有效的管理,明確劃分服務的責任人,希望服務的描述檔案 (WSDL) 必須有所屬部門的資訊。

為了實現此功能,我們將實現一個 Validation ( 驗證 ) 外掛以保證每個 WSDL 檔案都有一個部門屬性。我們將服務描述檔案 (WSDL) 儲存在 WSRR 中。當服務發生狀態轉換時,外掛將驗證檔案是否有該屬性。如果該文件新增了該屬性,則驗證通過,可以發生該轉換。否則,驗證不通過,該服務不能發生狀態轉換。

在 WSRR V6.2 中,驗證外掛有兩種,分別是普通驗證外掛和控制驗證外掛。普通驗證外掛必須實現 ServiceRegsitryValidator 介面,控制驗證外掛必須實現 ServiceRegistryGovernanceValidator 或 ServiceRegistryGovernanceValidator2 介面。控制驗證外掛是將 WSRR 物件從一種生命週期狀態轉換為另一種生命週期狀態之前或顯式地請求驗證控制物件時呼叫的。本文中的場景使用的是 ServiceRegistryGovernanceValidator 介面,在 transition 方法中判斷當前 WSDL 檔案是否具有部門資訊的屬性。

 

流程概述

為了實現外掛,我們需要完成以下步驟:

步驟 1:建立外掛應用程式。對於 WSRR 裡的外掛,預設情況下,對所有的 WSRR 物件都起作用,由於本例驗證 WSDL 檔案是否有部門資訊屬性,所以我們只要處理 WSDLDocument 物件,看它在由狀態 Plan 變遷(轉換)到下一個狀態的時候是否具有部門資訊屬性就可以了。示例程式碼如清單 1 所示:


清單 1. 驗證外掛程式碼片斷

				 
 public class MyValidation implements ServiceRegistryGovernanceValidator{ 

// 實現控制外掛的介面,transition 方法有兩個引數,arg0 為狀態的 uri,arg1 為 WSRR 內的物件型別

 public ServiceRegistryStatus transition(String arg0, OriginalObject arg1) { 

初始化狀態資訊,設定返回碼為成功

 ServiceRegistryStatus status = new ServiceRegistryStatus(); 
 status.setReturnCode(ServiceRegistryStatus.SUCCESS); 

// 由於外掛是在 Plan 狀態下發生的轉換,所以,我們只要處理當前狀態為 Plan 的物件,對於不處於該狀態的物件,我們直接返回

if(!arg0.equals
("http://www.ibm.com/xmlns/prod/serviceregistry/6/0/governance/DefaultLifecycle#Plan")) 
 return status; 

// 由於我們是對 WSDL 檔案進行判斷,所以我們只處理型別為 WSDLDocument 的物件

 if (arg1 instanceof WSDLDocument) { 

// 狀態為 Plan, 型別為 WSDLDocument 的物件,就是我們需要驗證的物件

 String departmentName; 
 try { 

// 得到部門資訊屬性

 departmentName = BSRSDOHelper.INSTANCE.getPropertyValue(arg1, 
"department"); 

// 判斷部門是否為開發部,如果是則通過驗證,否則驗證失敗

 if (departmentName.equals("development")) { 
 return status; 
 } 
 } catch (ServiceRegistryInvalidPropertyException e) { 
 e.printStackTrace(); 
 } 
 } 
 status.setReturnCode(ServiceRegistryStatus.ERROR); 
 return status; 
 } 

步驟 2:安裝驗證外掛。

在 WSRR V62 中,外掛的安裝十分方便。只需要將步驟 1 中的 java 檔案打包成 jar 檔案,並部署到 WSRR 中即可。


圖 1. 安裝驗證外掛
圖 1. 安裝驗證外掛

步驟 3:啟動驗證外掛。

啟動外掛的步驟也比較簡單,只需在配置檔案裡新增外掛的類名即可。如圖 3 所示,在 governanceValidators 後,新增了外掛的類名 sample.MyValidation。


圖 2. 驗證外掛配置項
圖 2. 驗證外掛配置項

圖 3. 啟動驗證外掛
圖 3. 啟動驗證外掛

步驟 4:匯入 WSDL 檔案。

在 WSRR 中,建立 WSDL 檔案。


圖 4. 匯入 StockQuoteServiceSample.wsdl
圖 4. 匯入 StockQuoteServiceSample.wsdl

步驟 5:執行狀態轉換。

開發人員將該服務的狀態改為 Plan, 表示該服務正在被開發中。


圖 5. 執行 Plan 的狀態轉換
圖 5. 執行 Plan 的狀態轉換

步驟 6:轉換結果。

從圖 6 可以看出,上面的轉換並未成功,因為該 WSDL 並沒有部門資訊屬性。


圖 6. 轉換結果
圖 6. 轉換結果

步驟 7: 新增部門屬性。

為該 WSDL 新增部門資訊屬性,如圖 7,部門名稱是開發部 (development)。


圖 7. 新增部門屬性
圖 7. 新增部門屬性

步驟 8:執行轉換。

開發人員將該服務的狀態改為 Plan, 表示該服務正在被開發中。


圖 8. 執行轉換
圖 8. 執行轉換

步驟 9:轉換結果。

由於該 WSDL 已經具有了部門資訊屬性,轉換成功。


圖 9. 轉換結果
圖 9. 轉換結果

由於服務數量的龐大,JK 公司為了規範服務,提高服務的查詢效率,希望將服務的描述檔案 (WSDL) 分類,同時希望在服務建立的過程中可以自動的新增分類資訊,方便將來使用。

為了實現此功能,我們將實現一個 Modification ( 修改 ) 外掛。在 WSDL 建立的時候為它新增一個分類。分類資訊儲存在配置檔案中,以便可以在不修改外掛的情況下,改變分類的名稱。我們將配置檔案儲存在 WSRR 中,當 WSDL 檔案建立的時候,外掛讀取配置檔案中的分類名稱,然後將分類資訊新增到該 WSDL 檔案上。在 WSRR V6.2 中,修改外掛有兩種,分別是普通修改外掛和控制修改外掛。普通修改外掛必須實現 ServiceRegsitryModifier 介面,控制驗證外掛必須實現 ServiceRegistryGovernanceModifier 介面,用於修改 WSRR 中被治理的物件。本文中的場景使用的是 ServiceRegsitryModifier 介面,在 create 方法中給該檔案新增分類資訊。

為了實現外掛,我們需要完成以下步驟:

步驟 1:建立外掛應用程式。修改外掛的 create 方法在物件被建立到 WSRR 前被呼叫,本例中我們需要在外掛中得到 WSDLDocument 物件,然後將分類資訊新增到該物件,最後該物件被建立後就自然的被分類。如果想改變物件的分類,則實現 update 方法即可。 示例程式碼如清單 2 所示:


清單 2. 修改外掛程式碼片斷

				 
 public class MyModification implements ServiceRegistryModifier{ 

// 實現修改外掛的介面,create 方法有 1 個引數,arg0 為 WSRR 內的物件型別

 public ServiceRegistryStatus create(OriginalObject arg0) { 

// 初始化狀態資訊,設定返回碼為成功

 ServiceRegistryStatus status = new ServiceRegistryStatus(); 
 status.setReturnCode(ServiceRegistryStatus.SUCCESS); 

// 由於我們是對 WSDL 檔案進行判斷,所以我們只處理型別為 WSDLDocument 的物件

 if(arg0 instanceof WSDLDocument){ 
 WSDLDocument document = (WSDLDocument)arg0; 
 Util util = new Util(); 

// 從配置檔案中得到分類名稱

 String uri = util.getClassificationName(); 

// 給 document 新增分類資訊

 document.getClassificationURIs().add(uri); 
 try { 
 ServiceRegistrySession serviceRegistry = util.getServiceRegistrySession(); 
 serviceRegistry.update(document); 
 } catch (Exception e) { 
 e.printStackTrace(); 
 } 
 return status; 
 } 
 return status; 
 } 

步驟 2:安裝修改外掛。具體步驟參考圖 1。

步驟 3:啟動修改外掛,如圖 10,圖 11 所示。


圖 10. 修改外掛配置項
圖 10. 修改外掛配置項

圖 11. 啟動修改外掛
圖 11. 啟動修改外掛

步驟 4:匯入配置檔案。

WSRR 提供了儲存使用者配置檔案的功能。利用該功能,我們可以將外掛的配置檔案儲存在 WSRR 中。


圖 12. 匯入配置檔案
圖 12. 匯入配置檔案

步驟 5:修改配置檔案。

本文中的配置檔案只有一個配置項,指定了分類的名稱。如圖 13 所示。


圖 13. 修改配置檔案
圖 13. 修改配置檔案

步驟 6:匯入 WSDL 檔案。

該步驟如圖 4 所示。

步驟 7:實驗結果。

從圖 14 可以看出,WSDL 已經處於我們指定的分類中。


圖 14. 實驗結果
圖 14. 實驗結果

JK 公司為了更加嚴格地管理服務,希望服務的任何修改都被紀錄到一個文字檔案中,以便於日後的錯誤跟蹤。

為了實現此功能,我們將實現一個 Notification ( 通知 ) 外掛。當 WSDL 檔案變更完成以後,外掛將變更發生的時間以及檔案的名稱紀錄在一個叫做 nodificationRecord.txt 的檔案中,該檔案位於 WAS 的臨時目錄中。在 WSRR V6.2 中,通知外掛有兩種,分別是普通通知外掛和控制通知外掛。普通通知外掛必須實現 ServiceRegistryNotifier 介面,控制通知外掛必須實現 ServiceRegistryGovernanceNotifier或ServiceRegistryGovernanceNotifier2 介面。控制通知外掛作用於 WSRR 中被治理的物件。本文中的場景使用的是 ServiceRegistryNotifier 介面,在 update 方法中實現將 WSDL 的名稱及更新時間資訊儲存在文字檔案中。

為了實現外掛,我們需要完成以下步驟:

步驟 1:建立外掛應用程式。通知外掛是在物件發生更新之後呼叫,當 WSRR 中的 WSDL 檔案發生變更後,通知外掛被呼叫,將變更的時間以及檔案的名字紀錄在我們自定義的日誌檔案中。 示例程式碼如清單 3 所示:


清單 3. 通知外掛程式碼片斷

				 
public class MyNotification implements ServiceRegistryGovernanceNotifier{ 

// 實現通知外掛的介面,update 方法有四個引數,arg0,arg1 為 WSRR 內的物件型別 ,arg0 為修改前的物件,arg1 為修改後的物件,arg2 為此次操作的結果,預設為 success,arg3 為丟擲的異常

public void update(BaseObject arg0, 
 BaseObject arg1, boolean arg2, ServiceRegistryException arg3){ 

// 由於我們是對 WSDL 檔案進行判斷,所以我們只處理型別為 WSDLDocument 的物件

 if(arg0 instanceof WSDLDocument){ 
 String name = arg0.getName(); 

// 得到 WAS 的臨時路徑

 String wasTemp = System.getProperty("was.repository.temp"); 

// 生成日誌檔案

 File file = new File(wasTemp + "/updateRecord.txt"); 
 try { 
 if (!file.exists()) { 
 file.createNewFile(); 
 } 

// 將檔案的更新時間及檔名寫進日誌

 BufferedReader input = new BufferedReader(new FileReader(file)); 
 String s = new String(); 
 String s1 = new String(); 
 while ((s = input.readLine()) != null) { 
 s1 += s+"\r\n"; 
 } 
 input.close(); 
 Date date = new Date(System.currentTimeMillis()); 
 s1 += "The document "+name+" is updated at: " + date + "\r\n"; 
 BufferedWriter utput = new BufferedWriter(new FileWriter(file)); 
 output.write(s1); 
 output.close(); 
 } catch (IOException e) { 
 e.printStackTrace(); 
 } 
 } 
 } 

步驟 2:安裝通知外掛。具體步驟參考圖 1。

步驟 3:啟動通知外掛,具體步驟參考圖 15,圖 16。


圖 15. 通知外掛配置項
圖 15. 通知外掛配置項

圖 16. 啟動通知外掛
圖 16. 啟動通知外掛

步驟 4:匯入 WSDL 檔案。

該步驟可參考圖 4。

步驟 5:修改 WSDL 檔案的屬性值。

修改 WSDL 的屬性 dd 的值。其中,dd 為作者新增的屬性。


圖 17. 修改 WSDL 檔案的屬性值
圖 17. 修改 WSDL 檔案的屬性值

步驟 6:實驗結果。

如圖 18 所示,在 WAS 的臨時目錄裡生成了 updateRecord.txt 的文字檔案。該檔案的內容為檔案的名稱以及修改時間。

說明,本文為了說明通知外掛的作用,將檔案儲存在 WAS 的臨時目錄中。在實際中,不推薦將檔案儲存在該目錄。


圖 18. 實驗結果
圖 18. 實驗結果

對於帶有擴充套件元素的 WSDL 檔案 , JK 公司希望在服務建立的過程中可以新增詳細的關於服務擴充套件元素的資訊,以便將來使用方便。

為了實現此功能,我們將實現一個 WSDL parser extension plug-in (WSDL 解析擴充套件 ) 外掛。在 WSDL 建立的時候為擴充套件元素新增一個 extensionDescription 屬性,記錄該擴充套件元素的詳細資訊。在 WSRR V6.2 中,WSDL 解析擴充套件外掛必須實現 ServiceRegistryParserExtension 介面。

為了實現外掛,我們需要完成以下步驟:

步驟 1:建立外掛應用程式。 WSDL 擴充套件元素解析外掛是在處理 WSDL 時呼叫的,當擴充套件元素的 WSDL 的名稱空間與註冊的名稱空間匹配時,該外掛被呼叫。示例程式碼如清單 4 所示:


清單 4. WSDL 解析擴充套件外掛程式碼片斷

				 
 public class WSDLExtension implements ServiceRegistryParserExtension{ 

// 實現 WSDL 解析擴充套件外掛的介面,parseElement 方法有兩個引數,arg0 為 WSRR 內的可擴充套件的物件 ,arg1 為 DOM 中的擴充套件元素

 public boolean parseElement(ExtensionLogicalObject arg0, Element arg1) { 

// 得到名稱空間

 String ns = arg0.getNamespace(); 
 System.out.println("ns:"+ns); 

// 我們只處理和註冊的名稱空間匹配的名稱空間 if(ns.equals("http://tonawanda.sr.ibm.com/StockQuoteServiceSample")){

 String description = "The extension is used for MQ!"; 

// 新增擴充套件資訊

 try { 
 BSRSDOHelper.INSTANCE.addProperty(arg0, "extensionDescription", description); 
 } catch (ServiceRegistryInvalidPropertyException e) { 
 e.printStackTrace(); 
 } 
 try { 
 Util util = new Util(); 
 ServiceRegistrySession serviceRegistry = util.getServiceRegistrySession(); 
 serviceRegistry.update(arg0); 
 } catch (Exception e) { 
 e.printStackTrace(); 
 } 
 } 
 return true; 
 } 

步驟 2:安裝 WSDL 擴充套件解析外掛。具體步驟參考圖 1。

步驟 3:啟動 WSDL 擴充套件解析外掛。


圖 19. WSDL 擴充套件解析外掛配置項
圖 19. WSDL 擴充套件解析外掛配置項

圖 20. 啟動 WSDL 擴充套件解析外掛
圖 20. 啟動 WSDL 擴充套件解析外掛

步驟 4:匯入 WSDL 檔案。

該步驟參考圖 4。

步驟 5:試驗結果。

如圖 21 所示,擴充套件元素 RMStockQuotePort 新增了 extensionDescription 屬性,該屬性說明該擴充套件用於 MQ。


圖 21. 實驗結果
圖 21. 實驗結果

 

總結

本文詳細介紹了 WSRR 4 種外掛的功能以及如何實現和部署這些外掛,包括 Validation (驗證)外掛,Modification(修改)外掛,Notification(通知)外掛和 WSDL parser extension (WSDL 解析擴充套件)外掛。完成本文中的練習之後,您現在可以開發一個外掛,將其部署到 WSRR 中,熟練的使用這些外掛可以達到很好的自定義的效果。

原文連結:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1007_dubb_wsrrplugin/1007_dubb_wsrrplugin.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-669852/,如需轉載,請註明出處,否則將追究法律責任。

相關文章