[英]Serialization of Azure Service Bus BrokeredMessage
我有一个无状态的RESTful服务,它将窥视和锁定Azure Service Bus队列。 收到消息后,它将把消息转发给处理消息的客户端。 客户端可能花费比锁定超时更长的时间来处理消息。
客户端无法直接与队列对话,我希望不向服务添加任何状态。 相反,我想向客户端发送足够的信息,以便他们可以将其发送回去,并且服务可以代表他们续订锁。
那么,如何序列化BrokeredMessage,以便在反序列化之后可以续订它呢?
或者,是否可以通过某种方式获取BrokeredMessage的令牌,以便可以仅使用该令牌(而不是整个消息)来更新锁或从队列中删除消息?
根据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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.