(原文與源碼)http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0609_peterson/0609_peterson.html
引言
本文將開發一個客戶訂單示例應用程序,它使用 IBM® WebSphere® Integration Developer、WebSphere Process Server、DB2® 和 WebSphere Adapter for JDBC,以利用數據庫事件來調用業務流程。了解數據庫驅動的業務流程如何能夠幫助您加快上市時間和降低總體擁有成本。
先決條件
為了開發這個循序漸進的示例應用程序,應考慮下列先決條件:
WebSphere JCA 1.5 適配器
Java™ Component Architecture (JCA) 是 Java Enterprise Edition (Java EE) 規范的一部分,用于提供一種標準方法來與非 Java EE 系統進行事務通信,如圖 1 所示。WebSphere 系列提供了一組適配器來連接到各種企業信息系統 (Enterprise Information Systems, EIS),如 SAP 和 Peoplesoft。
圖 1. 將 EIS 與 JCA 適配器集成
本文將利用 WebSphere Adapter for Java Database Connectivity (JDBC),它能與任何具有兼容 JDBC 驅動程序的數據庫集成。當數據庫表中發生創建、更新或刪除事件時,我們將使用該適配器的“入站接口”來調用業務流程。有關 Java Connector Architecture 和 WebSphere 適配器組合的更多信息,請參見參考資料。
數據庫驅動的業務流程的業務案例
您的組織的后端基礎設施可能很適合對業務流程進行數據庫驅動的調用,但是該體系結構設計決策并不是完美無瑕的。請從業務角度考慮下列因素:
- 遺留環境中的數據庫驅動的業務流程。如果您有遺留系統,并且它們已經提供了信息來調用數據庫中的業務流程,則數據庫驅動的業務流程可能是加快上市時間的關鍵。數據庫可以充當調用企業體系結構中的業務流程的自然實體,對于遺留集成尤其如此,因為組織通常已經有與他們在數據庫中的業務流程相關的事務。
- 事務服務質量。如果您處在不能承受任何一個事務失敗的環境中——如開發票、交易或報價——則結合使用 WebSphere Adapter for JDBC 和成熟的數據庫系統可以提供所需的服務質量。JCA 規范的一個重要優點在于,它定義了 Java EE 適配器將如何成為事務性的,以使它們能夠參與 Java EE 容器事務。因此,WebSphere Adapter for JDBC 可以與您的業務流程一起參與全局事務。如果某個業務流程失敗,則會回滾該全局事務,包括適配器已在該事務期間執行的任何數據庫交互。
- 數據庫技能“比比皆是”。利用現有的數據庫事件來調用業務流程可以降低總體擁有成本,因為組織中可能已經擁有開發和管理數據庫事件的技能。對于許多使用數據庫驅動的業務流程的組織來說,建立必要的數據庫觸發器和數據庫交互構件是非常直觀的。然而,如果您的組織剛開始使用 WebSphere Integration Developer、服務組件體系結構 (Service Component Architecture, SCA) 和 BPEL 業務流程,則可能需要大量的強化培訓來構建業務流程本身。有關這些技術的更多信息,請參見參考資料。
- 性能不是該體系結構的強項。網絡和數據庫訪問的開銷非常大,因此,如果吞吐量極為重要,則這可能無法滿足您的需要。例如,如果另一個系統 System A 編寫了一個數據庫事件,然后 WebSphere Process Server 選擇它來調用某個業務流程,則該數據庫實質上是“中間人”。消除了中間數據庫的任何體系結構將具有更多的性能潛力。例如,如果 System A 支持 JMS、MQ、RMI 或 Web 服務,它就可以直接與 WebSphere Process Server 通信。此外,如果 System A 由另一個 WebSphere 適配器(如 Siebel 或 Oracle 適配器)支持,則這樣的適配器更為合適,因為它也消除了中間的數據庫。
總之,對于遺留集成、事務服務質量和以數據庫或大型機為中心的技能集而言,數據庫驅動的業務流程是強有力的體系結構設計決策。當存在嚴格的性能要求或存在開銷很大的網絡延遲時,數據庫驅動的業務流程可能不是最佳的解決方案。
客戶訂單示例
本部分將詳細描述該客戶訂單示例應用程序的配置和開發。該示例應用程序由接受客戶訂單的業務流程組成。請考慮下列數據庫實體:
圖 2. 訂單應用程序數據庫實體
在對 ORDER
表創建、更新或刪除一個行時,將會通過對應的數據庫觸發器向 ORDER_EVENT
表添加一個行。JCA Adapter for JDBC 利用 ORDER_EVENT
表來調用下游業務流程,如圖 3 所示。該適配器是通過輪詢 ORDER_EVENT
表中的新行(以您可以指定的間隔)來實現這點的。
圖 3. 訂單應用程序概述
上圖是與供應商無關的通用圖解。對于我們的示例應用程序,左側的數據庫為 DB2,Java EE 運行時為 WebSphere Process Server,業務流程為使用 WebSphere Integration Developer 來開發的基于業務流程執行語言(Business Process Execution Language,BPEL)標準的服務組件體系結構 (SCA) 業務流程組件。
創建 DB2 表和觸發器
下面的說明逐步地為該客戶訂單示例完成新的 DB2 數據庫以及必要的表和觸發器的創建。
- 啟動 DB2 命令中心。我們將在該示例的開發過程中廣泛地使用 DB2 命令中心。如果您更喜歡使用 DDL 腳本來建立數據庫,請參見下載部分,其中包括 db2-order-tables-and-triggers.ddl。
- Windows
若要在 Windows 下啟動命令中心,請打開“開始”菜單中的“程序”,然后選擇 IBM DB2 => Administration => Command Center。
- Linux
在 Linux 下,您需要以 DB2 管理用戶身份來執行 db2cc 腳本。下面是一個示例:
清單 1. 在 Linux 下啟動 DB2 命令中心
[rain%] su db2admin
[rain%] password: ********
[rain%] /opt/IBM/db2/V8.2/bin/db2cc
|
- 打開命令中心以后,創建一個名為 ORDERS 的新數據庫。為此,請右鍵單擊 Databases 并選擇 Create Database => Standard ,然后再選擇 Finish。
圖 4. 創建 ORDERS 數據庫
- 創建
ORDERS
數據庫以后,通過選擇“c:>”圖標來打開命令編輯器。
圖 5. 打開命令編輯器
- 單擊 Add 將命令編輯器連接到 ORDERS 數據庫。取消選中 Use implicit credentials 并插入您的 DB2 實例的用戶名和密碼。
圖 6. 將命令編輯器連接到 ORDERS 數據庫
重要:本文假設數據庫模式的名稱為 db2admin。務必要注意這一點,因為我們為 WebSphere Process Server 開發的構件將作為它們的命名約定的一部分包括該模式名稱。如果您在缺省情況下沒有該模式,則建議您使用下面的命令創建一個名為 db2admin 的模式,以便完成這個逐步示例而無需不必要的調試。
清單 2. 創建 db2admin 模式
CREATE SCHEMA db2admin AUTHORIZATION <your-admin-username-here>
|
- 在命令編輯器中插入下面的命令并單擊執行按鈕,如圖 7 所示。
清單 3. 創建 Order 表
CREATE TABLE ORDER (
ORDER_ID INTEGER NOT NULL PRIMARY KEY,
DESC VARCHAR(255),
QTY INTEGER,
);
|
圖 7. 創建 ORDER 表
- 類似地,輸入下面的命令來創建訂單事件表和觸發器,以填充針對插入、更新和刪除操作的事件表。
重要:如果您希望監視的是現有表而不是 ORDER
表,則可以使用同一個事件表。如果要使用不同的模式名稱,您需要更改所有三個觸發器,以插入不同的 OBJECT_NAME
。所插入的文本必須與適配器使用的業務圖名稱準確匹配(請參見創建業務流程的步驟 2)。該文本的格式為 <schema-name><table-name>BG
。例如,如果您的模式名稱為 AS2,要監視的表名為 PROCUREMENT
,則將所有 Db2adminOrderBG
引用更改為 As2ProcurementBG
。
清單 4. 創建事件表和觸發器
CREATE TABLE ORDER_EVENT (
EVENT_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1, NO CACHE ) PRIMARY KEY,
OBJECT_KEY INTEGER NOT NULL,
OBJECT_NAME VARCHAR(40) NOT NULL,
OBJECT_FUNCTION VARCHAR(40) NOT NULL,
EVENT_PRIORITY INT NOT NULL,
EVENT_TIME TIMESTAMP DEFAULT CURRENT TIMESTAMP NOT NULL,
EVENT_STATUS INT NOT NULL,
EVENT_COMMENT VARCHAR(100)
);
CREATE TRIGGER event_create
AFTER INSERT ON ORDER REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQLINSERT
INTO ORDER_EVENT
(object_key, object_name, object_function, event_priority, event_status)
VALUES
(N.ORDER_ID, 'Db2adminOrderBG', 'Create', 1, 0);
CREATE TRIGGER event_update
AFTER UPDATE ON ORDER REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQLINSERT
INTO ORDER_EVENT
(object_key, object_name, object_function, event_priority, event_status)
VALUES
(N.ORDER_ID, 'Db2adminOrderBG', 'Update', 1, 0);
CREATE TRIGGER event_delete
AFTER DELETE ON ORDER REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQLINSERT
INTO ORDER_EVENT
(object_key, object_name, object_function, event_priority, event_status)
VALUES
(O.ORDER_ID, 'Db2adminOrderBG', 'Delete', 1, 0);
|
- 我們需要在 WebSphere Process Server 的庫目錄中包括必要的 DB2 JDBC Type 4 驅動程序和許可證 JAR。缺省情況下,您需要復制的文件位于下列位置:
- Linux
/home/db2inst1/sqllib/java/db2jcc.jar
/home/db2inst1/sqllib/java/db2jcc_license_cu.jar
- Windows
C:\Program Files\IBM\SQLLIB\java\db2jcc.jar
C:\Program Files\IBM\SQLLIB\java\db2jcc_license_cu.jar
- 將兩個 JAR 都復制到 WebSphere Process Server 安裝的 lib 目錄。假設您使用被用作 WebSphere Integration Developer 的集成測試環境的 WebSphere Process Server 運行時,則庫目錄的缺省位置如下:
- Linux
/opt/ibm/WebSphere/ID/runtimes/bi_v6/lib
- Windows
C:\Program Files\IBM\WebSphere\ID\runtimes\bi_v6\lib
導入和配置適配器
本部分將逐步地將 WebSphere Adapter for JDBC 導入您的 WebSphere Integration Developer 工作區并對其進行配置。
- 在新工作區中打開 WebSphere Integration Developer。
- 選擇 File => New => Enterprise Service Discovery。這將調出一個向導,指導我們完成必要工作區構件的生成和數據庫連接屬性的配置。
- 單擊 Import Resource Adapter 然后單擊 Browse 按鈕。從下面的位置選擇 CWYBC_JDBC.rar:
<your-adapter-install-directory>/adapter/jdbc/deploy
 |
重要:*.rar 文件是資源存檔(類似于 *.war 或 Web 存檔)。因此,CWYBC_JDBC.rar 是按照 Sun 的 JCA 規范來打包的 JCA 適配器本身。 |
|
圖 8. 導入適配器資源
- 此時會出現一個窗口,詢問您是否希望切換到 J2EE 透視圖。單擊 Yes,然后選擇 Enterprise Service Discovery 窗口。該適配器已作為一個 J2EE“Connector”項目導入到我們的工作區中。我們需要切換到 J2EE 透視圖,以將 DB2 JDBC 驅動程序添加到 JDBC Adapter 項目的類路徑中。
- 展開 Connector Projects 并右鍵單擊 CWYPC_JDBC。然后選擇 Properties => Java Build Path => Libraries 選項卡。單擊 Add External JARs 并同時導入 db2cc.jar 和 db2jcc_license_cu.jar,如圖 9 所示。
圖 9. 將 DB2 JDBC Type 4 驅動程序 JAR 添加到 Connector 項目
- 單擊 OK,并通過選擇右上角“J2EE”旁邊的“打開透視圖”圖標來返回到 business integration 透視圖。
- 通過單擊 File => New 來再次打開 Enterprise Discovery Service 向導。選擇 JDBC EMD Adapter 并單擊 Next。
圖 10. Enterprise Service Discovery 向導
- 填寫數據庫憑據和連接屬性,如圖 11 所示。確保將 192.168.0.100 更改為承載 DB2 的計算機的“IP 地址”。如果 DB2 與 WebSphere Process Server 在同一臺計算機上,您可以使用 localhost。如果您的 DB2 實例不使用缺省 50000 端口,則不要忘了還要更改該端口。
圖 11. 數據庫憑據
- 單擊 Run Query,您應該看到 db2schema 中的表,如圖 12 所示。選擇 ORDER 表,然后單擊 => Add。最后,請單擊 Next。
圖 12. 內省 ORDER 表
- 確保將 Service Type 設置為 Inbound,并對 BOLocation 插入 com/ibm/dataobjects。您可以將此視為適配器構件的包名稱或名稱空間。
圖 13. 選擇 Inbound 服務類型
- 請注意,需要一個業務集成模塊項目來存放適配器構件。請單擊 New => Next 來創建一個這樣的項目。對模塊名稱插入 EventDrivenProcess 并單擊 Finish。
圖 14. 創建集成模塊項目
- 選擇 Use discovered connection properties,如圖 15 所示。
圖 15. 數據庫連接屬性
- 該對話框將展開更多字段。請插入下面的信息:
清單 5. 數據庫連接屬性
Username: db2admin
Password: <your-db2-password>
EventOrderBy: EVENT_ID
EventTableName: ORDER_EVENT
DatabaseVendor: DB2
|
- 最后單擊 Finish,您應該看到新創建的業務集成模塊,它帶有入站適配器 Export SCA 組件。
創建業務流程
您的工作區現在看起來應該類似于圖 16。當某個數據庫事件發生時,將會調用 JDBCInboundInterface 組件。在本部分中,我們將構建在 JDBCInboundInterface 被調用時接收通知的組件。也就是三個調用來進行創建、更新和刪除操作的業務流程。這里假設您熟悉服務組件體系結構 (SCA) 和 WebSphere 業務流程。有關使用 WebSphere Integration Developer 來開發業務流程的信息,請參見參考資料部分提供的信息中心。
圖 16. 業務集成模塊
- 我們的第一個步驟是創建一個使用訂單創建事件的業務流程。右鍵單擊 Interfaces 并選擇 New => Interface。對名稱插入 OrderCreate,對文件夾插入 com/ibm/interfaces。
- 創建一個與圖 17 確切相似的界面。請注意,該操作名為 createDb2adminOrder,唯一的 Input 參數名為 Row,Row 的 BO 類型為 Db2adminOrderBG。此界面實際上是適配器界面的子集(僅包括創建操作)。
圖 17. 構建 OrderCreate 界面
- 在 com/ibm/interfaces 文件夾中創建另外兩個分別名為 OrderUpdate 和 OrderDelete 的界面。創建與 OrderCreate 相同的 Input,只不過分別將操作命名為 updateDb2adminOrder 和 deleteDb2adminOrder。
- 右鍵單擊組件編輯器的空白區域,然后單擊 Add Node => Process。將其命名為 OrderCreateProcess。選擇浮動的界面圖標,并將其界面設置為 CreateOrder。雙擊 OrderCreateProcess 以實現該組件。對文件夾插入 com/ibm/interfaces。
- 在 Receive 組件下面,創建一個名為 LogProcessEntry 的 Java Snippet 組件。在 Properties 選項卡 => Details 下面為 LogProcessEntry 插入以下 Java 代碼。實際上,您可能使用更高級的記錄方法;不過這里為方便起見,我們將使用控制臺。
清單 6. OrderCreate LogProcessEntry 代碼片段
System.out.println(
"============ New Order Process Invoked ============");
System.out.println(
"ORDER_ID is "+Row.getDataObject("Db2adminOrder").getInt("orderid"));
System.out.println(
"DESC is "+Row.getDataObject("Db2adminOrder").getString("desc"));
System.out.println(
"QTY is "+Row.getDataObject("Db2adminOrder").getInt("qty"));
System.out.println(
"===================================================");
|
- 下一步,創建一個名為 ApplyDiscountChoice 的 Choice 組件。為 Case 組件插入下面的 Java 代碼:
清單 7. ApplyDiscount Case 語句
return Row.getDataObject("Db2adminOrder").getInt("qty") > 10;
|
- 在 Case 組件下面,創建另一個名為 Discount 的 Java Snippet。為 Discount 插入下面的 Java 代碼:
清單 8. Discount 代碼片段
System.out.println("++++++++ Discount Applied! ++++++++");
|
- 右鍵單擊 ApplyDiscountChoice 組件并選擇 Add Otherwise。在 Otherwise 組件下面,創建一個空組件并將其命名為 no-op。
- 結果 OrderCreateProcess 看起來應該與圖 18 非常相似。您可能已經觀察到了,此業務流程執行相關檢查,以確定訂單數量是否大于 10,并在情況屬實時應用折扣。否則,它就正常處理該訂單。在實踐中,Discount 和 no-op 組件可能被替換為對訂單處理 Web 服務、JMS 服務或其他 SCA 組件的調用。
圖 18. 訂單創建業務流程
- 打開組裝關系圖并創建一個名為 OrderUpdateProcess 的業務流程。使用 OrderUpdate 界面并對文件夾使用 com/ibm/processes。與前面一樣,添加一個名為 LogProcessEntry 的 Java Snippet,并使用下面的 Java 代碼來填充它:
清單 9. OrderUpdate LogProcessEntry 代碼片段
System.out.println(
"============ Update Order Process Invoked ============");
System.out.println(
"ORDER_ID is "+Row.getDataObject("Db2adminOrder").getInt("orderid"));
System.out.println(
"DESC is "+Row.getDataObject("Db2adminOrder").getString("desc"));
System.out.println(
"QTY is "+Row.getDataObject("Db2adminOrder").getInt("qty"));
System.out.println(
"======================================================");
|
- 創建一個名為 CheckQuantityChoice 的 Choice 組件。使用下面的 Java 代碼來填充 Case 組件:
清單 10. CheckQuantity Case 語句
return 0 == Row.getDataObject("Db2adminOrder").getInt("qty");
|
- 創建一個名為 RemoveOrder 的 Java Snippet。為 RemoveOrder 插入下面的 Java 代碼:
清單 11. RemoveOrder 代碼片段
System.out.println("++++++ QTY is 0. Removing Order. ++++++");
|
- 與前面一樣,創建一個其下面帶有 no-op 組件的 Otherwise 組件。
- 結果 UpdateOrderProcess 看起來應該與圖 19 非常相似。該業務流程執行相關檢查,以確定訂單數量是否為 0。如果是,則從系統中刪除該訂單(同樣,為簡潔起見而只提供了實現存根)。
圖 19. 更新訂單業務流程
- 創建一個名為 DeleteUpdateProcess 的業務流程。使用 OrderDelete 界面并對文件夾使用 com/ibm/processes。添加一個名為 LogProcessEntry 的 Java Snippet,并使用下面的 Java 代碼來填充它:
清單 12. OrderDelete LogProcessEntry 代碼片段
System.out.println(
"============ Delete Order Process Invoked ============");
System.out.println(
"ORDER_ID is "+Row.getDataObject("Db2adminOrder").getInt("orderid"));
System.out.println(
"DESC is "+Row.getDataObject("Db2adminOrder").getString("desc"));
System.out.println(
"QTY is "+Row.getDataObject("Db2adminOrder").getInt("qty"));
System.out.println(
"======================================================");
|
- 創建一個名為 CheckForPremiumCustomer 的 Choice 組件。在 Case 組件中插入下面的 Java 代碼:
清單 13. CheckForPremiumCustomer Case 語句
String premiumCode = "222";
String orderId =
Integer.toString(Row.getDataObject("Db2adminOrder").getInt("orderid"));
if(3 > orderId.length()) return false;
else return orderId.substring(0,3).equals(premiumCode);
|
- 在 Case 組件下面,使用下面的 Java 代碼創建一個名為 SendFeedbackSurvey 的 Java Snippet:
清單 14. SendFeedbackSurvey 代碼片段
System.out.println(
"+++++ Premium customer order deleted. Feedback survey send. +++++");
|
- 與前面一樣創建 Otherwise 和 no-op 組件。
- OrderDeleteProcess 執行相關檢查,以確定 orderId 的前三個數字是否為“222”。如果是,則認為該訂單與某個優惠客戶相關聯,并發送反饋調查。該流程看起來應該與圖 20 完全相同。
圖 20. 訂單刪除業務流程
- 切換回組裝關系圖并創建一個選擇器組件。將該選擇器命名為 SelectBusinessProcess。
- 添加 JDBCInboundInterface 作為該選擇器的界面。
- 右鍵單擊 SelectBusinessProcess 并從下拉菜單中選擇 Wire (Advanced)。選中所有業務流程界面:OrderCreate、OrderUpdate 和 OrderDelete。單擊 OK。
- 雙擊 SelectBusinessProcess 以實現該組件,并對文件夾選擇 com/ibm/selectors。
- 對于每個 JDBCInboundInterface 操作,將 Default Destination 設置為對應的 BusinessProcess。例如,選擇 createDb2adminOrder,并對 Default Destination 選擇 OrderCreateProcess,如圖 21 所示。
圖 21. 業務流程選擇器實現
該示例應用程序的開發到此就完成了!您的最終組裝關系圖看起來應該類似圖 22。
 |
重要:在繼續之前,為確保您的工作區進行正確的構建,建議您執行下列步驟: 選擇 Project => Clean => Clean All Projects。 |
|
圖 22. 最終組裝關系圖
測試應用程序
本部分使用 Test Component Wizard 來測試該業務流程,并最終通過在 DB2 中填充 ORDER
表來測試整個應用程序。
- 在 Server 選項卡下啟動 WebSphere Process Server。
- 右鍵單擊 SelectBusinessProcess 并選擇 Test Component,從而顯示 Test Component Wizard。
- 缺省情況下,Test Component Wizard 模擬下游 SCA 組件,這不是我們需要的結果。為刪除模擬器,請選擇 Configuration 選項卡并選擇刪除所有三個模擬器,如圖 23 所示。
圖 23. 從 Test Component 對話框刪除模擬器
- 切換回 Events 選項卡。填充 createDb2adminOrder 操作,如圖 24 所示。您應該獲得對應的控制臺輸出。
圖 24. 針對 OrderCreateProcess 的 Test Component Wizard
- 確保還要測試 updateDb2adminOrder 和 deleteDb2adminOrder 操作。
- 若要使用實際的數據庫驅動的事件來測試整個應用程序,請再次打開 DB2 命令中心。
圖 25. 打開 ORDER 表
您應該看到類似于圖 26 的對話框。
- 單擊 Add Row 可以創建一個表行,單擊 Delete Row 可刪除一個行。若要更新某個行,只需編輯相應字段。
- 單擊 Commit 以最終確定對 ORDER 的更改并觸發入站適配器。
圖 26. 編輯 ORDER 表
結束語
本文介紹了使用 WebSphere 和 DB2 組合的數據庫驅動的業務流程,但愿您會發現它是及時和有用的。我們介紹了數據庫驅動的業務流程是什么、為什么以及何時應該使用它們,并提供了一個詳細的逐步示例,展示如何使用 WebSphere Process Server 平臺來實現此類業務流程。現在您已經完成了配置和開發該客戶訂單示例應用程序的步驟,您可以使用本文提供的信息,通過開發自己的數據庫驅動的業務流程來最大化組織的效率。
posted on 2007-08-02 11:00
wqwqwqwqwq 閱讀(519)
評論(0) 編輯 收藏