C# Azure函数CloudQueue AddMessageAsync QueueRequestOptions LineareTropolicy不';我什么也不做

C# Azure函数CloudQueue AddMessageAsync QueueRequestOptions LineareTropolicy不';我什么也不做,c#,azure,azure-functions,C#,Azure,Azure Functions,我正在尝试为云队列实现线性重试策略。以前,我在每个出列上都以编程方式管理重试逻辑,但我在QueueRequestOptions上看到了RetryPolicy成员,并认为我可以在第一次添加时设置重试策略,并让云队列自动管理重试。不幸的是,下面的代码似乎没有任何作用。它仍然几乎立即重试,并且重试了5次。我试着将它设置在“创建”上,但它也不起作用 我错过了什么 谢谢 await cloudQueue.CreateIfNotExistsAsync(); var linearRetryPolicy =

我正在尝试为云队列实现线性重试策略。以前,我在每个出列上都以编程方式管理重试逻辑,但我在QueueRequestOptions上看到了RetryPolicy成员,并认为我可以在第一次添加时设置重试策略,并让云队列自动管理重试。不幸的是,下面的代码似乎没有任何作用。它仍然几乎立即重试,并且重试了5次。我试着将它设置在“创建”上,但它也不起作用

我错过了什么

谢谢

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);

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;          

           };
      };
}
符合Microsoft.WindowsAzure.StorageClient.ShouldRetry委托的签名,并将包含实现的详细信息

一旦构建了如上所述的重试策略,就可以通过配置客户端来使用它

Cloud[Table/Blob/Queue].Client.RetryPolicy = LinearRetry(<retryCount, intervalBetweenRetries>).
Cloud[Table/Blob/Queue].Client.RetryPolicy=LinearRetry()。

这对我有用。希望有帮助。

我向一位同事询问了这一点,他建议重试策略可能与尝试将消息添加到队列有关,而不是与尝试处理来自队列的消息有关

我通过实现IRetryPolicy,然后在调用AddMessageSync之前禁用存储模拟器来测试这一点。在每次尝试将消息添加到队列失败后,都会调用Sure-enough ShouldRetry


希望这能帮助那些同样感到困惑的人。

您好,这似乎不适用于我所处的情况,因为我在队列对象上没有客户机,而是ServiceClient。服务客户机没有RetryPolicy,尽管DefaultRequestOptions中有一个RetryPolicy,但它不接受委托,而是接受一个IRetryPolicy实例。谢谢你的帮助!
Cloud[Table/Blob/Queue].Client.RetryPolicy = LinearRetry(<retryCount, intervalBetweenRetries>).