撰寫程式碼以使用佇列來傳送及接收訊息

已完成

分散式應用程式使用服務匯流排佇列,供等候傳遞至目的地元件的訊息作為暫存位置。 若要透過佇列來傳送及接收訊息,您必須在來源與目的地元件中撰寫程式碼。

請考慮 Contoso Bicycles 應用程式。 客戶可透過網站或行動應用程式下訂單。 由於網站與行動應用程式是在客戶裝置上執行,因此一次可下多少訂單並沒有任何限制。 透過讓行動應用程式與網站將訂單放置在服務匯流排佇列中,我們可以讓後端元件 (Web 應用程式) 以自己的步調處理該佇列中的訂單。

Contoso Bicycles 應用程式實際上會以數個步驟處理新訂單。 所有步驟都依存於第一個授權付款,因此您決定使用佇列。 接收端元件的第一個作業正在處理付款。

在行動應用程式和網站中,Contoso 需要撰寫將訊息新增至佇列的程式碼。 在後端 Web 應用程式中,Contoso 會撰寫從佇列中收取訊息的程式碼。

在這裡,您將查看撰寫程式碼以使用服務匯流排佇列來傳送及接收訊息的程序與考量。

Azure.Messaging.ServiceBus NuGet 套件

為了方便撰寫透過服務匯流排傳送及接收訊息的程式碼,Microsoft 提供了一個 .NET 類別庫。 您可以使用任何 .NET 語言來與服務匯流排佇列或主題互動。 您可以新增 Azure.Messaging.ServiceBus NuGet 套件,以將此程式庫納入您的應用程式中。

連接字串和金鑰

來源元件和目的地元件都需要這兩個資訊,以連線至服務匯流排命名空間中的佇列:

  • 服務匯流排命名空間位置,也稱為端點:此位置會指定為 servicebus.windows.net 網域內的完整網域名稱。 例如:bicycleService.servicebus.windows.net
  • 存取金鑰:服務匯流排會透過要求有效存取金鑰,來限制對佇列或主題的存取權。

這兩個資訊都會以連接字串的形式提供給 ServiceBusClient 物件。 您可以從 Azure 入口網站取得命名空間的正確連接字串。

以非同步方式呼叫方法

Azure 中的佇列可能會與傳送端和接收端元件相距數千英哩。 即使實際上很接近,當元件對佇列呼叫方法時,緩慢的連線和頻寬競爭仍可能導致延遲的狀況。 因此,服務匯流排用戶端程式庫提供了可用來與佇列互動的 async 方法。 我們將使用這些方法,來避免在等待呼叫完成時封鎖了執行緒。

例如,將訊息傳送至佇列時,可以使用具有 await 關鍵字的 SendMessageAsync 方法。

將訊息傳送至佇列

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

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

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

接著,請建立新的 ServiceBusClient 物件,並對其傳遞連接字串和佇列名稱。

// Create a ServiceBusClient object using the connection string to the namespace.
await using var client = new ServiceBusClient(connectionString);
    
// Create a ServiceBusSender object by invoking the CreateSender method on the ServiceBusClient object, and specifying the queue name. 
ServiceBusSender sender = client.CreateSender(queueName);

您可以透過呼叫 ServiceBusSender.SendMessageAsync() 方法並傳遞 ServiceBusMessage,來將訊息傳送至佇列。

// Create a new message to send to the queue.
string messageContent = "Order new crankshaft for eBike.";
var message = new ServiceBusMessage(messageContent);

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

從佇列接收訊息

若要接收訊息,您必須先註冊訊息處理常式。 訊息處理常式是您程式碼中的方法,當佇列上有可用訊息時將叫用此方法。

// Create a ServiceBusProcessor for the queue.
await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
    
// Specify handler methods for messages and errors.
processor.ProcessMessageAsync += MessageHandler;
processor.ProcessErrorAsync += ErrorHandler;

執行處理工作。 然後,在訊息處理常式內,呼叫 ProcessMessageEventArgs.CompleteMessageAsync() 方法以從佇列中移除訊息。

await args.CompleteMessageAsync(args.Message);