使用 BizTalk Server 處理通知訊息以完成 SQL 中的特定工作
您可以使用 SQL 配接器來接收SQL Server資料庫資料表變更的通知。 不過,配接器只會傳送通知,指出某些記錄已在特定資料庫資料表中插入、更新或刪除。 這些記錄上的任何後續處理都必須由用戶端應用程式本身處理。 本主題提供以案例為基礎的描述,說明如何根據從SQL Server資料庫接收的通知類型來處理資料表中的記錄。
接收通知之後執行後續動作的案例
以下是配接器用戶端必須執行特定通知後工作的幾個案例。
案例 1。 請考慮介面卡用戶端必須根據您從SQL Server收到的通知類型來執行特定工作的情況。 例如,如果記錄插入資料表 「B」,用戶端應用程式就必須更新資料表 「A」 中的記錄。 同樣地,如果從資料表 「B」 中刪除記錄,用戶端應用程式就必須刪除資料表 「A」 中的記錄。
在此案例中,從收到的通知訊息中,配接器用戶端必須擷取通知類型,以決定通知是用於插入作業還是刪除作業。 確認通知類型之後,配接器用戶端必須執行後續動作來插入或更新相關的資料表。
案例 2。 請考慮接收接收通知訊息以變更資料表的案例。 當接收位置關閉時,某些記錄會新增至資料表。 不過,針對這些記錄,配接器用戶端不會收到任何通知。 當接收位置備份時,配接器會傳送特定訊息來通知用戶端,然後用戶端應用程式必須在接收位置關閉時,尋找在資料庫資料表中插入的所有記錄。
在此案例中,從收到的通知訊息中,配接器用戶端必須擷取通知是否要變更資料庫資料表或開始接收位置的相關資訊。 如果通知用於接收位置開始,配接器用戶端必須實作邏輯,以處理在接收位置關閉時可能已插入、更新或刪除的記錄。
注意
這些只是列出一些範例案例,以進一步瞭解如何在 SQL 配接器中使用通知功能。 不過,擷取所接收通知類型所需的基本工作集在所有案例中都會類似。 本主題提供如何從通知訊息擷取通知類型的指示。
本主題如何示範接收通知訊息和擷取通知類型
在本主題中,為了示範如何處理通知訊息以執行後續工作,我們考慮一個基本案例,其中配接器用戶端會使用 BizTalk 應用程式來接收 Employee 資料表變更的通知訊息。 收到通知之後,用戶端會篩選接收的通知類型,並執行後續動作。 為了示範非常基本的案例,讓我們考慮介面卡用戶端會根據收到的通知類型,將通知訊息複製到不同的資料夾。 所以:
如果通知訊息適用于 Insert 或 Update 作業,配接器用戶端會將訊息複製到 C:\TestLocation\UpsertNotification 資料夾。
如果通知訊息適用于任何其他作業,例如 Delete,配接器用戶端會將訊息複製到 C:\TestLocation\OtherNotificaiton 資料夾。
若要在 BizTalk 應用程式中達成此目的,協調流程必須包含下列專案:
接收通知訊息的單向接收埠。
包含 xpath 查詢的運算式圖形,用來擷取所接收通知訊息類型的相關資訊。
決定要在協調流程中包含決策區塊的圖形。 在此決策區塊中,應用程式會根據收到的通知訊息決定要執行的後續作業。
兩個單向傳送埠,最後接收通知訊息。
使用 SQL 配接器系結屬性設定通知
下表摘要說明您用來設定從SQL Server接收通知的 SQL 配接器系結屬性。 在 BizTalk Server 管理主控台中設定接收埠時,您必須指定這些系結屬性。
注意
即使不是必要,您也可以選擇在產生 通知 作業的架構時指定這些系結屬性。 如果您這麼做,取用配接器服務增益集產生的埠系結檔案也會包含您為系結屬性指定的值。 您稍後可以在 BizTalk Server 管理主控台中匯入此系結檔案,以建立已設定系結屬性的 WCF 自訂或 WCF-SQL 接收埠。 如需使用系結檔案建立埠的詳細資訊,請參閱 使用埠系結檔案設定實體埠系結以使用 SQL 配接器。
Binding 屬性 | Description |
---|---|
InboundOperationType | 指定您想要執行的輸入作業。 若要接收通知訊息,請將此設定為 [通知]。 |
NotificationStatement | 指定用來註冊查詢通知的 SQL 語句 (SELECT 或 EXEC < 預存程式 >) 。 只有在指定 SQL 語句的結果集變更時,配接器才會從SQL Server收到通知訊息。 |
NotifyOnListenerStart | 指定當接聽程式啟動時,配接器是否傳送通知給配接器用戶端。 |
如需這些屬性的更完整描述,請參閱閱讀 BizTalk Adapter for SQL Server 配接器系結屬性。 如需如何使用 SQL 配接器接收來自SQL Server通知的完整描述,請參閱進一步閱讀。
如何從SQL Server資料庫接收通知訊息
使用具有BizTalk Server的 SQL 配接器在SQL Server資料庫上執行作業,牽涉到使用 SQL 配接器開發 BizTalk 應用程式的建置組塊中所述的程式工作。 若要設定配接器以接收通知訊息,這些工作如下:
建立 BizTalk 專案,然後產生 通知 輸入作業的架構。 您可以選擇性地指定 InboundOperationType 和 NotificationStatement 系結屬性的值。
在 BizTalk 專案中建立訊息,以接收來自SQL Server資料庫的通知。
如上一節所述建立協調流程。
建置和部署 BizTalk 專案。
藉由建立實體傳送和接收埠來設定 BizTalk 應用程式。
注意
對於接收通知訊息等輸入作業,您只能設定單向 WCF-Custom 或 WCF-SQL 接收埠。 輸入作業不支援雙向 WCF-Custom 或 WCF-SQL 接收埠。
啟動 BizTalk 應用程式。
本主題提供執行這些工作的指示。
產生架構
您必須產生 通知 輸入作業的架構。 如需如何產生架構的詳細資訊,請參閱使用 SQL 配接器擷取 Visual Studio 中SQL Server作業的中繼資料。 產生架構時,請執行下列工作。 如果您不想在設計階段指定系結屬性,請略過第一個步驟。
在產生架構時,指定 InboundOperationType 和 NotificationStatement 系結屬性的值。 如需此系結屬性的詳細資訊,請參閱閱讀 BizTalk Adapter for SQL Server配接器系結屬性。 如需如何指定系結屬性的指示,請參閱 設定 SQL 配接器的系結屬性。
選取合約類型作為 服務 (輸入作業,) 。
產生 通知 作業的架構。
定義訊息和訊息類型
您稍早產生的架構描述協調流程中訊息所需的「類型」。 訊息通常是變數,其類型是由對應的架構所定義。 產生架構之後,您必須從 BizTalk 專案的協調流程檢視將它連結到訊息。
針對本主題,您必須建立一則訊息,以接收來自SQL Server資料庫的通知。
執行下列步驟來建立訊息,並將其連結至架構。
建立訊息並連結至架構
將協調流程新增至 BizTalk 專案。 從方案總管中,以滑鼠右鍵按一下 BizTalk 專案名稱,指向 [新增],然後按一下 [新增專案]。 輸入 BizTalk 協調流程的名稱,然後按一下 [ 新增]。
如果 BizTalk 專案尚未開啟,請開啟協調流程檢視視窗。 按一下 [ 檢視],指向 [其他 Windows],然後按一下 [ 協調流程檢視]。
在 [ 協調流程檢視]中,以滑鼠右鍵按一下 [ 訊息],然後按一下 [ 新增訊息]。
以滑鼠右鍵按一下新建立的訊息,然後選取 [ 屬性視窗]。
在Message_1的 [屬性]窗格中,執行下列動作:
使用 作法 識別碼 輸入 NotifyReceive
。訊息類型 從下拉式清單中,展開 [ 架構],然後選取 [Process_Notification.Notification],其中 Process_Notification 是您 BizTalk 專案的名稱。 通知 是針對 通知 作業產生的架構。
設定協調流程
您必須建立 BizTalk 協調流程,以使用BizTalk Server從SQL Server資料庫接收通知訊息,然後根據收到的通知類型執行工作。 在此協調流程中,配接器會根據針對 NotificationStatement 系結屬性指定的 SELECT 語句來接收通知訊息。 運算式圖形中指定的 xpath 查詢會將通知類型擷取到變數中,例如 NotificationType。 決定圖形會使用此變數中的值來決定收到的通知種類,並採用適當的「路徑」來執行後續作業。 如上一節所述,協調流程會根據收到的通知訊息種類來執行下列作業。
如果通知訊息適用于 Insert 或 Update 作業,配接器用戶端會將訊息複製到 C:\TestLocation\UpsertNotification 資料夾。
如果通知訊息適用于任何其他作業,例如 Delete,配接器用戶端會將訊息複製到 C:\TestLocation\OtherNotificaiton 資料夾。
因此,您的協調流程必須包含下列專案:
接收通知訊息的單向接收埠。
運算式圖形,包含 xpath 查詢以擷取收到的通知種類。
決定要在協調流程中包含決策區塊的圖形。 在此決策區塊中,應用程式會根據收到的通知訊息決定要執行的後續作業。
最後接收通知訊息的兩個單向傳送埠。
接收圖形。
範例協調流程如下所示。
新增訊息圖形
請確定您為每個訊息圖形指定下列屬性。 Shape 資料行中列出的名稱是訊息圖形的名稱,如剛才提到的協調流程所示。
圖形 | 圖形類型 | 屬性 |
---|---|---|
ReceiveNotification | 接收 | - 將 名稱 設定為 ReceiveNotification - 將 Activate 設定為 True |
新增運算式圖形
在協調流程中包含運算式圖形的目的是要有 xpath 查詢來擷取收到的通知訊息種類。 建立 xpath 查詢之前,讓我們先查看通知訊息的格式。 典型的通知訊息如下所示:
<Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/">
<Info>Insert</Info>
<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。
新增埠
您現在必須將下列邏輯埠新增至協調流程:
從SQL Server接收通知訊息的單向接收埠。
單向傳送埠,將插入和更新作業的通知訊息傳送至特定資料夾。
單向傳送埠,將任何其他作業的通知訊息傳送至特定資料夾。
請確定您為每個邏輯埠指定下列屬性。 [埠] 資料行中所列的名稱是協調流程中顯示的埠名稱。
連接埠 | 屬性 |
---|---|
SQLNotifyPort | - 將 識別碼 設定為 SQLNotifyPort - 將 Type 設定為 SQLNotifyPortType - 將 通訊模式 設定為 單向 - 將 通訊方向 設定為 接收 |
NotificationUpsertPort | - 將 識別碼 設定為 NotificationUpsertPort - 將 [類型] 設定為 NotificationUpsertPortType - 將 通訊模式 設定為 單向 - 設定要傳送的通訊方向 |
OtherNotificationPort | - 將 識別碼 設定為 OtherNotificationPort - 將 類型 設定為 OtherNotificationPortType - 將 通訊模式 設定為 單向 - 設定要傳送的通訊方向 |
指定動作圖形的訊息並連接到埠
下表指定屬性及其值,您應該設定為指定動作圖形的訊息,以及將訊息連結至埠。 Shape 資料行中所列的名稱是如先前所述協調流程中顯示的訊息圖形名稱。
圖形 | 屬性 |
---|---|
ReceiveNotification | - 將 訊息 設定為 NotifyReceive - 將 作業 設定為 SQLNotifyPort.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-SQL 單向接收埠。 此埠會接聽來自SQL Server資料庫的通知。 如需如何建立埠的詳細資訊,請參閱 手動設定實體埠系結至 SQL 配接器。 請確定您為接收埠指定下列系結屬性。
重要
如果您在設計階段指定系結屬性,則不需要執行此步驟。 在這種情況下,您可以匯入取用配接器服務增益集所建立的系結檔案,藉此建立 WCF 自訂或 WCF-SQL 接收埠,並設定必要的系結屬性。 如需詳細資訊,請參閱 使用埠系結檔案設定實體埠系結以使用 SQL 配接器。
Binding 屬性 值 InboundOperationType 將此設定為 [通知]。 NotificationStatement 將此設定為:
SELECT Employee_ID, Name FROM dbo.Employee WHERE Status=0
注意: 您必須特別指定 語句中的資料行名稱,如這個 SELECT 語句所示。 此外,您也必須一律指定資料表名稱以及架構名稱。 例如:dbo.Employee
。NotifyOnListenerStart 將此設定為 True。 如需不同系結屬性的詳細資訊,請參閱閱讀 BizTalk Adapter for SQL Server配接器系結屬性。
注意
建議您在使用 SQL 配接器執行輸入作業時,設定交易隔離等級和交易逾時。 您可以藉由在設定 WCF-Custom 或 WCF-SQL 接收埠時新增服務行為來執行此動作。 如需如何新增服務行為的指示,請參閱 使用 SQL 設定交易隔離等級和交易逾時。
定義硬碟上的位置和對應的檔案埠,BizTalk 協調流程會從插入和更新作業的SQL Server資料庫卸載通知訊息。 將此埠設定為將通知訊息卸載至 C:\TestLocation\UpsertNotification 資料夾。
定義硬碟上的位置,以及對應的檔案埠,BizTalk 協調流程會從SQL Server資料庫中卸載所有其他作業的通知訊息。 將此埠設定為將通知訊息卸載至 C:\TestLocation\OtherNotification 資料夾。
啟動應用程式
您必須啟動 BizTalk 應用程式,以接收來自SQL Server資料庫的通知訊息,以及執行後續的選取和更新作業。 如需啟動 BizTalk 應用程式的指示,請參閱 如何啟動協調流程。
在此階段,請確定:
WCF-Custom 或 WCF-SQL 單向接收埠,從SQL Server資料庫接收通知訊息正在執行。
從 SQL Server 接收訊息的兩個 FILE 傳送埠正在執行。
作業的 BizTalk 協調流程正在執行。
執行作業
啟動 BizTalk 協調流程之後,就會進行下列一組動作:
由於 NotifyOnListenerStart 系結屬性設定為 True,因此您會收到下列訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/"> <Info>ListenerStarted</Info> <Source>SqlBinding</Source> <Type>Startup</Type> </Notification>
請注意,標記中的
<Info>
值是 「ListnerStarted」。 因此,此訊息會在 C:\TestLocation\OtherNotification 資料夾中收到。在 Employee 資料表中插入記錄。 您會收到類似下列的通知訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/"> <Info>Insert</Info> <Source>Data</Source> <Type>Change</Type> </Notification>
請注意,標記中的
<Info>
值是 「Insert」。 因此,此訊息會在 C:\TestLocation\UpsertNotification 資料夾中接收。更新 Employee 資料表中的記錄。 您會收到類似下列的通知訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/"> <Info>Update</Info> <Source>Data</Source> <Type>Change</Type> </Notification>
請注意,標記中的
<Info>
值是 「Update」。 因此,此訊息會在 C:\TestLocation\UpsertNotification 資料夾中接收。從 Employee 資料表中刪除記錄。 您會收到類似下列的通知訊息:
<?xml version="1.0" encoding="utf-8" ?> <Notification xmlns="http://schemas.microsoft.com/Sql/2008/05/Notification/"> <Info>Delete</Info> <Source>Data</Source> <Type>Change</Type> </Notification>
請注意,標記中的
<Info>
值是 「Delete」。 因此,此訊息會在 C:\TestLocation\OtherNotification 資料夾中收到。
最佳做法
部署並設定 BizTalk 專案之後,您可以將組態設定匯出至稱為系結檔案的 XML 檔案。 產生系結檔案之後,您可以從檔案匯入組態設定,因此您不需要為相同的協調流程建立傳送埠和接收埠。 如需系結檔案的詳細資訊,請參閱 重複使用配接器系結。
在接收通知訊息之後執行複雜的作業
為了簡單且更瞭解,本主題中的協調流程會根據通知類型,將訊息複製到不同的資料夾。 不過,在真實世界案例中,您可能想要執行更複雜的作業。 您可以執行本主題中提供的類似程式,並加以建置以執行您想要的作業。 例如,如果您在 Employee 資料表上收到 Insert 作業的通知訊息,您可以變更協調流程以在另一個資料表中插入記錄。 在這種情況下,您可以在 [決定] 圖形中進行適當的變更。
教學 課程 2:使用 SQL 配接器的員工 - 採購單程式會詳細說明這類案例。