Функции Azure CloudQueue AddMessageAsync QueueRequestOptions LinearRetryPolicy ничего не делает - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь реализовать линейную политику повторов для облачной очереди. Ранее я управлял логикой повторных попыток программно для каждой очереди, но я видел элемент RetryPolicy в QueueRequestOptions и думал, что смогу настроить политику повторных попыток при первом добавлении, и облачная очередь будет управлять повторными попытками автоматически. К сожалению, приведенный ниже код, похоже, ничего не делает. Он все еще повторяется почти сразу и повторяется 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 ]

0 голосов
/ 18 марта 2019

Я спросил коллегу об этом, и он предположил, что политика повторных попыток, вероятно, относится к попыткам добавить сообщение в очередь, а не к попыткам обработать сообщение из очереди.

Я проверил это, реализовав IRetryPolicy и затем отключив эмулятор хранилища непосредственно перед вызовом AddMessageSync. Конечно же, после каждой неудачной попытки добавить сообщение в очередь следует вызывать IfRetry.

Надеюсь, это поможет любому, кто был так же смущен.

0 голосов
/ 14 марта 2019

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;          

           };
      };
}
*Код 1005 * внутри
return () => {

}

соответствует подписи для делегата Microsoft.WindowsAzure.StorageClient.ShouldRetry и будет содержать особенности вашей реализации.

После того как вы создали политику повторных попыток каквыше вы можете настроить свой клиент, чтобы использовать его через

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

Это сработало для меня.Надеюсь, это поможет.

...