使用Integration Developer中的Claim Check模式提高應用程式效率(二)

CloudSpace發表於2010-09-13

Web 服務使用 Simple Object Access Protocol (SOAP) 通過 HTTP 傳遞訊息。一個 SOAP 訊息是一個遵循特定格式的 XML 文件:信封、頭、正文和附件。由於 SOAP 訊息格式包括顯式附件欄位,在本文中,我們將 SOAP 附件看作 “物理附件”,與前面描述的 “邏輯附件” 形成對比。在本節中,我們使用 樣例應用程式 來展示如何應用 Claim Check 模式來處理 SOAP 附件。

我們的示例需要我們建立一個帶附件的 SOAP 訊息。這可以使用 Integration Developer 測試客戶端簡單完成,它支援傳送一個帶附件的 SOAP 訊息來呼叫一個 Web 服務。在 Integration Developer 中,呼叫一個 Web 服務實際上意味著呼叫一個匯出上的 Web 服務繫結。我們在後面將詳細解釋如何使用 Integration Developer 測試客戶端。首先,我們重點介紹使用 Integration Developer 和 Process Server V6.2.0.1 處理 SOAP 附件的 Claim Check 模式解決方案的關鍵方面。兩個主要方面是:

  • 在執行業務邏輯之前將一個 SOAP 附件簽入 Claim Check 資料儲存中。
  • 從 Claim Check 資料儲存中籤出附件並將其重新附著到 SOAP 訊息上。

簽入和簽出 SOAP 附件實際上是對 SOAP 訊息的操作。Process Server 提供 Service Message Object (SMO) APIs,允許使用者操作 SOAP 附件。在 樣例應用程式 中,我們使用兩個中介元件中的這些 APIs,這兩個中介元件是 OrderToShipment 模組中的 ProcessIncomingAttachment 和 ProcessOutgoingAttachment。圖 25 顯示了 OrderToShipment 模組組裝圖中的兩個中介元件。


圖 25. 物理附件的 OrderToShipment 組裝圖
物理附件的 OrderToShipment 組裝圖

ProcessIncomingAttachment 元件負責將一個 SOAP 附件儲存到 Claim Check 資料儲存中,方式是使用 checkInAttachment 包含以下 Java 片段(清單 6)的自定義中介原語。


清單 6. 用於簽入 SOAP 附件的 Java 片段

				
//Get SOAP attachment contents
AttachmentType attachment = (AttachmentType)smo.getAttachments().get(0);
System.out.println("Detaching the attachment and checking it in using 
 the ClaimCheck service as a byte array: " + attachment.getData());

//Locate a BO factory service to create the input data object.
BOFactory boFactory = (BOFactory)ServiceManager.INSTANCE.
	locateService("com/ibm/websphere/bo/BOFactory");

//Now we create a new instance of the ClaimCheck service input data object.
DataObject claimCheckDataobject = boFactory.
	create("http://CommonLibrary", "ClaimCheckObject");
//Attachment is passed in as a byte array so we need to use the method 
//setBytes to set the data.
claimCheckDataobject.setBytes("data", attachment.getData());

ClaimCheckInvoker invoker = 
	new ClaimCheckInvoker("ClaimCheckIntfPartner");
//Invoke checkin method passing the default store as Flat File to store 
//the data on the file system
DataObject returnValue = invoker.checkIn(claimCheckDataobject, "FF");

//extract the file name from the returned object and then store this 
//name as a text string.
DataObject returnToken = ((DataObject)returnValue).
	getDataObject("token");
String fileName = returnToken.getString("claimtoken");

//Attaching the file name of the file containing the attachment 
//content as an attachmnet to the SMO
System.out.println("Attaching the file name containing the attachment 
 contents to the SMO: " + fileName);
attachment.setData(((String)fileName).getBytes()); 
out.fire(smo); 
// propagate the service message object to the primitive that is 
//wired to the 'out' terminal

注意,Claim Check 服務返回的索取令牌儲存在 SOAP 附件之前所在的同一位置,因此稍後可使用該令牌獲取 SOAP 附件。

由於 SOAP 附件的簽入,從 ProcessIncomingAttachment 元件傳出的訊息是一個輕量級訊息,可由另一個元件(比如我們樣例應用程式中的 CreateWSShipment 元件)內的業務邏輯輕鬆使用。不過,除了執行業務功能之外,CreateWSShipment 元件需要做的一件很重要的事是將索取令牌(附件檔名)從傳入的訊息移到傳出的訊息中(圖 26)。不這樣做會阻止下游元件使用索取令牌來獲取 SOAP 附件。


圖 26. CreateWSShipment 內的轉換
CreateWSShipment 內的轉換

完成業務邏輯之後,如果必要,需要簽出 SOAP 附件並將其重新附著到 SOAP 訊息中。在我們的樣例應用程式中,我們假定需要簽出 SOAP 附件,且 ProcessOutgoingAttachment 元件(參見 圖 25)負責使用名為 CheckOutAttachment (清單 7)的一個自定義中介原語簽出附件。


清單 7. 用於簽出 SOAP 附件的 Java 片段

				
AttachmentType attachment = (AttachmentType)smo.getAttachments().get(0);

//Get the file name from the attachment. This file name will be used to 
//check the attachment contents out from the ClaimCheck service
byte[] fileNameBytes = attachment.getData();
String fileName = new String(fileNameBytes);

System.out.println("Using the ClaimCheck file name from the attachment 
 to check the real attachment from the ClaimCheck store: " + fileName);

//In this case the ticket passed to this method is a byte array. 
//So we need to construct the data object to invoke the service. 
BOFactory boFactory = (BOFactory)ServiceManager.INSTANCE.
	locateService("com/ibm/websphere/bo/BOFactory");
//Creating a new input data object.
DataObject ticketBO = boFactory.
	create("http://CommonLibrary", "TicketEnvelope");
//The ticket is the text representing the file name. So we can use this 
//parameter to set the attribute on the input data object for the 
//checkout operation.
ticketBO.set("claimtoken", fileName);
//The sample application uses the Flat file adapter to store the object on 
//the file system.
ticketBO.set("storetype", "FF");

//Checking the attachment out
ClaimCheckInvoker invoker = new 
 ClaimCheckInvoker("ClaimCheckIntfPartner");
//We need to pass the boolean TRUE if we want to clean up the file 
//system from the checked in object.
//If we want to keep the file on the file system, then the boolean 
//FALSE needs to be passed to the checkOut method.
DataObject checkedOut = invoker.checkOut(ticketBO, true);

//Get the attachment in the byte array format from the data object 
//returned by the service. 
byte[] checkedOutAttachmentData = checkedOut.getBytes("data");
            
//Setting the real attachment data back on the SMO.
System.out.println("Setting the checked out real attachment data 
 back on the SMO: " + checkedOutAttachmentData.toString());

attachment.setData(checkedOutAttachmentData); 

out.fire(smo); 
//Propagate the service message object to the primitive 
//that is wired to the 'out' terminal.

當訊息從 ProcessOutgoingAttachment 元件傳出時,它包含 SOAP 附件資料,且可被傳遞給 ShipmentProcessing 模組。

ShipmentProcessing 模組內的處理在本文前面已有介紹。基本上,它的工作就是將其輸入資料物件的內容(特別是附件)寫出到系統輸出上。圖 27 顯示,ShipmentProcessing 模組有一個 Web 服務匯出,使其能由 ProcessOutgoingAttachment 中介元件呼叫。

為讓 ShipmentProcessing 模組寫出其輸入資料物件中的附件內容,對邏輯附件使用 ProcessShipmentComponentStub Java 片段。但是,同樣的 Java 片段不適用於通過 ShippingWSExport 傳入的物理附件。因此,如圖 27 所示插入 CheckAttachment 中介元件,以寫出物理附件內容。


圖 27. ShipmentProcessing 模組的 Web 服務匯出
ShipmentProcessing 模組的 Web 服務匯出

注意,您需要一個 WebSphere Process Server V6.2.0.1 或更高版本的測試環境來執行這部分樣例應用程式。執行和測試樣例應用程式最簡單的方式是,使用 Process Server 測試環境,該環境可隨 Integration Developer 安裝。在執行和測試樣例應用程式之前,您必須首先部署應用程式。

部署:

  1. 選擇 Servers 檢視並右鍵單擊 Process Server 測試環境例項。
  2. 選擇 Add and Remove Project 選單項。在 Add and Remove Projects 對話方塊上,單擊 Add All 按鈕。ClaimCheckApp、OrderProcessingApp、OrderToShipmentApp 和 ShipmentProcessingApp 專案都從 Available projects 列表移到 Configured projects 列表(參見圖 28)。
  3. 單擊 Finish 按鈕。

    圖 28. 模組(專案)部署對話方塊
    模組(專案)部署對話方塊

  4. 要啟動 Process Server 測試環境例項,右鍵單擊測試環境例項並選擇 Start。等待一會兒,您就會在 Server Logs 檢視中看到類似訊息,如圖 29 所示。

    圖 29. 顯示測試環境和所啟動樣例應用程式的伺服器日誌
    顯示測試環境和所啟動樣例應用程式的伺服器日誌

  5. 返回到 Servers 檢視並展開 WebSphere Process Server v6.2 條目,檢視顯示部署的模組(專案)均已啟動(圖 30)。

    圖 30. 模組(專案)啟動
    模組(專案)啟動

  6. 在開始測試之前,確保 FlatFileAdapter 用於讀寫檔案的檔案系統上的目錄存在。前面講過,我們的樣例應用程式將檔案系統作為 Claim Check 資料儲存使用。我們的樣例應用程式需要的目錄是 C:\FlatFilesAny

要測試使用邏輯附件的樣例應用程式:

  1. 開啟 OrderProcessing 模組組裝圖。右鍵單擊 AddLogicalAttachmentToOrder 元件並從上下文選單中選擇 Test Component
  2. 顯示 Integration Developer 測試客戶端之後,可以輸入一些有意義的值到 Initial request parameters 表中(圖 31)。

    圖 31. 指定初始請求引數的測試客戶端
    指定初始請求引數的測試客戶端

    注意,在 “Initial request parameters” 表中有兩個高階節點(圖 32)。一個節點用於 OrderIn 訊息,而另一個用於 productItemIn 訊息。這兩個訊息需要用到,且 AddLogicalAttachmentToOrder 中介元件採用 productItemIn 並使其成為 inputOrder 訊息的一個邏輯附件。AddLogicalAttachmentToOrder 也將其他相關欄位從 OrderIn 複製到 inputOrder。



    圖 32. 初始請求參數列
    初始請求參數列

  3. 要檢視呼叫棧和中介訊息,單擊 Configuration 選項卡將 OrderToShipment 模組新增到測試會話,然後右鍵單擊 Test configuration Default Module Test,選擇 Add,然後選擇 Module,如圖 23 所示。

    圖 33. 將 OrderToShipment 模組附著到測試會話
    將 OrderToShipment 模組附著到測試會話

  4. 新增 OrderToShipment 模組並輸入所有初始請求引數之後,單擊 Continue 按鈕。

檢查和驗證結果

當樣例應用程式完成處理時,您可以看到來自客戶端的所有跟蹤棧和訊息。

如圖 34 所示,左邊高亮顯示的欄是呼叫 checkin 服務之前的呼叫。在右邊,高亮顯示的欄位是邏輯附件的內容。


圖 34. 呼叫 checkin 服務之前的附件內容
呼叫 checkin 服務之前的附件內容

圖 35 顯示呼叫 checkin 服務之後的結果。如圖 35 所示,productItem 被更改為包含儲存附件內容和儲存型別的檔名。如果您想看到檔案系統中的附件內容,就需要使用 ClaimCheckInvoker.checkOut(ticketBO, false),將程式碼更改為在 checkout 服務之後不呼叫 cleanup 服務。當您再次重新執行應用程式時,可以轉至 C:\FlatFilesAny,開啟 ClaimCheckObject.xx.txt 來檢查內容。


圖 35. 呼叫 checkin 服務之後的附件內容
呼叫 checkin 服務之後的附件內容

圖 36 顯示了呼叫 checkout 服務之前的資訊,且產品說明仍然是高亮顯示的檔名。


圖 36. 呼叫 checkout 服務之前的附件內容
呼叫 checkout 服務之前的附件內容

在呼叫 checkout 之後,Integration Test 客戶端不顯示進一步資訊。不過,從 Server Logs 檢視上,您可以看到 “Order shipped” 訊息(圖 37)。記得之前 “Order shipped” 訊息由 ShipmentProcessing 模組中的 ProcessShipmentComponentStub 元件寫到了日誌檔案中。


圖 37. ShipmentProcessing 模組列印的訊息的伺服器日誌
ShipmentProcessing 模組列印的訊息的伺服器日誌

雙擊日誌訊息 ,它就在 Server Logs 檢視中的 “Order shipped” 訊息下面。一個如圖 38 所示的 Properties 對話方塊顯示。對話方塊顯示提供給 ShipmentProcessing 模組的資料。Properties 對話方塊中顯示的實際資料反映您之前輸入的初始請求引數。


圖 38. 提供給 ShipmentProcessing 模組的資料
提供給 ShipmentProcessing 模組的資料

要測試使用 SOAP 附件的樣例應用程式,您需要完成以下幾個步驟:

  1. 如前面所述,部署應用程式並啟動 WebSphere Process Server v6.2 測試環境例項。
  2. 在 Integration Developer 中啟用 SOAP 附件特性。
  3. 在 Integration Developer 中,轉至 Windows > Preferences 調出 Preferences 對話方塊。
  4. 在對話方塊左邊,展開 Business integration 並單擊 Integration Test Client
  5. 選中標為 Enable SOAP attachment feature 的核取方塊(圖 39)。

    圖 39. 啟用用於測試的 SOAP 附件特性
    啟用用於測試的 SOAP 附件特性

開始測試

要開始測試:

  1. 右鍵單擊 OrderToShipment 模組組裝圖中的 PrepareShipmentWS 匯出元件並從上下文選單中選擇 Test Component
  2. 開啟 Integration Test Client 之後,為 Web 服務訊息主體部分的所有可用請求引數輸入值,或匯入樣例應用程式提供的樣例值。
  3. 要手動輸入值,參考圖 40,檢視 Initial request parameters 表中 Web 服務訊息主體的位置

    圖 40. 呼叫 Web 服務端點的 Integration Test Client
    呼叫 Web 服務端點的 Integration Test Client

  4. 除手動輸入值之外,另一種方法就是使用樣例應用程式提供的樣例值。要匯入樣例值,請執行以下操作:
  5. 切換回 Value editorSwitch Editor 對話方塊出現時單擊 Yes。您會看到 Web 服務訊息主體的所有請求引數都填充有值。
  6. 要新增附件,右鍵單擊底部的 attachments 數節點(圖 43)並選擇 Add Elements

    圖 43. 向一個 SOAP 訊息新增附件
    向一個 SOAP 訊息新增附件

  7. Add Elements 對話方塊中,您可以指定要新增的附件數。為方便起見,我們的測試僅使用一個附件。因此只需單擊 OK(預設值為 “1”)。
  8. 接下來,單擊 Type 欄並選擇 text/xml,更改 attachments[0] 條目的型別為 text/xml,如圖 44 所示。

    圖 44. 更改附件型別
    更改附件型別

  9. 最後,指定包含附件內容的 XML 檔案的路徑。對於樣例應用程式,我們在 CommonLibrary 模組中提供了 attachmentData.xml 檔案(圖 45)。

    圖 45. 指定附件內容
    指定附件內容

  10. 在輸入所有值之後,單擊圖 46 所示的 Continue 圖示,開始執行測試元件。

    圖 46. 呼叫測試元件
    呼叫測試元件

檢查和驗證結果

您可以使用 Integration Test Client 捕獲的細粒度跟蹤驗證測試結果。注意,Integration Test Client 僅顯示值編輯器中的業務物件。它 顯示二進位制附件。不過,我們可以在 ClaimCheckerInvoker 服務前後檢查訊息來驗證結果。

如圖 47 所示,在呼叫 checkin 服務之前,附件包含右邊高亮顯示的那些二進位制附件。


圖 47. 呼叫 checkin 服務之前的附件內容
呼叫 checkin 服務之前的附件內容

圖 48 顯示呼叫 checkin 服務的結果。附件僅是一個輕量級檔名。如果您想檢視檔案系統中的附件內容,就需要使用 ClaimCheckInvoker.checkOut(ticketBO, false),將程式碼更改為在 checkout 服務之後不呼叫 cleanup 服務。當您再次重新執行應用程式時,可以轉至 C:\FlatFilesAny,開啟 ClaimCheckObject.xx.txt 來檢查內容。


圖 48. 呼叫 checkin 服務之後的附件內容
呼叫 checkin 服務之後的附件內容

您可以看到,附件內容仍然是呼叫 checkout 服務之前的檔名,如圖 49 所示。


圖 49. 呼叫 checkout 服務之前的附件內容
呼叫 checkout 服務之前的附件內容

圖 50 顯示,在呼叫 checkout 服務之後,附件內容成為原始附件資料。


圖 50. 呼叫 checkout 服務之後的附件內容
呼叫 checkout 服務之後的附件內容

結束語

本文描述了 Claim Check 模式,包括邏輯和物理 SOAP 附件。向您展示了作為 SCA 服務實現的 Claim Check 服務的樣例設計和實現、一個客戶端應用程式設計樣例,以及通過 HTTP 和 Web Service SOAP 通訊渠道使用 XML 的兩個場景。您學習瞭如何使用自定義資料處理程式或自定義中介呼叫 Claim Check 服務,如何使用 Flat File 介面卡儲存和讀取檔案系統上附件的內容。

我們對樣例應用程式進行了一些簡化,重點介紹本文的主題:Claim Check 模式設計和實現。如果您有任何問題或您的某個用例需要建議,請隨時聯絡作者。

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

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

相關文章