Share via


處理 Service Broker 錯誤訊息

Service Broker 應用程式必須處理從交談接收的兩種類型之錯誤訊息:由使用 Service Broker 的應用程式建立的錯誤訊息,以及由 Service Broker 建立的系統訊息。

報告應用程式錯誤狀況

Service Broker 應用程式通常是由在不同電腦上非同步執行的程式碼所組成的系統。應用程式部分是透過使用在 Service Broker 交談上傳送的訊息,來進行彼此之間的通訊。在 Service Broker 交談一端的應用程式部分,可以透過傳送錯誤訊息將應用程式錯誤向另一端報告。應用程式的接收方必須有偵錯錯誤訊息的程式碼,並且可正確地處理錯誤狀況。

Service Broker 應用程式可以透過使用系統定義或是應用程式定義的訊息類型,來傳達錯誤。

系統定義的錯誤訊息

使用 END CONVERSATION 陳述式的 WITH ERROR 子句來報告非常嚴重到需要結束交談的應用程式錯誤。例如:

END CONVERSATION @ConversationHandle
    WITH ERROR = 1234 DESCRIPTION = "The account specified in the invoice does not exist, verify the account number."

END CONVERSATION WITH ERROR 陳述式:

接收 Error 訊息的應用程式部分,應該執行任何所需的清除並結束其交談端。

應用程式可以隨時結束含有錯誤的使用中交談。不過,如果交談的遠端已經結束交談,Service Broker 將不會傳送錯誤訊息至遠端。取而代之的是,Service Broker 只會結束交談的本機端,並從本機佇列移除交談的所有訊息。

應用程式定義的錯誤訊息

您可以使用應用程式定義的錯誤訊息,來報告沒有很嚴重到要結束交談的錯誤。應用程式設計工具可以指定下列項目:

  • 用以傳達這些應用程式錯誤的一個或多個訊息類型。

  • 處理這些訊息類型的邏輯。

遇到錯誤狀況的應用程式部分可以執行下列動作:

  • 為交談的本機端執行任何所需的清除。

  • 使用應用程式定義的訊息類型建立訊息,並在交談時傳送它。

接收錯誤訊息的應用程式之遠端,必須具有可辨識錯誤訊息的程式碼,以及在其連接端執行任何所需清除的程式碼。

處理錯誤訊息

從 Service Broker 交談接收訊息的應用程式程式碼,必須具有可處理從交談接收錯誤訊息的邏輯。該程式碼必須偵測和處理下列項目:

  • 由使用應用程式定義的錯誤訊息類型之應用程式所產生的錯誤訊息。

  • 由使用 END CONVERSATION 陳述式的 WITH ERROR 子句之應用程式所產生的錯誤訊息。這些錯誤訊息會使用 https://schemas.microsoft.com/SQL/ServiceBroker/Error 訊息類型,並在 Code 元素中具有正數。

  • Service Broker 所產生的錯誤訊息。這些錯誤訊息會使用 https://schemas.microsoft.com/SQL/ServiceBroker/Error 訊息類型,並且會在 Code 元素中具有負數。當有錯誤使得 Service Broker 無法繼續交談時,Service Broker 會建立 Error 訊息。例如,Service Broker 找不到目的地服務,因為在目前的執行個體中沒有服務,而且在路由表中沒有服務的項目。在此情況下,Service Broker 會為交談建立 Error 訊息。

RECEIVE 陳述式傳回的結果集包含 message_type_name 資料行。接收 Service Broker 訊息的程式碼通常會使用 message_type_name,將每個訊息路由到處理相關聯訊息類型的程式碼。

程式處理錯誤所遵循的正確邏輯,須視應用程式而定。像這樣的範例是使用訊息保留的程式,並且會在工作失敗時需要補償交易。當收到錯誤時,程式會查詢已經處理的訊息佇列、執行補償交易,然後結束交談。相反的,如果程式只需要記錄發生的錯誤,則程式會將錯誤記錄到記錄資料表並結束交談。

https://schemas.microsoft.com/SQL/ServiceBroker/Error 訊息的 Code 元素包含錯誤碼。由使用 END CONVERSATION WITH ERROR 之應用程式所建立的 Error 訊息,其錯誤碼為正值。由 Service Broker 產生的 Error 訊息,包含錯誤碼的負值。由 Service Broker 所產生的訊息中之 Code 值,便是造成 Error 訊息之錯誤負值。例如,當 XML 驗證錯誤 (錯誤碼 9615) 發生時,Database Engine 會建立具有 Code 元素 (含有值 -9615) 的 Error 訊息。

一旦應用程式收到 Error 訊息,程式就不會再傳送有關該交談的訊息。應用程式會處理錯誤,然後結束其交談端。如果應用程式收到應用程式定義的錯誤訊息類型,除非應用程式的遠端也執行 END CONVERSATION,否則交談仍然可以使用。

錯誤處理常式應該以這樣的方式來撰寫程式碼,以防止有害訊息。如需詳細資訊,請參閱<處理有害訊息>。