使用 BizTalk Server 處理通知訊息以完成 Oracle 資料庫中的特定工作
您可以使用 Oracle 資料庫配接器來接收 Oracle 資料庫資料表變更的通知。 不過,配接器只會傳送通知,指出某些記錄已在特定資料庫資料表中插入、更新或刪除。 這些記錄上的任何後續處理都必須由用戶端應用程式本身處理。 本主題提供以案例為基礎的描述,說明如何根據從 Oracle 資料庫收到的通知類型來處理資料表中的記錄。
接收通知之後執行後續動作的案例
以下是配接器用戶端必須執行特定通知後工作的幾個案例。
案例 1. 請考慮介面卡用戶端必須根據您從 Oracle 資料庫收到的通知類型來執行特定工作的情況。 例如,如果記錄插入資料表 「B」,用戶端應用程式就必須更新資料表 「A」 中的記錄。 同樣地,如果從資料表 「B」 中刪除記錄,用戶端應用程式就必須刪除資料表 「A」 中的記錄。
在此案例中,從收到的通知訊息中,配接器用戶端必須擷取通知類型,以決定通知是用於插入作業還是刪除作業。 確認通知類型之後,配接器用戶端必須執行後續動作來插入或更新相關的資料表。
案例 2. 請考慮接收接收通知訊息以變更資料表的案例。 當接收位置關閉時,某些記錄會新增至資料表。 不過,針對這些記錄,配接器用戶端不會收到任何通知。 當接收位置備份時,配接器會傳送特定訊息來通知用戶端,然後用戶端應用程式必須尋找在資料庫資料表中插入的所有記錄,同時接收位置關閉。
在此案例中,從收到的通知訊息中,配接器用戶端必須擷取通知是否要變更資料庫資料表或開始接收位置的相關資訊。 如果通知用於接收位置開始,配接器用戶端必須實作邏輯,以處理在接收位置關閉時可能已插入、更新或刪除的記錄。
注意
這些只是列出一些範例案例,可進一步瞭解如何在 Oracle 資料庫配接器中使用通知功能。 不過,擷取所接收通知類型所需的基本工作集在所有案例中都會類似。 本主題提供如何從通知訊息擷取通知類型的指示。
本主題如何示範接收通知訊息
在本主題中,為了示範如何處理通知訊息以執行後續工作,我們會考慮配接器用戶端使用 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 資料庫。
Binding 屬性 | Description |
---|---|
InboundOperationType | 指定您想要執行的輸入作業。 若要接收通知訊息,請將此設定為 [通知]。 |
NotificationPort | 指定 ODP.NET 必須開啟的埠號碼,以接聽 Oracle 資料庫中的資料庫變更通知。 |
NotificationStatement | 指定用來註冊查詢通知的 SELECT 語句。 只有在指定 SELECT 語句的結果集變更時,配接器才會取得通知訊息。 |
NotifyOnListenerStart | 指定當接聽程式啟動時,配接器是否會將通知傳送給配接器用戶端。 |
如需這些屬性的更完整描述,請參閱 使用系結屬性。 如需如何使用 Oracle 資料庫配接器從 Oracle 資料庫接收通知的完整描述,請參閱進一步閱讀。
如何從 Oracle 資料庫接收通知訊息
使用 Oracle 資料庫配接器搭配 BizTalk Server在 Oracle 資料庫上執行作業牽涉到建置組塊中所述的程式工作,以使用 Oracle Database 開發 BizTalk 應用程式。 若要設定配接器以接收通知訊息,這些工作如下:
建立 BizTalk 專案,然後產生 通知 輸入作業的架構。 您可以選擇性地指定 InboundOperationType、 NotificationPort和 NotificationStatement 系結屬性的值。
在 BizTalk 專案中建立訊息,以從 Oracle 資料庫接收通知。
如上一節所述建立協調流程。
建置和部署 BizTalk 專案。
藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。
注意
對於接收通知訊息等輸入作業,您只能設定單向 WCF-Custom 或 WCF-OracleDB 接收埠。 輸入作業不支援雙向接收埠。
啟動 BizTalk 應用程式。
本主題提供執行這些工作的指示。
產生架構
您必須產生 通知 輸入作業的架構。 如需如何產生架構的詳細資訊,請參閱 在 Visual Studio 中擷取 Oracle 資料庫作業的中繼資料 。 產生架構時,請執行下列工作。 如果您不想在設計階段指定系結屬性,請略過第一個步驟。
在產生架構時,指定 InboundOperationType、 NotificationPort和 NotificationStatement 系結屬性的值。 如需這個系結屬性的詳細資訊,請參閱 使用系結屬性。 如需如何指定系結屬性的指示,請參閱 設定 Oracle 資料庫的系結屬性。
選取合約類型作為 服務 (輸入作業,) 。
產生 通知 作業的架構。
定義訊息和訊息類型
您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 產生架構之後,您必須從 BizTalk 專案的協調流程檢視將它連結到訊息。
針對本主題,您必須建立一則訊息,以接收來自 Oracle 資料庫的通知。
執行下列步驟來建立訊息,並將其連結至架構。
建立訊息並連結至架構
將協調流程新增至 BizTalk 專案。 從方案總管中,以滑鼠右鍵按一下 BizTalk 專案名稱,指向 [新增],然後按一下 [新增專案]。 輸入 BizTalk 協調流程的名稱,然後按一下 [ 新增]。
如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 [ 檢視],指向 [其他 Windows],然後按一下 [ 協調流程檢視]。
在 [ 協調流程檢視]中,以滑鼠右鍵按一下 [ 訊息],然後按一下 [ 新增訊息]。
以滑鼠右鍵按一下新建立的訊息,然後選取 [ 屬性視窗]。
在Message_1的 [屬性]窗格中,執行下列動作:
使用 作法 識別碼 輸入 NotifyReceive
。訊息類型 從下拉式清單中,展開 [ 架構],然後選取 [Process_Notification.OracleDBBinding.Notification],其中 Process_Notification 是您 BizTalk 專案的名稱。 OracleDBBinding 是針對 通知 作業產生的架構。
設定協調流程
您必須建立 BizTalk 協調流程,以使用BizTalk Server從 Oracle 資料庫接收通知訊息,然後根據收到的通知類型執行工作。 在此協調流程中,配接器會根據針對 NotificationStatement 系結屬性指定的 SELECT 語句來接收通知訊息。 運算式圖形中指定的 xpath 查詢會將通知類型擷取到變數中,例如 NotificationType。 決定圖形會使用此變數中的值來決定收到的通知種類,並採用適當的「路徑」來執行後續作業。 如上一節所述,協調流程會根據收到的通知訊息種類來執行下列作業。
如果通知訊息適用于 Insert 或 Update 作業,配接器用戶端會將訊息複製到 C:\TestLocation\UpsertNotification 資料夾。
如果通知訊息適用于任何其他作業,例如 Delete,配接器用戶端會將訊息複製到 C:\TestLocation\OtherNotificaiton 資料夾。
因此,您的協調流程必須包含下列專案:
接收通知訊息的單向接收埠。
運算式圖形,包含 xpath 查詢以擷取收到的通知種類。
決定要在協調流程中包含決策區塊的圖形。 在此決策區塊中,應用程式會根據收到的通知訊息決定要執行的後續作業。
最後接收通知訊息的兩個單向傳送埠。
接收圖形。
範例協調流程如下所示。
工作協調流程
新增訊息圖形
請確定您為每個訊息圖形指定下列屬性。 Shape 資料行中列出的名稱是訊息圖形的名稱,如剛才提到的協調流程所示。
圖形 | 圖形類型 | 屬性 |
---|---|---|
ReceiveNotification | 接收 | - 將 名稱 設定為 ReceiveNotification - 將 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>
如您所見,通知類型的相關資訊可在標記的父 <Notification>
標記內 <info>
取得。 因此,在此運算式圖形中,您必須:
建立變數,其中包含標記內
<Info>
的值,並將其類型設定為 System.String。 如需建立變數的詳細資訊,請參閱 在協調流程中使用變數。針對本主題,將變數命名為 NotificationType。
建立 xpath 查詢,以從 < Info > 標籤中擷取值。 xpath 查詢會類似下列內容:
NotificationType = xpath(NotifyReceive,"string(/*[local-name()='Notification']/*[local-name()='Info']/text())");
在此 xpath 查詢中, NotifyReceive 是您為接收通知訊息所建立的訊息。 函式內的
string
摘錄表示查詢必須擷取標籤內<Info>
的值,而標籤內則接著會<Notification>
擷取。 最後,查詢所擷取的值會指派給 NotificaitonType 變數。
新增決定圖形
新增決定圖形的目的是要在協調流程中包含決策區塊,以根據收到的通知訊息種類決定要執行的後續作業。 決定是根據 NotificationType 變數的值來決定。 在本主題中,協調流程會根據收到的通知訊息種類做出決策。 因此,規則圖形中的條件會指定如下:
NotificationType.Equals("Insert") | NotificationType.Equals("Update")
此條件建議如果 NotificaitonType 變數的值是 Insert 或 Update,協調流程將會執行一組工作。 如果 NotificationType 變數的值是任何其他值,協調流程會執行其他一組工作。
如前幾節所述,為了示範簡單的方法,協調流程會根據通知訊息類型,將訊息複製到不同的資料夾。 因此,在 Rule 和 Else 區塊內,您必須新增傳送圖形,以將訊息傳送至不同的埠。 針對本主題,將 Rule 區塊中的 [傳送] 圖形命名為 SendUpsertNotification ,並將 Else 區塊中的 [傳送] 圖形命名為 SendOtherNotification。
新增埠
您現在必須將下列邏輯埠新增至協調流程:
從 Oracle 資料庫接收通知訊息的單向接收埠。
單向傳送埠,將插入和更新作業的通知訊息傳送至特定資料夾。
單向傳送埠,將任何其他作業的通知訊息傳送至特定資料夾。
請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中所列的名稱是協調流程中顯示的埠名稱。
連接埠 | 屬性 |
---|---|
OracleNotifyPort | - 將 識別碼 設定為 OracleNotifyPort - 將 Type 設定為 OracleNotifyPortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 接收 |
NotificationUpsertPort | - 將 識別碼 設定為 NotificationUpsertPort - 將 [類型] 設定為 NotificationUpsertPortType - 將 通訊模式 設定為 單向 - 設定要傳送的通訊方向 |
OtherNotificationPort | - 將 識別碼 設定為 OtherNotificationPort - 將 類型 設定為 OtherNotificationPortType - 將 通訊模式 設定為 單向 - 設定要傳送的通訊方向 |
指定動作圖形的訊息並連接到埠
下表指定屬性及其值,您應該設定為指定動作圖形的訊息,以及將訊息連結至埠。 Shape 資料行中所列的名稱是如先前所述協調流程中顯示的訊息圖形名稱。
圖形 | 屬性 |
---|---|
ReceiveNotification | - 將 訊息 設定為 NotifyReceive - 將 作業 設定為 OracleNotifyPort.Notify.Request |
SendUpsertNotification | - 將 訊息 設定為 NotifyReceive - 將 作業 設定為 NotificationUpsertPort.Upsert.Request |
SendOtherNotification | - 將 訊息 設定為 選取 - 將作業 設定為 OtherNotificationPort.Other.Request |
指定這些屬性之後,訊息圖形和埠會連線,而且您的協調流程已完成。
您現在必須建置 BizTalk 解決方案,並將其部署至BizTalk Server。 如需詳細資訊,請參閱 建置和執行協調流程。
設定 BizTalk 應用程式
部署 BizTalk 專案之後,您稍早建立的協調流程會列在 BizTalk Server 管理主控台的 [協調流程] 窗格底下。 您必須使用 BizTalk Server 管理主控台來設定應用程式。 如需逐步解說,請參閱 逐步解說:部署基本 BizTalk 應用程式。
設定應用程式牽涉到:
選取應用程式的主機。
將您在協調流程中建立的埠對應至 BizTalk Server 管理主控台中的實體埠。 針對此協調流程,您必須:
定義實體 WCF-Custom 或 WCF-OracleDB 單向接收埠。 此埠會接聽來自 Oracle 資料庫的通知。 如需如何建立接收埠的資訊,請參閱 手動設定實體埠系結至 Oracle 資料庫配接器。 請確定您為接收埠指定下列系結屬性。
重要
如果您在設計階段指定系結屬性,就不需要執行此步驟。 在這種情況下,您可以匯入取用配接器服務增益集所建立的系結檔案,以建立 WCF 自訂或 WCF-OracleDB 接收埠,並設定必要的系結屬性。 如需詳細資訊,請參閱使用通訊埠系結檔案設定實體埠系結。
Binding 屬性 值 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 傳送埠正在執行中,接收來自 Oracle 資料庫的訊息。
作業的 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 作業的通知訊息,您可以變更協調流程以在另一個資料表中插入記錄。 在這種情況下,您可以在 [決定] 圖形內進行適當的變更。