Azure Functions CloudQueue AddMessageAsync 队列请求选项 LinearRetryPolicy 不起作用

3

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

2
我问了一位同事,他建议重试策略可能与将消息添加到队列而不是处理队列中的消息的尝试有关。我通过实现IRetryPolicy并在调用AddMessageSync之前禁用存储仿真器来测试了这一点。果然,在每次添加消息到队列失败后都会调用ShouldRetry。希望这可以帮助任何感到困惑的人。最初的回答。

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

这对我有用。希望能帮到你。


嗨,这似乎不适用于我的情况,因为我在队列对象上没有客户端,而是一个ServiceClient。而且服务客户端没有RetryPolicy,尽管在DefaultRequestOptions中有一个RetryPolicy,但它不是采用委托,而是采用IRetryPolicy实例。谢谢你的帮助! - Okkio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接