Azure服务总线代理消息的序列化

本文关键字:序列化 消息 代理 服务 总线 Azure | 更新日期: 2023-09-27 18:27:59

我有一个无状态RESTful服务,它将Peek&锁定Azure服务总线队列。在它收到消息后,它会将消息转发给将处理该消息的客户端。客户端处理该消息可能需要比锁定超时更长的时间。

客户端无法直接与队列对话,我不希望向服务添加任何状态。相反,我想向客户端发送足够的信息,以便他们可以将其发回,并且服务可以代表他们续订锁定。

那么,我如何序列化BrokeredMessage,以便在反序列化后续订它的锁呢?

或者,是否有某种方法可以获得BrokeredMessage的令牌,以便仅使用该令牌(而不是整个消息)续订锁定或从队列中删除消息?

Azure服务总线代理消息的序列化

根据Azure Service Bus REST API引用,续订操作需要MessageId和LockToken,这两个都可以作为BrokeredMessage对象上的属性使用。您应该能够使用这些来触发REST请求来续订您的锁。

您只需要放弃一个消息的锁定令牌,它只是一个Guid,因此它可以很好地序列化。使用Azure Service Bus SDK(通过NuGet),如果在包含一条消息的队列上连续运行多次,则以下测试将通过。如果删除queueClient.Abandon(lockToken)行,则在第一次运行后的每次运行中测试都将失败,直到锁定超时(默认为1分钟)。这是因为brokeredMessage为null,因为只要队列中的一条消息锁定,就没有可用的消息可供接收

[Fact]
public void receive_lock_abandon()
{
    const String connectionString = "Endpoint=sb://stayupdated.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=X/LX7IFHLADiAMgn5zGoSlCYCriwa68An1hijB3rGXQ=";
    const String queueName = "TestQueue";
    var receiveClient = QueueClient.CreateFromConnectionString(connectionString, queueName);
    var brokeredMessage = receiveClient.Receive(TimeSpan.FromSeconds(1));
    var serializedLockToken = brokeredMessage.LockToken.ToString();
    var lockToken = Guid.ParseExact(serializedLockToken, "D");
    var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName);
    queueClient.Abandon(lockToken);
}