2015-04-14 1 views
17

Я разрабатываю лазурный webjob, который должен работать непрерывно. У меня есть статическая функция. Я хочу, чтобы эта функция автоматически запускалась без какой-либо очереди. Сейчас я использую while (true) для непрерывного запуска. Есть ли другой способ сделать это?Как сделать лазурный webjob работать непрерывно и вызвать публичную статическую функцию без автоматического триггера

Вы найдете ниже мой код

static void Main() 
    { 
     var host = new JobHost(); 
     host.Call(typeof(Functions).GetMethod("ProcessMethod")); 
     // The following code ensures that the WebJob will be running continuously 
     host.RunAndBlock(); 
    } 

[NoAutomaticTriggerAttribute] 
public static void ProcessMethod(TextWriter log) 
{ 
    while (true) 
    { 
     try 
     { 
      log.WriteLine("There are {0} pending requests", pendings.Count); 
     } 
     catch (Exception ex) 
     { 
      log.WriteLine("Error occurred in processing pending altapay requests. Error : {0}", ex.Message); 
     } 
     Thread.Sleep(TimeSpan.FromMinutes(3)); 
    } 
} 

Благодаря

+2

Вы можете поместить его в расписание, которое выполняется каждые 3 минуты. – lopezbertoni

+1

Вам не нужна вся работа JobHost, которую у вас есть, вы можете просто вызвать ProcessMethod из Main и использовать Console.WriteLine для регистрации. –

+0

Привет, я только что показал простой пример в ProcessMethod для регистрации. Помимо процесса регистрации, ProcessMethod выполняет другие процессы, т.е. вызывать базу данных, обновлять таблицу sql и т. д., –

ответ

17

Эти шаги приведет вас к тому, что вы хотите:

  1. Измените свой метод ASync
  2. ждут сна
  3. использовать host.CallAsync() вместо host.Call()

Я преобразовал ваш код, чтобы отобразить шаги, приведенные ниже.

static void Main() 
{ 
    var host = new JobHost(); 
    host.CallAsync(typeof(Functions).GetMethod("ProcessMethod")); 
    // The following code ensures that the WebJob will be running continuously 
    host.RunAndBlock(); 
} 

[NoAutomaticTriggerAttribute] 
public static async Task ProcessMethod(TextWriter log) 
{ 
    while (true) 
    { 
     try 
     { 
      log.WriteLine("There are {0} pending requests", pendings.Count); 
     } 
     catch (Exception ex) 
     { 
      log.WriteLine("Error occurred in processing pending altapay requests. Error : {0}", ex.Message); 
     } 
     await Task.Delay(TimeSpan.FromMinutes(3)); 
    } 
} 
+1

Является ли Thread.Sleep обычно проблемой в WebJobs, например. в статических (неасинхронных) функциях? Благодаря! – GGleGrand

+0

Если это запланированный или ручной веб-сайт, вы получите задание, возвращенное из CallAsync, и вызовите Wait() на нем. –

15

Используйте Microsoft.Azure.WebJobs.Extensions.Timers см https://github.com/Azure/azure-webjobs-sdk-extensions/blob/master/src/ExtensionsSample/Samples/TimerSamples.cs создать триггер, который использует TimeSpan или CRONTAB инструкцию, чтобы запустить метод.

Добавить Microsoft.Azure.WebJobs.Extensions.Timers от NuGet к вашему проекту.

public static void ProcessMethod(TextWriter log) 

становится

public static void ProcessMethod([TimerTrigger("00:05:00",RunOnStartup = true)] TimerInfo timerInfo, TextWriter log) 

в течение пяти минут триггеров (используя TimeSpan строку)

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

static void Main() 
    { 
     JobHostConfiguration config = new JobHostConfiguration(); 
     config.UseTimers(); 

     var host = new JobHost(config); 

     // The following code ensures that the WebJob will be running continuously 
     host.RunAndBlock(); 
    } 
+0

Я делаю это, но он заканчивается через несколько дней. Мой метод - async Task ProcessTimer ([TimerTrigger («00:01:00»)] ...). Я запускаю базовый план и всегда включен. –

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

  • Нет связанных вопросов^_^