我有一个无状态的RESTful服务,它将从Azure服务总线队列中窥探和锁定。当它得到消息后,它将把消息转发给将处理它的客户端。客户端处理消息的时间可能会超过锁定超时时间。
客户端不能直接与队列对话,我希望不向服务添加任何状态。相反,我希望向客户端发送足够的信息,以便他们可以将其发回,并且服务可以代表他们更新锁。
那么,我如何序列化一个BrokeredMessage,以便在反序列化它之后可以更新它的锁呢?
或者,是否有方法可以为BrokeredMessage获取令牌,以便只使用该令牌(而不是整个消息)来更新锁或从队列中删除消息?
发布于 2014-12-06 11:08:22
根据Azure REST引用,更新操作需要MessageId和LockToken,它们都可以作为BrokeredMessage对象的属性使用。您应该能够使用这些来触发REST请求来更新您的锁。
发布于 2014-12-08 01:47:42
您所需要放弃的消息就是锁令牌,它只是一个Guid,因此它很好地序列化了。使用(通过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);
}https://stackoverflow.com/questions/26566647
复制相似问题