Azure函数CloudQueue AddMessageAsync QueueRequestOptions LinearRetryPolicy不执行任何操作

时间:2019-03-12 06:29:25

标签: c# azure azure-functions

我正在尝试为云队列实施线性重试策略。以前,我是通过编程方式管理每个出队的重试逻辑,但是我看到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);

2 个答案:

答案 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。

希望这可以帮助那些同样困惑的人。