Я создаю задание для запуска через некоторый регулярный интервал (скажем, 1 минута). Я успешно использовал запущенные веб-задания с временным интервалом, жестко закодированным в функциях.
public void foo([TimerTrigger("00:01:00")] TimerInfo timer)
Теперь, если я когда-либо захочу изменить время запуска с 1 мин до 2 мин, я должен перераспределить код. Вместо этого есть способ сделать TimeTrigger Configurable из файла конфигурации.
Обратите внимание, что замена строки с динамическичитаемым значением невозможна, поскольку атрибут TimerTrigger является выражением const string или Type.
После долгих поисков я понял, что это можно сделать с помощью класса расширения SDK TimerSchedule
.
Для этого вам понадобится базовый класс, который вы сможете использовать для нескольких триггеров.
class CustomTimerTriggerBase: TimerSchedule
{
TimeSpan timer;
public CustomTimerTriggerBase(string triggerConfigKey)
{
timer=TimeSpan.Parse(ConfigurationManager.AppSettings[triggerConfigKey]);
}
public override DateTime GetNextOccurrence(DateTime now)
{
return now.Add(timer);
}
}
Используйте эту базу для генерации ваших таймеров...
public sealed class FooTimer : CustomTimerTriggerBase
{
public FooTimer() : base("FooTimerKey") {}
}
В вашем App.config есть ключ для "FooTimer"
<add key="FooTimerKey" value="00:02:00" />
Используйте этот класс FooTimer в ваших функциях webjob.
public void foo([TimerTrigger(typeof(FooTimer)] TimerInfo timer)
Теперь вы можете просто изменить значение в конфигурации приложения вместо повторного развертывания кода. ПРИМЕЧАНИЕ. Поскольку вы используете Timespan для анализа, строка может иметь любой формат, который вам нужен, как определено в форматах TimeSpan.
ОБНОВИТЬ
Как отмечают l-- '' '' '---------' '' '' '' '' '' ' и Энди Добедое сейчас (по состоянию на 2019 год), это гораздо проще достичь.
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
Находит параметр MYCRON и использует оттуда выражение cron
Вы можете сделать это так:
public static void Run([TimerTrigger("%MYSCHEDULE%")] TimerInfo myTimer, ILogger log)
где MYSCHEDULE
- это переменная окружения, которую вы можете сохранить в файле local.settings.json
а также в настройках приложения на портале.
Пример значения для MYSCHEDULE
будет:
"MYSCHEDULE": "0 */2 * * * *"
Оказывается, это довольно легко в наше время. Просто вставьте настройку приложения в качестве выражения расписания cron, и оно найдет его для вас.
например
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
Находит параметр MYCRON и использует оттуда выражение cron
AFAIK, вам нужно TimerTrigger
параметр scheduleExpression
для TimerTrigger
в вашем коде или реализовать ваш WeeklySchedule
или DailySchedule
описанный в этом примере TimerSamples.cs. Для изменения расписания без повторного развертывания вашего кода я предполагаю, что вы могли бы использовать Azure Scheduler для запуска вашего веб-сайта по определенному графику, и вы могли бы изменить настройки расписания, как вы ожидали, без повторного развертывания вашего webjob. Для получения дополнительной информации вы можете обратиться к разделу о добавлении задания планировщика в этот учебник.
TimerSchedule
Azure SDK. По сути, это то же самое, что WeeklyScedule
и DailySchedule
, с большим контролем.
FunctionName
в функцию (необходимо, чтобы она работала) иTimerTrigger
который принимаетtype
а не выражение cron, он не сможет скомпилировать с «System.NotImplementedException: свойство« ScheduleType »для атрибута« TimerTriggerAttribute »не является поддерживается в функциях Azure. "