伺服器端錯誤
接聽程式和播放機會共同處理有害訊息。 如果正在播放的交易失敗, 消息佇列 會將輸入訊息移回輸入佇列。 如果玩家從伺服器元件收到失敗的 HRESULT,或攔截到例外狀況,玩家就會中止交易。 如果問題持續發生,接聽程式可能會以下列模式連續迴圈:
- 清除佇列訊息
- 具現化物件
- 遭受回復
- 將訊息放回佇列頂端
佇列元件服務會使用一系列應用程式特定的重試佇列來處理此失敗。 安裝元件時建立,每個應用程式都有七個佇列,如下所示:
一般輸入佇列。 此佇列的名稱是 COM+ 應用程式名稱。 這是消息佇列公用佇列。
第一個重試佇列。 如果交易在處理來自一般輸入佇列的訊息時重複失敗,則會在此移動訊息。 此佇列上的訊息會在一分鐘后處理。 訊息可以在此佇列上重試三次,然後再移至第二個重試佇列的後部。 此佇列名為 ApplicationName_0。 此佇列是私人消息佇列。
第二個重試佇列。 如果交易在第一次重試佇列中處理訊息時重複失敗,則會在此移動訊息。 此佇列上的訊息會在兩分鐘后處理。 在此佇列上可以重試三次訊息,再移至第三個重試佇列的後面。 此佇列名為 ApplicationName_1。 此佇列是私人消息佇列。
第三個重試佇列。 如果交易在第二個重試佇列中處理訊息時重複失敗,則會在此移動訊息。 此佇列上的訊息會在四分鐘后處理。 此佇列上可以重試三次訊息,再移至第四個重試佇列的後面。 此佇列名為 ApplicationName_2。 此佇列是私人消息佇列。
第四個重試佇列。 如果交易在處理來自第三個重試佇列的訊息時重複失敗,則會在此移動訊息。 此佇列上的訊息會在八分鐘后處理。 在此佇列上可以重試三次訊息,再移至第五個重試佇列。 此佇列名為 ApplicationName_3。 此佇列是私人消息佇列。
第五個重試佇列。 如果交易在處理來自第四個重試佇列的訊息時重複失敗,則會在此移動訊息。 此佇列上的訊息會在 16 分鐘後處理。 在此佇列上可以重試三次訊息,再移至最後的待用佇列。 此佇列名為 ApplicationName_4。 這是私人消息佇列。
應用程式特定的最終待用佇列。 如果交易在第五個重試佇列上嘗試時重複中止,則會在此移動訊息。 此佇列名為 ApplicationName_DeadQueue。 這是私人消息佇列。 最後的休息佇列不是由佇列接聽程序服務。 訊息會保留在手動移動之前(可能是由佇列元件訊息行動器公用程式)或由消息佇列總管清除。
無法播放的訊息,因為很明顯,每個重試嘗試都會失敗,可以直接移至應用程式特定的最終休息佇列,而不會透過所有重試層級進階。
玩家會發出 COM+ 事件,通知有興趣的各方無法播放訊息。 COM+ 事件會在下列情況下發出:
- 交易中止時
- 當訊息從一個佇列移至另一個佇列時
- 當訊息儲存至最終休息佇列時
訊息可以在從一個佇列移至另一個佇列之前進行修改。 COM+ 佇列元件安全性機制可讓訊息移至重試佇列,然後重新插入應用程式的初始輸入佇列。 如需佇列元件安全性的詳細資訊,請參閱 佇列元件安全性。
當應用程式被元件服務管理工具標示為佇列,或使用 COM+ 管理員 istrative SDK 函式時,會與主要應用程式佇列一起建立重試佇列。 佇列元件服務允許在重試機制中彈性,方法是允許刪除重試佇列。 例如,如果刪除所有重試佇列,就會將持續中止的訊息從應用程式佇列直接移至應用程式特定的最終待用佇列。 藉由移除一或多個重試佇列,可以減少重試的數目和長度。 如果佇列從重試順序中移除,其餘佇列的時機會對應至重試佇列序列中的位置。 例如,如果您移除重試佇列 ApplicationName_1、ApplicationName_2 和 ApplicationName_3,ApplicationName_4 上的訊息就會像佇列是第二個重試佇列一樣處理。
如果可能的話,重試機制的設計目的是要完成訊息。 在某些情況下,訊息可能無法成功。 例如,客戶可能嘗試從資金不足的帳戶提取資金。 在這些情況下,您可以透過數種方式來處理錯誤,包括下列各項:
- 產生診斷併發出警告
- 建立補償交易
- 忽略問題並關閉訊息
如同客戶端持續性失敗,佇列元件服務允許例外狀況類別與元件相關聯。 例外狀況類別會使用元件服務管理工具的元件屬性頁面中的 [進階] 索引卷標,或使用 COM+ 管理員 istrative 函式來與元件產生關聯。 例外狀況類別可讓開發人員控制在重試訊息之後,以及該訊息移至應用程式特定的最終待用佇列之前。 如需例外狀況類別的詳細資訊,請參閱 持續性客戶端失敗。
以下是伺服器端例外狀況處理的事件序列:
- 訊息會透過可用的應用程式特定重試佇列移動。
- 上次重試佇列的最後一次重試失敗。
- 佇列元件服務運行時間會從訊息擷取目標元件,並檢查例外狀況類別。
- 運行時間會具現化例外狀況類別。
- 運行時間會在例外狀況類別上查詢 IPlaybackControl。
- 運行時間會在例外狀況類別中呼叫 IPlaybackControl::FinalServerRetry。
- 運行時間會將訊息的所有屬性和方法呼叫播放回例外狀況類別。
- 如果步驟 4 到 6 沒有成功,運行時間會將訊息移至應用程式特定的最終待用佇列。
如果您需要介入上述程式,或您需要將有害訊息從其最終休息佇列移出,請使用訊息行動器公用程式。 如需訊息行動器公用程式的詳細資訊,請參閱 處理錯誤。
相關主題