Share via


開發RPC-Message佇列應用程式

在 RPC 應用程式中利用 MSMQ 傳輸需要非常少的心力。 針對同步傳訊,您只需要指定訊息佇列 傳輸 (ncadg_mq) 作為通訊協定順序。 ncadg_mq通訊協定支援廣播呼叫以外的所有標準資料包功能。 此外,請注意,目前訊息佇列傳輸不支援動態端點。

藉由將 [message] 屬性套用至 IDL 檔案中的遠端程式宣告,您會自動實作這些呼叫的非同步模式訊息佇列。 這可讓用戶端和伺服器應用程式控制與訊息和訊息佇列相關聯的許多屬性,包括:

  • 服務品質
  • 回條的通知
  • 日誌記錄
  • 通話優先順序
  • 伺服器進程佇列的持續性

服務品質是傳輸將呼叫傳遞給伺服器進程的工作。 快速傳遞會在記憶體中排入佇列,因此相當快,但如果電腦或網路連線在錯誤時關閉,呼叫將會遺失。 可復原的傳遞將會張貼到磁片檔案,直到傳遞磁片檔案為止,因此即使遇到電腦當機,呼叫也不會遺失。 這可提供保證的傳遞,但因為每個呼叫都會寫入磁片,因此會以效能為代價。

您也可以告訴 MSMQ 傳輸在傳回之前,先等候呼叫到達目的地 (伺服器) 佇列的通知。 選擇此選項會封鎖用戶端,直到伺服器認可呼叫為止,否則控制項會在進行呼叫時立即返回用戶端。

藉由使用日誌功能,即可將通話記錄到磁片。 如果日誌功能已開啟,則每個呼叫都會記錄到磁片,因為其傳輸至伺服器進程的下一個躍點。

呼叫優先順序可以與 RPC [message] 函式屬性搭配使用,以允許優先順序較高的呼叫優先于優先順序較低的呼叫,即使高優先順序呼叫稍後抵達也一樣。 呼叫優先順序也會以有限的方式使用同步 RPC,但同步 RPC 呼叫無法以與非同步呼叫相同的方式堆疊。

用戶端進程會藉由呼叫 RpcBindingSetOption控制上述所有屬性。 設定之後,這些屬性會維持有效狀態,直到它們在另一個 RpcBindingSetOption呼叫中變更為止。

RPC 伺服器進程可以控制其接收佇列的存留期。 根據預設,伺服器進程結束時會刪除佇列。 不過,伺服器進程可以在設定其端點時使用 RpcServerUseProtseqEpEx ,以告知傳輸允許佇列繼續存在,即使伺服器進程未執行也接受呼叫要求。 在此情況下,當伺服器進程重新上線時,呼叫會排入佇列並執行。

注意

如果您在介面中使用非同步 [message] 呼叫,您必須先呼叫RpcServerRegisterIfRpcServerRegisterIfEx,再呼叫RpcServerUseProtseqEpEx (ncadg_mq) 來註冊介面。 開啟通訊協定序列之後,任何已經等候伺服器佇列的呼叫都會開始讀取佇列。 如果對應的 RPC 介面尚未註冊,呼叫將會失敗。 如果您已設定遠端程序呼叫的永久端點、伺服器已關閉,而且用戶端已繼續將呼叫傳送至伺服器,就會發生這種情況。 這些呼叫會堆疊在佇列中,等候在伺服器重新上線之後讀取。

 

如需詳細資訊,請參閱 RpcBindingSetOptionRpcServerUseProtseqEpEx和 [message], ncadg_mq