0

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

客户端无法直接与队列交谈,我宁愿不向服务添加任何状态。相反,我想向客户端发送足够的信息,以便他们可以将其发回,并且服务可以代表他们更新锁定。

那么,如何序列化 BrokeredMessage 以便在反序列化后更新锁定呢?

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

4

2 回答 2

2

根据 Azure 服务总线REST API 参考,更新操作需要 MessageId 和 LockToken,这两者都可用作 BrokeredMessage 对象的属性。您应该能够使用它们来触发 REST 请求以更新您的锁。

于 2014-12-06T11:08:22.647 回答
0

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

[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);
}
于 2014-12-08T01:47:42.867 回答