我正在尝试为云队列实施线性重试策略。以前,我是通过编程方式管理每个出队的重试逻辑,但是我看到QueueRequestOptions上的RetryPolicy成员,并认为我可以在第一次添加时设置重试策略,并让云队列自动管理重试。不幸的是,下面的代码似乎没有任何作用。它仍然几乎立即重试,并且重试5次。我尝试将其设置为on创建,但这也行不通。
我想念什么?
谢谢!
await cloudQueue.CreateIfNotExistsAsync();
var linearRetryPolicy = new LinearRetry(TimeSpan.FromMinutes(5), 1);
var options = new QueueRequestOptions { RetryPolicy = linearRetryPolicy };
await cloudQueue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(queueItem)), null, null, options, null);
答案 0 :(得分:0)
RetryPolicy实际上是一个委托,在评估时返回Microsoft.WindowsAzure.StorageClient.ShouldRetry委托,它提供了一种轻量级的机制来以受控方式构造全状态重试实例。每次操作开始时,它将评估RetryPolicy,这将导致CLR在幕后创建一个状态对象,其中包含用于配置策略的参数。
简单线性重试策略示例
public static RetryPolicy LinearRetry(int retryCount, TimeSpan intervalBetweenRetries)
{
return () =>
{
return (int currentRetryCount, Exception lastException, out TimeSpan retryInterval) =>
{
// Do custom work here
// Set backoff
retryInterval = intervalBetweenRetries;
// Decide if we should retry, return bool
return currentRetryCount < retryCount;
};
};
}
内部代码
return () => {
}
符合Microsoft.WindowsAzure.StorageClient.ShouldRetry委托的签名,并将包含实现的细节。
一旦您按照上述方法构建了重试策略,就可以配置客户端以通过
使用它Cloud[Table/Blob/Queue].Client.RetryPolicy = LinearRetry(<retryCount, intervalBetweenRetries>).
对我有用。希望对您有所帮助。
答案 1 :(得分:0)
我问了一位同事,他建议重试策略可能与尝试将消息添加到队列中有关,而不是与处理队列中的消息有关。
我通过实现IRetryPolicy进行了测试,然后在调用AddMessageSync之前禁用了存储模拟器。每次尝试将消息添加到队列失败后,肯定会调用ShouldRetry。
希望这可以帮助那些同样困惑的人。