熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

通過企業服務總線構建事件驅動的體系結構

2022-06-13   來源: Oracle 

  作者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(取消耦合)讀取消息為其正在服務的相關方執行附加的定制轉換以及通過適用於消息接收方的任何方式(JMSWeb 服務調用數據庫操作)提供消息在該示例中添加一個新的對事件(消息)感興趣的相關方意味著要在 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
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.