停止和啟動 Service Broker 應用程式
有時候有必要暫時停止 Service Broker 應用程式。例如,您可能會停止忙碌的應用程式,以安裝佇列之啟動預存程序的更新版本。雖然您可以在不停止應用程式的情況下改變佇列,但是目前正在執行的啟動預存程序副本可能永遠也執行不完要處理的訊息,因此就可能永遠也不會結束。在此情況下,停止佇列會使正在執行的預存程序立即結束。當您再次啟動此服務時,Service Broker 會啟動更新的啟動預存程序。
此章節中的資訊適用於因維護而暫時停止應用程式的情況。如需有關從資料庫中永久移除服務的詳細資訊,請參閱<解除安裝 Service Broker 應用程式>。
若要暫時停止服務,請改變應用程式所用的佇列,使佇列狀態為 OFF。當佇列狀態為 OFF 時,佇列將無法接收作業,因而能有效地停止應用程式。Service Broker 不會將新的訊息傳遞至佇列,也不允許應用程式接收來自佇列的訊息。當應用程式嘗試從不可用的佇列接收訊息時,會接收到 Transact-SQL 錯誤。不論交談所用的佇列可用與否,應用程式都可以隨時在交談上呼叫 END CONVERSATION 。不過,在佇列可用之前,Service Broker 不會將「結束對話」訊息傳遞至遠端服務。
當訊息到達已停止佇列時,Service Broker 會在資料庫的傳輸佇列中保留這些訊息,直到目的地佇列可用為止。Service Broker 不會將訊息到達已停止佇列視為錯誤,也不會通知發送者。當佇列可用時,Service Broker 會將傳輸佇列中的訊息傳遞至服務佇列。此傳遞使用一般重試邏輯處理訊息。訊息在傳輸佇列中標示為已延遲,並會定期重試。Service Broker 會在傳輸佇列中保留這些訊息並延遲處理,不論訊息源自與該佇列相同的執行個體還是來自網路。
停止佇列並不會重設交談計時器,也不會重設佇列中訊息的對話存留時間計時器。如果佇列停止時某種計時器過期,Service Broker 會在佇列重新啟動時產生適當的訊息。
若要重新啟動此應用程式,請改變應用程式所用佇列,使其狀態為 ON。這會啟動佇列。當佇列指定了啟動預存程序且佇列包含訊息時,Service Broker 會在佇列啟動時立即啟動啟動預存程序。因為佇列目前可用,所以 Service Broker 也會產生在該佇列停止時過期之交談計時器和對話存留時間計時器的訊息。對於不使用啟動的應用程式,使用為該應用程式定義的啟動程序重新啟動應用程式。