您可以使用 Oracle 資料庫配接器來接收 Oracle 資料庫數據表變更的通知。 不過,配接器只會傳送通知,指出某些記錄在特定資料庫數據表中插入、更新或刪除。 這些記錄上的任何後續處理都必須由用戶端應用程式本身處理。 本主題提供案例型描述,說明如何根據從 Oracle 資料庫收到的通知種類來處理數據表中的記錄。
接收通知之後執行後續動作的案例
以下是配接器客戶端必須執行特定通知後工作的幾個案例。
案例 1. 假設配接器客戶端必須根據您從 Oracle 資料庫收到的通知類型來執行特定工作。 例如,如果記錄插入數據表 「B」 中,用戶端應用程式就必須更新資料表 「A」 中的記錄。 同樣地,如果從資料表「B」刪除了記錄,用戶端應用程式就必須從資料表「A」中刪除記錄。
在此案例中,從收到的通知訊息中,配接器客戶端必須擷取通知類型,以決定通知是用於插入作業還是刪除作業。 確認通知類型之後,配接器客戶端必須執行後續動作來插入或更新相關的數據表。
案例 2. 考慮一個情境,當接收資料表變更通知訊息的接收位置發生故障時。 當接收位置關閉時,會將某些記錄新增至數據表。 不過,針對這些記錄,配接器用戶端不會收到任何通知。 當接收位置備份時,配接器會傳送特定訊息來通知用戶端,然後用戶端應用程式必須尋找在接收位置關閉時插入資料庫數據表中的所有記錄。
在此情境中,轉接器用戶端必須從收到的通知訊息中擷取通知是否涉及資料庫數據表的變動或接收位置的啟動。 如果通知與接收位置的啟動有關,則配接器客戶端必須實作邏輯來處理那些在接收位置無法使用期間可能已插入、更新或刪除的記錄。
備註
這些只是列出一些範例案例,以進一步瞭解如何在 Oracle Database 配接器中使用通知功能。 不過,擷取所接收通知類型所需的基本工作集在所有案例中都類似。 本主題提供如何從通知訊息擷取通知類型的指示。
本主題如何示範接收通知訊息
在本主題中,為了示範如何處理通知訊息以執行後續工作,我們考慮了配接器用戶端使用 BizTalk 應用程式接收通知訊息以變更 ACCOUNTACTIVITY 數據表的基本案例。 收到通知之後,客戶端會篩選收到的通知類型,並執行後續動作。 為了示範非常基本的案例,讓我們考慮配接器用戶端會根據收到的通知類型,將通知訊息複製到不同的資料夾。 因此:
如果通知訊息適用於 Insert 或 Update 作業,配接器用戶端會將訊息複製到 C:\TestLocation\UpsertNotification 資料夾。
如果通知訊息適用於任何其他作業,例如 Delete,配接器用戶端會將訊息複製到 C:\TestLocation\OtherNotificaiton 資料夾。
若要在 BizTalk 應用程式中達成此目的,協調流程必須包含下列專案:
接收通知訊息的單向接收埠。
包含 xpath 查詢的表示式圖形,用來擷取所接收通知訊息類型的相關信息。
在協調流程中包含決策區塊的「決策」圖形。 在此決策區塊中,應用程式會根據收到的通知訊息決定要執行的後續作業。
最後接收通知訊息的兩個單向傳送埠。
使用 Oracle 資料庫繫結屬性設定通知
下表摘要說明您用來設定從 Oracle 資料庫接收通知的 Oracle Database 配接器系結屬性。 您必須在 BizTalk Server 管理控制台中設定接收埠時指定這些系結屬性。
備註
在產生 通知 作業的架構時,您可以選擇指定這些系結屬性,即使它並非必要也一樣。 如果您這樣做,那麼「取用配接器服務外掛程式」作為中繼資料生成過程的一部分所產生的埠系結檔案,也會包含您為系結屬性指定的值。 您稍後可以在 BizTalk Server 管理控制台中匯入此系結檔案,以建立已設定系結屬性的 WCF 自定義或 WCF-OracleDB 接收埠。 如需使用系結檔案建立 WCF 自定義或 WCF-OracleDB 埠的詳細資訊,請參閱 使用埠系結檔案設定實體埠系結至 Oracle Database。
| 綁定屬性 | 說明 |
|---|---|
| InboundOperationType | 指定您要執行的輸入作業。 若要接收通知訊息,請將此設定為 [通知]。 |
| NotificationPort | 指定 ODP.NET 必須開啟的埠號碼,以接聽 Oracle 資料庫中的資料庫變更通知。 |
| NotificationStatement | 指定用來註冊查詢通知的SELECT語句。 只有在指定 SELECT 語句的結果集變更時,配接器才會取得通知訊息。 |
| NotifyOnListenerStart | 指定當接聽程序啟動時,配接器是否傳送通知給配接器用戶端。 |
如需這些屬性的更完整描述,請參閱 使用系結屬性。 如需如何使用 Oracle 資料庫配接器接收 Oracle 資料庫通知的完整描述,請閱讀進一步。
如何從 Oracle 資料庫接收通知訊息
搭配 BizTalk Server 使用 Oracle 資料庫配接器在 Oracle 資料庫上執行作業牽涉到建置組塊中所述的程式性工作 ,以使用 Oracle Database 開發 BizTalk 應用程式。 若要設定配接器以接收通知訊息,這些工作如下:
建立 BizTalk 專案,然後產生 通知 輸入作業的架構。 您可以選擇性地指定 InboundOperationType、 NotificationPort 和 NotificationStatement 系結 屬性的值。
在 BizTalk 專案中建立訊息,以接收來自 Oracle 資料庫的通知。
如上一節所述建立協調流程。
建置及部署 BizTalk 專案。
藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。
備註
針對輸入作業,例如接收通知訊息,您只能設定單向 WCF-Custom 或 WCF-OracleDB 接收埠。 不支援輸入操作的雙向接收埠。
啟動 BizTalk 應用程式。
本主題提供執行這些工作的指示。
產生架構
您必須產生 通知 輸入作業的架構。 如需如何產生架構的詳細資訊,請參閱 在Visual Studio中擷取 Oracle Database 作業的元數據 。 產生架構時,請執行下列工作。 如果您不想在設計時間指定系結屬性,請略過第一個步驟。
在產生架構時,指定 InboundOperationType、 NotificationPort 和 NotificationStatement 系結 屬性的值。 如需此系結屬性的詳細資訊,請參閱 使用系結屬性。 如需如何指定系結屬性的指示,請參閱 設定 Oracle Database 的系結屬性。
選擇合約類型為 服務(輸入作業)。
產生 通知 作業的架構。
定義訊息和訊息類型
您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 一旦架構產生後,您必須從 BizTalk 專案的 Orchestration 視圖中將其連結到訊息。
針對本主題,您必須建立一則訊息,以接收來自 Oracle 資料庫的通知。
執行下列步驟來建立訊息,並將其連結至架構。
建立訊息並連結至架構
將協調流程新增至 BizTalk 專案。 從方案總管中,以滑鼠右鍵按兩下 BizTalk 專案名稱,指向 [ 新增],然後按兩下 [ 新增專案]。 輸入 BizTalk 協調流程的名稱,然後按兩下 [ 新增]。
如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 檢視,指向 其他 Windows,然後按一下 協調流程檢視。
在 協調流程檢視中,以滑鼠右鍵按兩下 [ 訊息],然後按兩下 [ 新增訊息]。
以滑鼠右鍵按下新建立的訊息,然後選取 [ 屬性視窗]。
在 屬性 窗格中,對 Message_1 執行下列動作:
使用此 若要這樣做 識別碼 輸入 NotifyReceive。訊息類型 從下拉式清單中展開 [架構],然後選取 [Process_Notification.OracleDBBinding.Notification],其中 Process_Notification 是 BizTalk 項目的名稱。 OracleDBBinding 是針對 通知 作業所產生的架構。
設定協調流程
您必須建立 BizTalk 協調流程,以使用 BizTalk Server 從 Oracle 資料庫接收通知訊息,然後根據收到的通知類型執行工作。 在此協調流程中,配接器會根據針對 NotificationStatement 系結屬性指定的 SELECT 語句接收通知訊息。 Expression 圖形中指定的 xpath 查詢會將通知類型擷取至變數,例如 NotificationType。 [決定] 圖形會使用此變數中的值來決定收到的通知種類,並採用適當的「路徑」來執行後續作業。 如上一節所述,協調流程會根據收到的通知訊息種類來執行下列作業。
如果通知訊息適用於 Insert 或 Update 作業,配接器用戶端會將訊息複製到 C:\TestLocation\UpsertNotification 資料夾。
如果通知訊息適用於任何其他作業,例如 Delete,配接器用戶端會將訊息複製到 C:\TestLocation\OtherNotificaiton 資料夾。
因此,您的協調流程必須包含下列專案:
接收通知訊息的單向接收埠。
包含 xpath 查詢以擷取所接收通知類型的運算式圖形。
在協調流程中包含決策區塊的「決策」圖形。 在此決策區塊中,應用程式會根據收到的通知訊息決定要執行的後續作業。
最後接收通知訊息的兩個單向傳送埠。
接收圖形。
範例編排如下所示。
新增訊息圖形
請確定您為每個訊息圖形指定下列屬性。 Shape 數據行中所列的名稱是訊息圖形的名稱,如剛才提及的協調流程所示。
| 形狀 | 圖形類型 | 性能 |
|---|---|---|
| 接收通知 | 收到 | - 將 名稱 設定為 接收通知 - 將 Activate 設定為 True |
新增表達式圖形
在協調流程中包含表達式圖形的目的是要有 xpath 查詢來擷取收到的通知訊息種類。 建立 xpath 查詢之前,讓我們看看通知訊息的格式。 一般通知訊息如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/">
<Details>
<NotificationDetails>
<ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName>
<Info>1</Info>
<QueryId>0</QueryId>
</NotificationDetails>
</Details>
<Info>Insert</Info>
<ResourceNames>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string>
</ResourceNames>
<Source>Data</Source>
<Type>Change</Type>
</Notification>
如您所見,通知類型的相關資訊位於 <info> 標記中,且該標記位於父 <Notification> 標記內。 因此,在這個表達形式中,您必須:
建立變數,其中包含標籤的
<Info>值,並將其類型設定為 System.String。 如需建立變數的詳細資訊,請參閱 在協調流程中使用變數。針對本主題,將變數命名為 NotificationType。
建立一個 xpath 查詢,以從 <Info> 標籤中提取值。 xpath 查詢會如下所示:
NotificationType = xpath(NotifyReceive,"string(/*[local-name()='Notification']/*[local-name()='Info']/text())");在此 xpath 查詢中, NotifyReceive 是您為接收通知訊息而建立的訊息。 函式中的
string摘錄指出,查詢必須擷取位於<Notification>標籤內的<Info>標籤的值。 最後,查詢所擷取的值會指派給 NotificaitonType 變數。
新增決定圖形
新增決定圖形的目的是要在協調流程中包含決策區塊,以根據收到的通知訊息種類決定要執行的後續作業。 決策是根據 NotificationType 變數的值進行。 在本主題中,協調流程會根據收到的通知訊息類型做出決策。 因此,規則圖形中的條件會指定如下:
NotificationType.Equals("Insert") | NotificationType.Equals("Update")
此條件表示,如果 NotificaitonType 變數的值是 Insert 或 Update,協調流程將會執行一組工作。 如果 NotificationType 變數的值是任何其他值,協調流程將會執行其他一組工作。
如前幾節所述,為了示範簡單的方法,協調流程會根據通知訊息類型,將訊息複製到不同的資料夾。 因此,在 Rule 和 Else 區塊內,您必須新增 [傳送圖形] 以將訊息傳送至不同的埠。 針對本主題,將 Rule 區塊中的傳送圖形命名為 SendUpsertNotification ,並將 Else 區塊中的 Send 圖形命名為 SendOtherNotification。
新增埠
您現在必須將下列邏輯埠新增至編排流程:
從 Oracle 資料庫接收通知訊息的單向接收埠。
單向傳送埠,將插入和更新作業的通知訊息傳送至特定資料夾。
單向傳送埠,將任何其他作業的通知訊息傳送至特定資料夾。
請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中所列的名稱是協調流程中顯示的埠名稱。
| 港口 | 性能 |
|---|---|
| OracleNotifyPort | - 將 標識碼 設定為 OracleNotifyPort - 將 [類型 ] 設定為 OracleNotifyPortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 接收 |
| NotificationUpsertPort | - 將 識別碼 設定為 NotificationUpsertPort - 將 類型 設定為 NotificationUpsertPortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 傳送 |
| 其他通知端口 | - 將 標識符 設定為 OtherNotificationPort - 將 Type 設定為 OtherNotificationPortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 傳送 |
指定動作形狀的訊息並連線到端口
下表指定您應該設定的屬性及其值,以配置動作圖形的訊息並將其連結至埠。 Shape 數據行中所列的名稱是訊息圖形的名稱,如先前所述的協調流程所示。
| 形狀 | 性能 |
|---|---|
| 接收通知 | - 將 訊息 設定為 NotifyReceive - 將 作業 設定為 OracleNotifyPort.Notify.Request |
| 發送更新或插入通知 | - 將 訊息 設定為 NotifyReceive - 將 作業 設定為 NotificationUpsertPort.Upsert.Request |
| 發送其他通知 | - 將 訊息 設定為 選取 - 將 作業 設定為 OtherNotificationPort.Other.Request |
指定這些屬性之後,訊息圖形和埠會連線,且您的協調流程已完成。
您現在必須建置 BizTalk 解決方案,並將其部署至 BizTalk Server。 如需詳細資訊,請參閱 建置和執行協調流程。
設定 BizTalk 應用程式
部署 BizTalk 項目之後,您稍早建立的協調流程會列在 BizTalk Server 管理控制台的 [ 協調流程 ] 窗格底下。 您必須使用 BizTalk Server 管理主控台來設定應用程式。 如需逐步講解,請參閱 逐步解說:部署基本 BizTalk 應用程式。
設定應用程式牽涉到:
選取應用程式的主機。
將您在協調流程中建立的埠對應至 BizTalk Server 管理控制台中的實體埠。 為了這次編排,您必須:
定義實體 WCF-Custom 或 WCF-OracleDB 單向接收埠。 此埠會接聽來自 Oracle 資料庫的通知。 如需如何建立接收埠的資訊,請參閱 手動設定實體埠系結至 Oracle 資料庫配接器。 請確定您為接收埠指定下列系結屬性。
這很重要
如果您在設計時間指定系結屬性,就不需要執行此步驟。 在這種情況下,您可以藉由匯入由取用配接器服務增益集建立的繫結檔案,建立具有必要繫結屬性設置的 WCF 自訂或 WCF-OracleDB 接收埠。 如需詳細資訊,請參閱使用埠系結檔案設定實體埠系結。
綁定屬性 價值觀 InboundOperationType 將此設定為 [通知]。 NotificationPort 指定 ODP.NET 必須開啟的埠號碼,以接聽 Oracle 資料庫中的資料庫變更通知。 將此設定為您必須新增至 Windows 防火牆例外狀況清單的相同埠號碼。 如需如何將埠新增至 Windows 防火牆例外狀況清單的指示,請參閱 https://go.microsoft.com/fwlink/?LinkID=196959。
重要: 如果您將此設定為預設值 -1,則必須完全停用 Windows 防火牆以接收通知訊息。NotificationStatement 將此設定為:
SELECT TID,ACCOUNT,PROCESSED FROM SCOTT.ACCOUNTACTIVITY WHERE PROCESSED = ‘n’
注意: 您必須指定資料表名稱以及架構名稱。 例如:SCOTT.ACCOUNTACTIVITY。NotifyOnListenerStart 將此設定為 True。 如需不同系結屬性的詳細資訊,請參閱 使用系結屬性。
備註
建議您在使用 Oracle 資料庫配接器執行輸入作業時,設定交易隔離等級和交易逾時。 您可以藉由在設定 WCF-Custom 或 WCF-OracleDB 接收埠時新增服務行為來執行此動作。 如需如何新增服務行為的指示,請參閱 使用 Oracle 資料庫設定交易隔離等級和交易逾時。
定義硬碟上的位置和對應的檔案埠,BizTalk 協調流程會從 Oracle 資料庫卸除通知訊息以進行插入和更新作業。 將此埠設定為將通知訊息卸除至 C:\TestLocation\UpsertNotification 資料夾。
定義硬碟上的位置及相應的檔案路徑,BizTalk 協調流程會將 Oracle 資料庫中所有其他操作的通知訊息存放於此。 將此埠設定為將通知訊息卸除至 C:\TestLocation\OtherNotification 資料夾。
啟動應用程式
您必須啟動 BizTalk 應用程式,才能從 Oracle 資料庫接收通知訊息,以及執行後續的選取和更新作業。 如需啟動 BizTalk 應用程式的指示,請參閱 如何啟動協調流程。
在這個階段,請確定:
WCF-Custom 或 WCF-OracleDB 單向接收埠,它接收 Oracle 資料庫的通知訊息,正在運行中。
從 Oracle 資料庫接收訊息的兩個 FILE 傳送埠正在執行中。
作業的 BizTalk 協調流程正在執行中。
執行作業
啟動 BizTalk 協調流程之後,就會進行下列一組動作:
因為 NotifyOnListenerStart 系結屬性設定為 True,因此您會收到下列訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Info>ListenerStarted</Info> <Source>OracleDBBinding</Source> <Type>Startup</Type> </Notification>請注意,標記中的
<Info>值為 “ListnerStarted”。 因此,此訊息會在 C:\TestLocation\OtherNotification 資料夾中收到。在 ACCOUNTACTIVITY 數據表中插入記錄。 您會收到如下的通知訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Details> <NotificationDetails> <ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName> <Info>1</Info> <QueryId>0</QueryId> </NotificationDetails> </Details> <Info>Insert</Info> <ResourceNames> <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string> </ResourceNames> <Source>Data</Source> <Type>Change</Type> </Notification>請注意,標記中的
<Info>值為 “Insert”。 因此,此訊息會在 C:\TestLocation\UpsertNotification 資料夾中收到。更新 ACCOUNTACTIVITY 資料表中的記錄。 您會收到如下的通知訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Details> <NotificationDetails> <ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName> <Info>32</Info> <QueryId>0</QueryId> </NotificationDetails> </Details> <Info>Update</Info> <ResourceNames> <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string> </ResourceNames> <Source>Data</Source> <Type>Change</Type> </Notification>請注意,標籤中的
<Info>值為 「Update」。 因此,此訊息會在 C:\TestLocation\UpsertNotification 資料夾中收到。從 ACCOUNTACTIVITY 資料表中刪除記錄。 您會收到如下的通知訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://Microsoft.LobServices.OracleDB/2007/03/Notification/"> <Details> <NotificationDetails> <ResourceName>SCOTT.ACCOUNTACTIVITY</ResourceName> <Info>16</Info> <QueryId>0</QueryId> </NotificationDetails> </Details> <Info>Delete</Info> <ResourceNames> <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">SCOTT.ACCOUNTACTIVITY</string> </ResourceNames> <Source>Data</Source> <Type>Change</Type> </Notification>請注意,標籤中的
<Info>值為 “Delete”。 因此,此訊息會在 C:\TestLocation\OtherNotification 資料夾中收到。
最佳做法
部署並設定 BizTalk 項目之後,您可以將組態設定匯出至稱為系結檔案的 XML 檔案。 產生系結檔案之後,您可以從檔案匯入組態設定,因此您不需要為相同的協調流程建立傳送埠和接收埠。 如需系結檔案的詳細資訊,請參閱 重複使用 Oracle 資料庫配接器系結。
在接收通知訊息之後執行複雜的作業
為了簡單且更瞭解,本主題中的協調流程會根據通知類型,將訊息複製到不同的資料夾。 不過,在真實世界中,您可能想要執行更複雜的作業。 您可以執行本主題中提供的類似程式,並加以建置以執行您想要的作業。 例如,如果您在 ACCOUNTACTIVITY 數據表上收到 Insert 作業的通知訊息,您可以變更協調流程以在另一個數據表中插入記錄。 在這種情況下,您可以在 [決定] 圖形內進行適當的變更。