2014-11-03 4 views
2

Я работаю над webjob, который проверяет веб-сервер для некоторых данных. Иногда веб-сервер занят, и через несколько секунд он снова попытается повторить попытку.Ошибки обработки SDK и очереди в Azure Webjobs

Проблема в том, что если я просто проигнорирую ее и пройду через эту функцию, она удалит сообщение из очереди, и я не смогу повторить вызов.

Мое текущее решение (которое мне совсем не нравится) заключается в исключении, которое увеличит число dequque и вернет сообщение в очередь. Это, однако, кажется очень жестоким и требует потока, который работает webjob для перезапуска.

Есть ли другой способ обращения с этим?

+1

Вы можете попробовать это: запустить работу асинхронно и проверить ответ сервера для «Повторите попытку через несколько секунд». Если он вернется с этим ответом, затем спящий на несколько секунд, а затем повторите попытку. Я не слишком разбираюсь в асинхронных операциях, но похоже, что вы могли бы реализовать что-то подобное, которое решило бы вашу проблему с исключениями и не использовало бы ресурсы во время ожидания сервера. – EJay

ответ

5

Webjobs SDK будет запускать функции запуска очереди, если они генерируют исключение. Количество попыток настроено через свойство JobHostConfiguration.Queues.MaxDequeueCount, как описано here.

Если вы не хотите полагаться на политику повторения SDK, вы всегда можете обработать исключение в своем собственном коде и повторить попытку. Просто поймайте исключение или что-то еще, когда сервер занят, а затем повторите операцию до тех пор, пока она не удастся. Тем не менее, это именно то, что делает SDK за сценой, и, делая это самостоятельно, вы не получаете автоматическое перемещение в ядровую функциональность очереди.

Если функция не может быть сконструирована так, чтобы быть реентерабельной, я рекомендую разрешить SDK выполнять повторную работу. Если вы все-таки решили справиться с этим самостоятельно, то здесь, как код может выглядеть следующим образом:

public static void WebJobFunction([QueueTrigger("temp")] string message) 
{ 
    int retriesLeft= 5; 

    while(true) 
    { 
     try 
     { 
      --retriesLeft; 
      DoServerOperation(message); 
      break; 

     } 
     catch(TimeoutException) 
     { 
      if (retriesLeft == 0) 
      { 
       throw; 
      } 
     }  
    } 
} 
+1

Привет, Виктор, Спасибо за помощь. Мне нравится, как SDK обрабатывает ядовитую функциональность. Мне просто интересно, есть ли способ вернуть значение, и пусть sdk знает, что сообщение должно вернуться в очередь для повторной попытки, не вызывая исключения. Имеет ли это смысл? – hjavaher

+1

Имеет смысл, но, к сожалению, нет никакого способа сделать это –

+1

@VictorHurdugaci Можете ли вы прояснить/расширить это утверждение: «Если функция не может быть сконструирована так, чтобы быть реентерабельной, я рекомендую разрешить SDK выполнять повторную работу». ? – Howiecamp

Смежные вопросы