開始之前
WebSphere Adapters 能連接到很多使用 Service Component Architecture (SCA) 編程模型的 Enterprise Information Systems (EIS)。 本教程將幫助您使用 WebSphere Adapters 和 WebSphere Process Server 關系服務來創建一個模型,同步化 EIS 中的數據,而無需保存所有 ID。
目標
WebSphere Process Server (下文稱為 Process Server) 支持一項有用的特性,可生成托管 ID,以維持關系。
本教程中,您將學習:
在 SAP® 和 Siebel® 中創建記錄,在這兩個系統中生成惟一的 ID。
調用關系服務,生成與這兩個 ID 關聯的托管 ID。
查找對應的 Siebel 記錄並使用關系服務自動更新(接下來更新 SAP 記錄)。
以同樣方式實現 DELETE 和 RETRIEVE 操作。
先決條件
您需要熟悉 WebSphere Resource Adapters for SAP and Siebel、WebSphere Integration Developer 以及 WebSphere Process Server。
系統需求
需要安裝如下軟件來配置和部署模塊:
WebSphere Integration Developer V7.0。
WebSphere Process Server V7.0。
參考 Quick Ststartcenario,創建 WebSphere Adapter for SAP 和 WebSphere Adapter for Siebel 模塊。
學習時間
5 小時
業務用例
首先將了解一個用例場景,然後是使用 WebSphere Process Server 的用例。
假設這樣一個場景,XYZ 公司使用 SAP 來存儲工資信息,使用 Siebel 來處理人力資源 (HR) 數據。工資系統裡的每一條記錄都對應人力資源系統的一條惟一記錄。當 SAP 工資系統進行創建、更新或刪除操作時,HR 系統中也進行相應操作。每個系統的輸入都可用通用接口分別提供。
SAP 和 Siebel 系統有各自的 ID 管理系統,需要使用一個單獨的邏輯 ID 來映射系統,該邏輯 ID 用於更新和刪除操作,從而避免手工輸入所有托管系統的 ID。
為了集成各種 EIS,可以使用 WebSphere Adapters。邏輯映射各系統的惟一 ID 的工作可使用 WebSphere Process Server 的關系服務完成。
WebSphere Adapters 介紹
WebSphere Adapters 能夠連接很多 Enterprise Information Systems。這些適配器遵循 Java2EE Connector Architecture (JCA) 規范 V1.5,並提供 J2EE/SCA 應用程序與 EIS 之間的雙向連接。
與適配器打包在一起的還有支持工具,可用於創建和使用服務。Rational® Application Developer、WebSphere Integration Developer 和 WebSphere Message Broker Toolkit 都支持該改適配器。
SCA 編程范式與 WebSphere Adapter 一起使用。適配器是元數據驅動的,從這個意義上講,它是通用且可擴展的。因此,他們可以適應現有數據結構的變化,並允許添加新對象而無需改變適配器實現。
WebSphere Adapter 產品套裝可連接很多 EIS。通常,WebSphere Adapters 分為兩類 – 技術適配器和應用程序適配器。技術適配器 允許連接技術,如電子郵件、文件系統、FTP、JDBC 等等。應用程序適配器 允許連接到打包應用程序,如 SAP Software、Oracle® Apps E-Biz 套裝等。
使用 WebSphere Adapters,可以輕松連接所有 EIS,從中檢索數據、更新其中數據。使用 WebSphere Adapter for FlatFile 和 WebSphere Adapter for JDBC Software,可以輕松連接到文件系統和後台數據庫應用程序。
介紹關系服務
WebSphere Process Server 的關系服務能夠讓 WebSphere Integration Developer 將一組相關業務對象 (BO) 中值不同但語義一致的屬性關聯起來。有兩種主要的關系類型:動態和靜態。可以使用動態 關系將一組相關的業務對象的主鍵關聯起來,用靜態 關系將非主鍵屬性關聯。本教程將重點介紹靜態 關系,後續文章將會介紹動態關系。
使用 WebSphere Adapters 和關系服務的解決方案建議
以下是完成任務所需的高級步驟和邏輯過程:
創建基於 SAP 的 SCA 模塊(外部綁定)。
創建基於 Siebel 的 SCA 模塊(外部綁定)。
創建通用接口,用於對 SAP 和 Siebel 適配器實現的虛擬調用。
創建靜態關系,映射 SAP 和 Siebel 系統中的 ID。
創建關系角色。
使用自定義代碼創建關系表中的初始條目。
測試解決方案。
創建基於 SAP 的 SCA 模塊
將使用 WebSphere Integration Developer V7.0 來創建 SCA 模塊並將其公開,供外部使用。
按照 Business Process Management 示例頁 的指示來創建:
使用 WebSphere Adapter for SAP Software 創建一個外部綁定模塊,使用 BAPI 接口對客戶記錄進行操作(創建、更新和檢索)。在發現的服務中選擇以下 BAPI:
CREATE – BAPI_CUSTOMER_CREATEFROMDATA1
UPDATE – BAPI_CUSTOMER_CHANGEFROMDATA
RETRIEVE – BAPI_CUSTOMER_GETDETAIL
DELETE – BAPI_CUSTOMER_DELETE
參考 WebSphere Adapter for SAP Software 的 QSS Guide 中的 “Tutorial 1”。
完成之後,將看到如圖 1 的裝配圖。
圖 1. 創建 SAP SCA 模塊
創建基於 Siebel 的 SCA 模塊
使用 WebSphere Adapter for Siebel 創建一個外部綁定模塊,使用 Siebel BO (Contact) 對象 對用戶記錄進行操作(創建、更新和檢索)。參考 WebSphere Adapter for Siebel 商務應用程序的 QSS Guide 中的 “Tutorial 3” 。
以上步驟完成後,將看到如圖 2 所示的裝配圖。
圖 2.創建 Siebel SCA 模塊
創建抽象調用的通用接口
既然已經創建了所需的 SCA 模塊,那麼現在需要用通用接口將其公開。需要創建一個接口以及通用輸入數據類型來滿足外部綁定要求。SAP 和 Siebel 的數據可以通過通用 BO 填充到對應字段中。
創建通用 BO 數據對象
右鍵單擊 Data Types 並選擇 New > Business Object,如圖 3 所示。
圖 3. 創建新的業務對象
在 Name 字段輸入 GenericBO,其他地方使用默認值,如圖 4 所示。
圖 4. 創建通用業務對象
創建兩個屬性,siebelBO 和 sapBO:
siebelBO 是 BOContactBCContact 類型的,如圖 5 所示(引用 Siebel 外部綁定接口的頂級業務對象名)。
sapBO 是 SapCustomerWrapper 類型的,如圖 5 所示 (引用 SAP 外部綁定接口的封裝業務對象名)。
圖 5. 通用業務對象
為了能更容易調用組件,創建一個通用接口,並在實現前將其添加到 AdapterInterface Java™ 組件。
將接口命名為 GenericInterface 並添加以下方法:createRecords、updateRecords 和 retrieveRecords。
添加 GenericBOBG 作為所有操作的輸入和輸出類型,如圖 6 所示。
圖 6. 創建通用接口
將一個 Java 組件拖放到裝配圖,並向其添加通用接口,如圖 7 所示。
圖 7. 向 Java 組件添加接口
裝配圖如圖 8 所示。
圖 8. 完成裝配圖
創建靜態關系來映射 SAP 和 Siebel 的 ID
接下來將使用關系服務(靜態)來映射 SAP 和 Siebel 的 ID。
通過右鍵單擊 Transformations > New > Relationship 在 Services 模塊中創建新的關系,如圖 9 所示。
圖 9. 創建新關系
在 Name 字段中輸入 SAPSiebel,如圖 10 所示。
圖 10. SAPSiebel 關系
選擇 Static Relationship 單選按鈕,並點擊 Next,如圖 11 所示。
圖 11. 創建靜態關系
ID 是惟一的,而且每個 SAP 系統中的 ID 惟一映射 Siebel 系統中的 ID。選擇 Identity Relationship 單選按鈕,並單擊 Finish,如圖 12 所示。
圖 12. 選擇關系類型
屏幕將會如圖 13 所示。
圖 13. SAPSiebel 關系已創建
創建關系角色
現在需要為關系添加角色,並定義主鍵。單擊 Add Role 按鈕,並添加兩個角色,一個是 SAP 的,另一個是 Siebel 的。使用 SapCustomerWrapper(引用 SAP 接口文件)和 BOContactBCContact(引用 Siebel 接口文件)。這時屏幕如圖 14 所示。
圖 14. 創建角色
定義每個角色的主鍵:Id 是 Siebel BO 的,SapBapiCustomerCreatefromdata1/NewCustomerNumber 是 SAP BO 的,分別如圖 15 和圖 16 所示。
圖 15. Siebel BO 的主鍵
圖 16. SAP BO 的主鍵
添加鍵屬性之後,關系視圖如圖 17 所示。
圖 17. 具有指定角色和主鍵的 SAPSiebel 關系
使用自定義代碼創建關系表中的初始條目
實現 Java 組件。向 createRecords 方法添加以下實現,如清單 1 所示。
清單 1. createRecords 方法的實現
public DataObject createRecords(DataObject input1) {
DataObject siebelBG = boFactory.create("http://www.ibm.com/xmlns/prod/wbi/
j2ca/siebel/bocontactbccontactbg", "BOContactBCContactBG");
DataObject genericBO = input1.getDataObject("GenericBO");
DataObject siebelBO = genericBO.getDataObject("siebelBO"); // BOContactBCContact
DataObject sapBO = genericBO.getDataObject("sapBO"); // SapCustomerWrapper
siebelBG.setString("verb", "Create");
siebelBG.setDataObject("BOContactBCContact", siebelBO);
// Create a Siebel Customer
DataObject siebelResponse = ((DataObject) siebelService.invoke
("createBOContactBCContact", siebelBG)).getDataObject
("createBOContactBCContactOutput");
genericBO.setDataObject("siebelBO", siebelResponse);
String siebelID = siebelResponse.getDataObject
("BOContactBCContact").getString("Id");
在 createRecords 方法中,使用 GenericBO(siebelBO 字段)中的 Siebel 內容,通過使用標准 SCA 服務調用來調用 Siebel 接口中的 createBOContactBCContact 方法。響應中的 ID 保存在 siebelID 字符串字段。
按照以上第 2 步中的步驟調用 SAP 接口中的 Create 方法(清單 2)。
清單 2. 調用 SAP 接口的 createRecords 方法
// Create an SAP Customer
DataObject sapResponse = ((DataObject) sapService.invoke
("createSapCustomerWrapper", sapBO)).getDataObject
("createSapCustomerWrapperOutput");
genericBO.setDataObject("sapBO", sapResponse);
String sapID = sapResponse.getDataObject("SapBapiCustomerCreatefromdata1").
getString("NewCustomerNumber");
SAP 惟一的 ID 保存在 sapID 字符串字段中。
現在,調用關系服務來創建關系表中的邏輯 ID。genID 字符串字段就是該邏輯 ID。
您一定還記得,剛開始已使用標記為 http://Services/SAPSiebel_BOContactBCContac 的 siebelRole 添加了 siebelID。
可以使用關系服務對象中定義的 API addParticipantString 方法手工創建關系表中的記錄(清單 3)。
清單 3. addParticipantString 方法的實現
final String relationshipName = "http://Services/SAPSiebel";
final String siebelRole = "http://Services/SAPSiebel_BOContactBCContact";
final String sapCreateRole = "http://Services/SAPSiebel_SapCustomerWrapper";
Service sapService = locateService_SAPOutboundInterfacePartner();
BOFactory boFactory = (BOFactory)ServiceManager.INSTANCE.locateService("com/ibm/
websphere/bo/BOFactory");
Service siebelService = locateService_SiebelOutboundInterfacePartner();
RelationshipService relService = (RelationshipService) ServiceManager.
INSTANCE.locateService("com/ibm/wbiserver/
rel/RelationshipService");
API 調用如清單 4。
清單 4. API 調用
try {int genId = relService.addParticipantString(relationshipName, siebelRole,
siebelID);
relService.addParticipantStringWithID(relationshipName, sapCreateRole, genId,
sapID);
} catch (RelationshipServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RelationshipUserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
注意:必須用本小節中指定的代碼更新 createRecords 方法。
調用關系服務來查找對應的 Siebel ID:
現在來實現 updateRecords 方法。可以將一個 ID 專門用於 GenericBO 中的 Siebel 記錄。對應的 SAP ID 將使用關系服務查找,如清單 5 所示。
清單 5. updateRecords 方法的實現
public DataObject updateRecords(DataObject input1) {
DataObject siebelBG = boFactory.create("http://www.ibm.com/xmlns/prod/wbi/j2ca/
siebel/bocontactbccontactbg", "BOContactBCContactBG");
DataObject genericBO = input1.getDataObject("GenericBO");
DataObject siebelBO = genericBO.getDataObject("siebelBO"); // BOContactBCContact
DataObject sapBO = genericBO.getDataObject("sapBO"); // SapCustomerWrapper
String siebelID = siebelBO.getString("Id");
String sapID = null;
如上文所述,從傳入的數據對象中獲取 siebelID,sapID 開始時設置為 null。實現如圖 6 所示的代碼。
清單 6. 使用關系服務檢索 SAP ID
/*
* The SAP ID will be retrieved with the help of the Relationship Service
*/
int[] ids;
try {
ids = relService.retrieveInstanceIDsByString(relationshipName,
siebelRole, siebelID);
if(ids.length > 0) {
List codes = relService.retrieveParticipants(relationshipName,
sapCreateRole, ids[0]);
if(!codes.isEmpty()) {
sapID = ((DataObject) codes.get(0)).getDataObject
("SapBapiCustomerCreatefromdata1").
getString("NewCustomerNumber");
}
}
} catch (RelationshipServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RelationshipUserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
根據已有的 siebelID,使用 retrieveInstanceIDsByString API 調用來檢索所有對應的 ID。由於定義了兩個角色,可以直接使用第一個實例(ids[0])來獲得 sapID。
使用直接從傳入的數據對象中獲得的 ID 和 BO 更新 Siebel 系統,如清單 7 所示。
清單 7. 更新 Siebel 系統
siebelBG.setString("verb", "Create");
siebelBG.setDataObject("BOContactBCContact", siebelBO);
// Update the Siebel Contact
DataObject siebelResponse = ((DataObject) siebelService.invoke
("updateBOContactBCContact", siebelBG)).getDataObject
("updateBOContactBCContactOutput");
genericBO.setDataObject("siebelBO", siebelResponse);
使用用關系服務檢索出的 ID 進行 SAP Update 操作,如清單 8 所示。
清單 8. 更新 SAP 系統
// Set the ID with the value returned from the Relationship Service
DataObject childBO = sapBO.getDataObject("SapBapiCustomerChangefromdata");
childBO.setString("CustomerNumberOfTheCustomerToBeChanged", sapID);
sapBO.setDataObject("SapBapiCustomerChangefromdata", childBO);
// Update the corresponding SAP Customer
DataObject sapResponse = ((DataObject) sapService.invoke
("updateSapCustomerWrapper", sapBO)).getDataObject
("updateSapCustomerWrapperOutput");
genericBO.setDataObject("sapBO", sapResponse);
可以用同樣方法實現 Retrieve 和 Delete 方法。
注意:必須用本小節指定的代碼更新那些更新、檢索、刪除的記錄。
測試解決方案
更新過 Java 組件實現之後,將模塊部署到 WebSphere Process Server 實例上。
右鍵單擊 Test > Test Module 來運行測試模塊,如圖 18 所示。
圖 18. 運行測試模塊
輸入 FirstName 和 LastName,用於創建 Siebel,如圖 19 所示。
圖 19. 輸入 Siebel Create 的值
同樣,輸入 SAP 記錄的值,如圖 20 和圖 21 所示。
圖 20. 輸入 SAP 記錄的值
圖 21. 輸入 SAP 記錄的更多的值
執行後,可以看到關系表中(通過管理員控制台)創建了一行。例如,在第一次執行時,SAP ID 是 447, Siebel ID 是 1-3XIEF,如圖 22 和圖 23 所示。
圖 22. 關系表顯示 Siebel ID
圖 23. 關系表顯示 SAP ID
為了驗證關系表條目已創建,打開 Process Server 的管理員控制台,並檢查表,如圖 24 所示。
圖 24. 管理員控制台顯示 Relationship Manager
單擊管理員控制台中 Integration Applications 部分的 Relationship Manager 項。
現在,單擊主窗口中的 Relationships 鏈接,如圖 25 所示。
圖 25. 管理員控制台中顯示關系
SAPSiebel 關系已創建(見圖 26)。要查看實例 ID,單擊單選按鈕,單擊 Query。使用下個屏幕中的所有默認值,單擊 OK。
圖 26. 管理員控制台顯示 SAPSiebel 關系
確實看到一個邏輯 ID(本例中是 7)。單擊鏈接查看映射。SAP 和 Siebel 的 ID 都顯示在關系表中,確認了條目已創建,如圖 27 所示。
圖 27. 管理員控制台顯示 SAP 和 Siebel 的 ID
現在,運行 updateRecords 操作,但 不要 給 SAP ID 字段提供任何 ID。調用關系服務查找 SAP ID 的代碼將會提供 ID 並自動刷新,如圖 28 所示。
圖 28. 運行 updateRecords 方法
SAP ID 是空的,如圖 29 所示。
圖 29. 空 SAP ID
運行過程中,可以看到 SAP 外部綁定請求的 ID(使用關系服務查找的)在調用 SAP 中方法時由代碼正確填入,如圖 30 所示。
圖 30.使用關系服務查找更新的 SAP ID
可用同樣方式實現 retrieveRecords 操作。
結束語
在本教程中,您了解了如何自動同步化 Enterprise Information Systems 中的數據,而不必手動管理 ID 映射。通過使用 WebSphere Process Server 的關系服務完成映射。