2016-02-06 2 views
3

Я создал свой первый лазурный webjob, который работает непрерывно;Почему мой непрерывный лазурный webjob запускает функцию дважды?

Я не уверен, что это проблема кода, но для полноты картины здесь мой код:

static void Main() 
{ 
    var host = new JobHost(); 
    host.CallAsync(typeof(Functions).GetMethod("ProcessMethod")); 
    host.RunAndBlock(); 
} 

И для функции:

[NoAutomaticTrigger] 
public static async Task ProcessMethod(TextWriter log) 
{ 
    log.WriteLine(DateTime.UtcNow.ToShortTimeString() + ": Started"); 
    while (true) 
    { 
     Task.Run(() => RunAllAsync(log)); 
     await Task.Delay(TimeSpan.FromSeconds(60)); 
    } 
    log.WriteLine(DateTime.UtcNow.ToShortTimeString() + "Shutting down.."); 
} 

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

Моя проблема заключается в том, что, как только это работает в течение примерно 5 минут, вызывается второй ProcessMethod, который заставляет меня иметь два сеанса, делающих одно и то же. Второй метод говорит, что он «начался с Dashboard», хотя я на 100% уверен, что не нажимал ничего, чтобы начать его с себя.

Кто-нибудь испытал что-нибудь подобное?

+0

Был ли принятый ответ на вашу проблему? Я вижу то же самое, за исключением того, что число экземпляров экземпляра равно 1 ... Это для веб-мужа, который работает как ожидалось в течение многих месяцев. –

ответ

4

Измените счетчик экземпляров на 1 из вкладки «Масштаб» WebApp на портале Azure. По умолчанию установлено 2 экземпляра, из-за чего он запускается два раза.

1

Я не могу объяснить, почему это вызвано дважды, но я думаю, вам будет лучше работать с запущенной работой, используя расписание CRON (https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/#CreateScheduledCRON), вместо Continuous WebJob.

Кроме того, похоже, что вы не используете SDK WebJobs, поэтому можете полностью пропустить это. Ваш WebJob может быть таким же простым, как Main, который непосредственно выполняет эту работу. Нет JobHost, нет async, и вообще легче получить право.

+1

Согласовано. Вышеупомянутое не является шаблоном, который вы хотите использовать. Это приведет к вызову одной функции в Dashboard с постоянно растущим объемом вывода журнала, который никогда не будет завершен. Вместо этого сделайте то, что предлагает Дэвид, если вы не используете какие-либо другие функции SDK WebJobs, или вы можете использовать SDK TimerTrigger, который позволяет запускать повторяющуюся работу (см. Здесь [https://github.com/Azure /azure-webjobs-sdk-extensions/blob/master/src/ExtensionsSample/Samples/TimerSamples.cs)). – mathewc

+0

Большой вход. Я планировал работать чаще, чем раз в минуту, из-за которой afaik исключает cron, хотя TimerTrigger может быть больше того, что я ищу. Спасибо за введение, ребята. – WPFUser

+0

cron может фактически подняться до одной секунды. Однако у него есть ограничение: если задание занимает больше времени, чем интервал между вызовами (например, он запускается каждые 20 секунд и занимает 30 секунд для запуска), некоторые вызовы могут быть пропущены. –

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