Azure Service Bus BrokeredMessage的序列化

时间:2014-10-25 19:59:05

标签: c# .net azure-servicebus-queues

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

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

那么,我如何序列化BrokeredMessage,以便在反序列化后可以更新它的锁定?

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

2 个答案:

答案 0 :(得分:2)

根据Azure Service Bus REST API reference,续订操作需要MessageId和LockToken,这两者都可用作BrokeredMessage对象的属性。您应该可以使用这些来启动REST请求以续订锁定。

答案 1 :(得分:0)

你需要放弃一个消息就是锁定令牌,它只是一个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);
}