共用方式為


使用 Service Broker 建立應用程式

可執行 Transact-SQL 陳述式的任何程式都可以使用 Service Broker。Service Broker 應用程式可以做為在 SQL Server 之外執行的程式來實作,或做為使用 Transact-SQL 或 .NET 語言撰寫的預存程序來實作。

通常,使用 Service Broker 的程式由一起運作來完成某項工作的數個元件所組成。起始交談的程式會建立訊息並將其傳送至另一個服務。該程式可能會等待回應,也可能會立即結束而依賴於另一個程式來處理回應。如果某個服務是交談的目標,則程式會從該服務的佇列接收內送訊息、讀取訊息資料、執行一切必要的處理,然後建立並傳送回應訊息 (如有必要)。

Service Broker 擴充了 Transact-SQL。應用程式不需要特殊物件模型或程式庫,就可以使用 Service Broker。但是,程式會將 Transact-SQL 命令傳送至 SQL Server,並處理這些命令的結果。應用程式可以由 Service Broker 啟動、可以做為背景服務也可以做為排程作業來執行,或者還可以啟動來回應事件。如需有關啟動使用 Service Broker 的應用程式之策略的詳細資訊,請參閱<選擇啟動策略>。

如需有關使用 Service Broker 建立應用程式的資訊,請參閱<使用 Service Broker 進行程式設計的優點>。

Service Broker 應用程式概觀

下圖顯示使用 Service Broker 之應用程式中的互動:

交談中訊息的關聯性和流程

如圖所示,首先建立 SubmitExpenseAcceptDenyExpenseReimbursementIssued 訊息類型。ProcessExpenses 合約會以這些訊息類型為基礎建立,它提供結構描述用以完成費用補償工作的交談。ProcessExpenses 合約管理 ProcessExpense 服務與 SubmitExpense 服務之間的所有交談。ProcessExpenses 合約及其使用的訊息類型,必須存在於以此合約為基礎所進行交談之所有服務的資料庫中。

Service Broker 會將傳送至 SubmitExpense 服務的訊息儲存於該服務的佇列上。ExpenseSubmission 預存程序會從此佇列接收訊息、對其進行處理,並在需要回覆時將訊息傳送至另一個服務。

Service Broker 會將傳送至 ProcessExpense 服務的訊息儲存於該服務的佇列上。ExpenseProcessing 預存程序會從此佇列接收訊息、對其進行處理,並在需要回覆時將訊息傳送至另一個服務。

這兩個服務之間的交談將以下列方式建構:

  • 使用者透過使用者介面提交費用補償要求。應用程式執行 ExpenseSubmission 預存程序,這會建立 SubmitExpense 訊息。SubmitExpense 服務啟動與 ProcessExpense 服務的交談,然後將 SubmitExpense 訊息傳送至 ProcessExpense 服務。

  • Service Broker 接收 ProcessExpense 服務的 SubmitExpense 訊息,並將訊息加入 ExpenseQueue 佇列。ExpenseQueue 佇列啟動 ProcessExpense 預存程序,這會將 SubmitExpense 訊息從佇列中移除並對其進行處理。然後,ProcessExpense 預存程序會建立 AcceptDenyExpense 訊息,並將此訊息傳送至 SubmitExpense 服務。如果拒絕費用,則 ProcessExpense 預存程序會結束交談。

  • Service Broker 將 SubmitExpense 服務的 AcceptDenyExpense 訊息加入該服務的佇列。如果 ProcessExpense 程序結束交談,則 Service Broker 會將 EndDialog 訊息加入 Expenses 佇列。佇列啟動 ExpenseSubmission 預存程序,這會將 AcceptDenyExpense 訊息從佇列中移除並對其進行處理。如果 ExpenseSubmission 預存程序在佇列中發現 EndDialog 訊息,則該程序會結束交談。

  • 如果接受費用,則 ProcessExpense 服務會建立並傳送確認費用支付已發出的 ReimbursementIssued 訊息,然後結束交談。Service Broker 會將這些訊息加入該服務的佇列。佇列啟動 ExpenseSubmission 程序,該程序會處理 ReimbursementIssued 訊息。然後,該程序會處理 EndDialog 訊息,並結束交談。