作者Lucas JellemaOracle ACE 和 Oracle 融合中間件區域總監
通過一個簡單的示例了解如何配置 ESB 以發布企業事件
年 月發表
在面向服務的體系結構 (SOA) 領域一個比較重要的概念是事件驅動的體系結構 (EDA)與事件機制類似例如在 JavaScript 或 GL 環境中可以將觸發器(可執行程序代碼段)與按壓按鈕更改域值或者提交查詢等事件相掛鉤而 EDA 指定服務與業務事件的掛鉤方式
大多數業務事件(從下訂單請求報價到聘用新員工或提供某部分設備)觸發企業內多個響應如果進行更近一步的細化過程步驟內的事件(例如調用服務失敗超過預定義阈值或者到達指定目標)可能還會引起過程自身之外的相關方的興趣
EDA 允許您將創建或遇到事件的過程中的所有這些事件發布到一個中央事件處理主干上從而使所有感興趣的相關方可以從此處找到它們產生事件的過程或服務本身無需考慮這些外部各方否則會給該特定過程的執行帶來壓力系統之間交織過密造成維護困難
在本文中您將通過一個基於 Oracle ESB 的簡單示例了解如何配置該中央主干以消息的形式將發布的事件傳遞給外部各方(如果您沒有時間學習本教程結論部分提供了一個鏈接其指向一個包含完整 JDeveloper 應用程序的 zip 文件)
背景
Oracle ESB 具有使其適用於其任務的關鍵功能首先它可利用多種方法檢索消息(事件通知)通過 JMSWeb 服務調用文件系統或數據庫表等等它還可提取帶有與事件相關數據的消息並對其進行轉換通常是將其轉變為一種更通用更規范的企業模型
ESB 還可以將一個粗粒度事件消息轉換為多個細粒度消息例如它可以在新用戶已經注冊並下了第一個訂單時通過從基於 Web 的客戶訂單系統接收的消息創建一個新客戶事件以及新訂單事件在將原始消息轉換為一個或多個更規范可能更具針對性的消息時ESB 還可以豐富消息的內容(例如通過添加當前日期和時間戳信息或添加從參考數據源查找的信息)多個事件用戶可能會有此要求
最後根據事件(消息的內容)的特性ESB 可將內容經過擴充的已轉換消息提供給多個輸出通道例如 Web 服務JMS數據庫過程或表文件或者電子郵件
(注意BPEL 流程就是事件報告程序的一個主要示例執行 BPEL 流程時在幾個階段中和在一些情況下可以發布事件通常是以在 ESB 中調用 Web 服務的形式進行)
有幾種方法可以幫助對事件感興趣的相關方使用來自 ESB 的消息
ESB 可以將所有消息提供給 JMS 主題
並讓感興趣的相關方自己挑選獲取消息以及將其轉換為自定義格式的方式
可直接從 ESB
同一服務(使用來自發信方的事件並可能將其消息轉換為更規范的格式)調用每一個希望知曉消息的系統
當然
這意味著 ESB 服務需要針對增加的每一個相關方進行擴展
並且可能需要包含針對各個附加方的額外轉換和過濾規則
ESB 提供了一個接收事件
轉換和豐富消息和將該事件發布到 JMS 的服務
以及一個針對感興趣各方的專用服務
該專用服務將直接從接收服務(耦合)接收事件消息
或從 JMS(取消耦合)讀取消息
為其正在服務的相關方執行附加的定制轉換
以及通過適用於消息接收方的任何方式(JMS
Web 服務調用
數據庫操作)提供消息
在該示例中
添加一個新的對事件(消息)感興趣的相關方意味著要在 ESB 中創建一個獨立的
松散耦合的新服務
但是
這會引入一些特殊開銷
更多的服務定義以及服務實例
並且還會在內部通過外部 JMS 主題或多或少地復制 ESB 所做的內容
在大多數情況下第二種方法可能是最好的注意從 ESB 服務實例調用以通知感興趣各方的目標服務可以並行調用也可以順序調用(取適用的方式)
利用 Oracle ESB 開發 ESB 服務
可以在 Oracle ESB(Oracle 融合中間件中 Web 服務基礎架構的 ESB 組件)中按如下方式創建該方法的簡單演示
該案例中的業務事件是聘用新員工當新員工簽訂合同後該事件將發布到 ESB該事件消息包含姓名年齡性別職務以及入職日有多方對該事件感興趣
新員工需要向安全部門注冊
該部門將建立帳戶
頒發胸牌以便員工能夠進入該機構等等
財務部門需要為新員工准備多種工資單和支出報表
Junior Managers Club 將邀請處於管理位置
歲以下的所有人參加他們的會社
為此
他們希望在聘用了符合條件的新員工時能夠得到通知
使用 Oracle ESB 實現該簡單的業務事件服務如下所示
通過人力資源部門(為此目的調用 ESB Web 服務)發布(即發即棄)業務事件 NewEmployeeESB 服務使用該事件並執行三個也執行一些轉換的路由規則
調用 SendNewEmployeeFileToJuniorManagerClub 目標服務並將 CSV 文件寫入目標目錄
調用 InformFinanceDepartmentOfNewEmployee 目標服務並將新員工記錄寫入財務數據庫
調用 NotifySecurityWebService 以傳遞包含新員工數據的消息
這會啟動 BPEL 工作流流程
該過程在為新員工創建安全胸牌時需要手動活動
部署該服務時為發布新員工事件而對 NewEmployee ESB Web 服務的任何調用都會觸發兩個或三個(針對 歲以下的新管理層員工)目標服務該體系結構的關鍵是將事件發布方(人力資源部門)與事件使用方完全分離這樣添加新用戶不會對該部門有任何影響新員工事件中的更改基本上可以在 Router Service 中得到解決無需影響事件使用方
要開發針對該事件的 ESB 服務您需要完成以下步驟
下載並安裝 Oracle SOA 套件
或更高版本
下載並安裝 Oracle JDeveloper
或更高版本
啟動 SOA 套件
運行 JDeveloper
執行初始設置
初始設置
您首先需要做一些准備
然後才能開始實現 EDA
具體來說
您需要使用 DDL 腳本在數據庫中創建一個表
將文件復制到您文件系統上可供 JDeveloper 訪問的目錄
並將一個很小的簡單 BPEL 項目部署到您的 SOA 套件實例
下面是設置步驟
將示例代碼下載解壓縮到一個臨時目錄
使用 employees_tablesql 腳本為所需的數據庫模式創建表 EMPLOYEES稍後您會用到該表在該表上插入新記錄
將文件 NewEmployeeEvent_Templatecsv 復制到可從 JDeveloper 訪問的目錄您將在文件適配器向導中使用該文件為應該由將在本教程中開發的 ESB 服務編寫的文件建模
將 SecurityProcessingNewEmployeezip 文件解壓縮到一個工作目錄該文件中包含一個小的 JDeveloper 項目和一個 BPEL 流程SecurityProcessingNewEmployee這是一個簡單的流程該流程調用 BPEL 工作流服務讓安全部門接受為新員工創建新胸牌的任務
將 SecurityProcessingNewEmployee 項目加載到 JDeveloper 中將該項目部署到 SOA 套件實例中的 BPEL PM我們需要讓該 BPEL 流程在您於 ESB 中開發 EDA 服務時可用
部署 BPEL 流程
方法是右鍵單擊 SecurityProcessingNewEmployee 並選擇 Deploy 選項
然後選擇選項 BPEL Process Deployer
通過彈出的窗口
您可以選擇一個到 BPEL PM 實例的 Connection
選擇正確的連接
按 OK 啟動部署
創建 JDeveloper 應用程序
在 JDeveloper 中創建一個名為 EventDrivenArchitecture 的新應用程序如果 JDeveloper 要為您創建一個默認項目按 Cancel
轉至 New Gallery這次選擇 ProjectsESB Project 項
將項目命名為 NewEmployeeEventService
當 ESB 圖打開後單擊左上角的小圖標以創建一個系統
在 ESB 服務器中注冊項目後就可以在 ESB 控制台中使用您創建的系統或服務組了服務是系統的一部分或者是系統內的組的一部分系統和組都提供了一種組織服務的方法 — 不同於 BPEL 流程中的作用域系統的一個重要方面是可以從路由服務並行調用不同系統中的目標服務同時按順序調用同一系統中的目標服務
將新系統命名為 NewEmployeeEventSystem
在開始使用 ESB 中的事件處理服務之前需要根據 New Employee 事件指定從人力資源部門接收的確切消息類型為此創建一個 XML 模式文檔 (XSD)以描述為該事件接收的 XML 消息的結構
轉至 New Gallery選擇節點 GeneralXML 並單擊可用項列表中的 XML Schema然後為新的 XML 模式文檔輸入名稱 — 在本例中為 NewEmployeeEventMessagexsd
注意該模式有一個相對簡單的消息結構其復雜類型比較簡單(帶有五個簡單類型元素)描述了與該業務事件相關的核心信息
現在返回 ESB 選項卡開始創建服務
將 Routing Service 組件從 Component Palette 拖放至 ESB Service為 Routing Service 輸入名稱使用 Browse 按鈕和 Type Chooser 選擇 NewEmployeeEventMessage 模式定義中的 NewEmployeeEvent 模式元素
以下是 Type Chooser 的屏幕截圖可用於選擇描述該 Routing Service 輸入的 XSD 元素
在創建即發即棄(無回調異步)的服務時無須指定回復消息或失敗
可允許外部進程通過 Web 服務接口直接調用這個 NewEmployeeEventRS 路由服務如果使用其他通道發布該事件 — 例如通過在數據庫表中輸入新員工或利用 JMS 將新的 Employee 文件置於 FTP 服務器上 — 您可以將入站適配器服務添加到 ESB 服務該服務會轉發獲得的 NewEmployeeEventRS 消息此時假設人力資源部門將使用 Web 服務接口
現在來看一下出站適配器請記住該事件涉及三方安全部門財務部門以及 Junior Managers Club
安全部門具有一個要調用的 Web 服務終端 — 實際上
該終端只是將在部門內運行的 BPEL 流程的前端
其中包括負責創建物理證件的人工流程
財務部門希望您直接在數據庫表中插入一條新記錄
以後可從此處讀取該記錄
Junior Managers Club 明確表示
希望通過寫入文件系統特定位置的 CSV 文件接收新 Junior Manager 的消息
它提供了一個示例文件
用於說明該文件的格式
為此我們需要向 ESB 服務添加出站服務
在 ESB 制圖器中將 File Adapter 拖放至圖中這會彈出一個窗口您可以通過該窗口定義 File Adapter 服務的細節以便將 CSV 文件寫入文件系統
輸入服務名稱然後單擊 WSDL File 域旁邊的 Define Adapter Service 圖標
接下來將進入 File Adapter Configuration Wizard在第一個頁面上指定服務名稱(基本上是確認之前在 Create File Adapter Service 彈出窗口中指定的內容)
單擊 Next 後將轉到 Operation 頁面在這裡您可以指定希望服務編寫文件
Step 將詢問是否為服務將要編寫的文件指定輸出目錄和命名慣例目前指定硬編碼目錄要簡單些 — 但是這顯然不是創建可移植服務的最佳方法可使用幾個動態元素指定文件名(但一次只能指定一個)例如消息或序列的日期或時間
在 Step 中指定文件的輸出格式信息的結構如何?因為要編寫 CSV 文件所以單擊 Define Schema for native format 按鈕
這將顯示 Native Format Builder您可在其中創建 XSD以便 File Adapter 用於從其中的 XML 數據創建 CSV 文件使用示例 CSV 文件Junior Manager Club 發送指令時游刃有余
接受默認值並單擊 Next
在下一個頁面中浏覽到示例文件或鍵入其名稱和位置然後按 Next
接受第 頁上的默認值並單擊 Next
分別為包含多條記錄的元素和表示一條記錄的元素輸入名稱例如使用 NewJuniorManagers 和 NewJuniorManager注這些將在創建該文件服務的映射時出現在編寫的文件中不會顯示
接受第 頁上的默認值並單擊 Next
在第 頁上選中復選框Use the first record as the field names同樣這將使 XSD 的可讀性更強 — 它不會影響由該服務編寫的文件
在下一個頁面上匯總了由向導創建以供 File Adapter 使用的 XSD 文件的信息您可以檢查這些信息然後單擊 Next 接受
這將顯示 Native Format Builder 向導的最後一頁單擊 Finish
返回 File Adapter Configuration Wizard單擊 Next
然後單擊 Finish您將返回 Create File Adapter Service 彈出窗口再次單擊 Finish
NewEmployeeEventService 的 ESB 圖已經通過 SendNewEmployeeFileToJuniorManagersClub 服務得到了擴展
雙擊 NewEmployeesRS 圖標指定路由規則以將 NewEmployeeEvent 消息傳遞至該目標服務
單擊綠色加號創建一個新的路由規則Browse Target Service 對話框將打開您可以在其中選擇路由規則將向其傳遞消息的服務
在 SendNewEmployeeFileToJuniorManagersClub 上選擇 write 操作單擊 OK
添加分為兩部分的過濾器表達式 — 一部分表明新雇員的年齡應低於 歲另一部分要求角色應為管理類以下是必須輸入的完整表達式
/inp:newEmployeeEvent/inp:age < and contains(MANAGERPRESIDENT
VICE PRESIDENTTECHNOLOGY MANAGERCFOCHIEFSUPERVISOR/inp:newEmployeeEvent/inp:role)
現在需要指定如何轉換從人力資源部門接收的消息以將其傳遞至目標服務
單擊映射圖標選擇對話框中的 Create New Mapper File 選項
單擊 OK進入 Mapper 工具您需要在其中連接兩個 XSD 文檔因此定義 XSLT 以將源 XSD 轉換為目標
首先將 newEmployeeEvent 元素拖放至 NewJuniorManager 的頂部以創建一個簡單明顯的映射
取消選中復選框 Match Elements Considering their Ancestor Names
現在您已經擁有了一個最初的映射
role 元素尚未映射到 Position 域而 FirstDay 域對於日期格式的要求比較特殊
將 role 拖放至 position然後將連接頂部的 Component Palette 中的 formatdateTime Date Function 從 firstDayAtWorkDate 拖放至 firstDay
現在雙擊功能項以確切指定如何執行轉換
接下來該解決財務部門的特定消息傳遞需求了
財務部門
財務部門希望您直接將新記錄插入數據庫表
該表位於公司數據庫之一的 FINANCE 部門中
SQL> desc employees
Name Null? Type
NAME NOT NULL VARCHAR()
GENDER VARCHAR()
JOB_TITLE VARCHAR()
START_DATE DATE
您需要為該目標創建一個新的適配器服務使用 Database Adapter 為 NewEmployeeEventRS 設置一個目標服務在 Component Palette 的 Adapter Services 部分中將 Database Adapter 拖至 ESB 文檔以下窗口將彈出
輸入 Adapter Service 的名稱單擊 WSDL File 域後面的第一個圖標以配置數據庫適配器
創建一個 New Database Connection以連接到公司數據庫的 FINANCE 模式(注以初始設置期間創建 EMPLOYEES 表的方式創建數據庫模式連接)
指定連接名稱
然後輸入 FINANCE 模式的用戶名和口令
單擊 Next 按鈕輸入 Connection 的詳細信息
在這一步中您需要指定 JDBC URL 細節例如主機名端口以及數據庫 SID完成後單擊 Next 測試連接
如果成功則單擊 Finish否則更正錯誤的信息
這將返回 Database Adapter Configuration Wizard單擊 Next
選擇希望該服務執行的操作只需插入新記錄
單擊 Next您將轉到 Select Table 頁面單擊 Import Tables 選擇 FINANCE 數據庫中的 EMPLOYEES 表
單擊 Import Tables按 Query 按鈕這將顯示一個包含 FINANCE 模式下所有表的列表選擇 EMPLOYEES 表並單擊 OK
當 Select Table 向導頁面再次出現時單擊 Finish
您將返回 Create Database Adapter Service單擊 OK
現在將返回 ESB 圖
將該目標服務連接到 NewEmployeeEventRS雙擊路由服務的圖標
單擊綠色加號以添加路由規則
選擇 InformFinanceDepartmentOfNewEmployeeEvent 服務下的 Event 操作並單擊 OK
單擊 Mapping 圖標定義從傳入的 NewEmployeeEvent 到目標服務的映射
選擇 Create New Mapper File 並單擊 OK
將 newEmployeeEvent 事件元素拖至 top:Employees 元素
取消選中 Match Elements considering their ancestors 復選框
自動映射將執行轉換的第一步
您需要手動將 role 映射到 jobTitle並將 firstDayAtWorkDate 映射到 startDate只需將 Source 元素拖放至 Target 元素即可
最終的映射將如下所示
單擊 Save All 圖標就快完成了三方中已有兩方與 NewEmployeeEvent 鏈接在一起
安全部門安全部門已經發布了一個 Web 服務您需要通過新員工事件進行調用在該 Web 服務之後潛伏著一個能夠啟動人工流程的 BPEL 流程(此時這是它唯一可做的事情)
在 ESB 服務中您需要創建另一個 Adapter Service 以便調用這個 BPEL 流程然後將其與 Router Service 相連
從 ESB 服務的 Component Palette 中將 SOAP Service 元素拖放至 ESB 圖
Create Soap Invocation Service 對話框將彈出輸入該服務的名稱例如 NotifySecurityWebService然後單擊 Service Explorer 圖標
選擇 SecurityProcessingNewEmployee 服務(該服務已經部署在 BPEL PM 實例上)
單擊 OK
再次單擊 OK
雙擊 Router Service您需要添加一個新的路由規則以將 Soap Invocation Service 連接到 Router Service
單擊綠色加號以添加新的路由規則
在 NotifySecurityWebService 目標服務下選擇 initiate 操作
單擊 OK
From:http://tw.wingwit.com/Article/program/Oracle/201311/16993.html