编写使用队列来发送和接收消息的代码

已完成

分布式应用程序使用服务总线队列作为临时的存储位置,存储等待传递到目标组件的消息。 若要通过队列发送和接收消息,必须在源和目标组件中编写代码。

以 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);