使用主題撰寫程式碼以傳送和接收訊息

已完成

在分散式應用程式中,某些訊息必須傳送至單一收件者元件。 其他訊息則需要送達多個目的地。

請考量當使用者取消自行車訂單時發生的情況。 取消訂單與下訂單稍有不同。 當下訂單時,工作流程會等候訂單結清付款處理完成後,再將訂單傳送至本地店面。 針對取消作業,您要同時通知店面「和」付款處理者。 這種方法可盡可能避免浪費外送人員的時間。

為了讓多個元件能夠接收相同的訊息,您會使用 Azure 服務匯流排主題。 接下來,您將探討撰寫程式碼的程序和考量事項。

具主題的程式碼與具佇列的程式碼之間的差異

如果您希望傳送的每個訊息都會傳遞至所有訂閱元件,請使用主題。 撰寫使用主題的程式碼可用來取代佇列。 您將會使用相同的 Azure.Messaging.ServiceBus NuGet 套件、設定連接字串,並使用非同步的程式設計模式。

您也會使用相同的 ServiceBusClient 類別和 ServiceBusSender 類別來傳送訊息,並使用 ServiceBusProcessor 類別來接收訊息。

設定訂用帳戶上的篩選條件

如果您想要將傳送至主題的特定訊息傳遞至特定訂用帳戶,您可以將一或多個篩選條件放置於主題中的訂用帳戶。 以自行車應用程式為例,店面執行的是通用 Windows 平台 (UWP) 應用程式。 每個商店可以訂閱 OrderCancellation 主題和自己 StoreId 的篩選條件。 您會節省網際網路頻寬,原因是您不會將不必要的訊息傳送至多個商店位置。 同時,付款處理元件會訂閱所有 OrderCancellation 訊息。

篩選條件可為下列三種類型之一:

  • 布林值篩選條件TrueFilter 可確保傳送至主題的所有訊息都會傳遞至目前的訂用帳戶。 FalseFilter 可確保不會有任何訊息傳遞至目前的訂用帳戶 (實際上,這等於將訂用帳戶封鎖或關閉)。
  • SQL 篩選條件:SQL 篩選條件會使用和 SQL 查詢中的 WHERE 子句相同的語法來指定條件。 僅當依據此篩選條件進行評估時傳回 True 的訊息,才會傳遞給訂閱者。
  • 相互關聯篩選條件:相互關聯篩選條件有一組條件,會針對每個訊息的屬性進行比對。 如果篩選條件中的屬性和訊息上的屬性有相同值,系統便會將其視為相符。

針對您的 StoreId 篩選條件,您「可以」使用 SQL 篩選條件。 SQL 篩選條件的彈性最大,但也最耗費計算資源,且篩選條件可能會讓服務匯流排的傳送量變慢。 在此情況下,您可以選擇相互關聯篩選條件。

將訊息傳送給主題

若要將訊息傳送至主題,請完成下列步驟。

在任何傳送或接收元件中,請將下列 using 陳述式新增至呼叫服務匯流排主題的任何程式碼檔案。

using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

若要傳送訊息,請先建立新的 ServiceBusClient 物件,並對其傳遞連接字串和主題名稱。

await using var client = new ServiceBusClient(connectionString);

然後,對 ServiceBusClient 物件叫用 CreateSender 方法並指定主題名稱,以建立 ServiceBusSender 物件。

ServiceBusSender sender = client.CreateSender(topicName);

您可以透過呼叫 ServiceBusSender.SendMessageAsync() 方法並傳遞 ServiceBusMessage,將訊息傳送至主題。 如同在佇列中的操作,訊息則必須採用 UTF-8 編碼字串的格式。

string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);

// Send the message to the topic.
await sender.SendMessageAsync(message);

自訂用帳戶接收訊息

若要自訂用帳戶接收訊息,您必須建立 ServiceBusProcessor 物件,並將主題名稱和訂用帳戶名稱傳遞至其中。

processor = client.CreateProcessor(topicName, subscriptionName, options);

然後,註冊訊息處理常式和錯誤處理常式。

// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;

// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;

在訊息處理常式內執行您的處理工作,然後呼叫 ProcessMessageEventArgs.CompleteMessageAsync() 方法以從訂用帳戶中移除訊息。

// Complete the message. The message is deleted from the subscription. 
await args.CompleteMessageAsync(args.Message);