Настраиваемые триггеры таймера - веб-задания Azure

3

Я создаю задание для запуска через некоторый регулярный интервал (скажем, 1 минута). Я успешно использовал запущенные веб-задания с временным интервалом, жестко закодированным в функциях.

public void foo([TimerTrigger("00:01:00")] TimerInfo timer)

Теперь, если я когда-либо захочу изменить время запуска с 1 мин до 2 мин, я должен перераспределить код. Вместо этого есть способ сделать TimeTrigger Configurable из файла конфигурации.

Обратите внимание, что замена строки с динамическичитаемым значением невозможна, поскольку атрибут TimerTrigger является выражением const string или Type.

Теги:
azure-webjobssdk
azure-webjobs
webjob

4 ответа

8
Лучший ответ

После долгих поисков я понял, что это можно сделать с помощью класса расширения 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

  • 0
    Это больше не работает. Если вы поместите атрибут FunctionName в функцию (необходимо, чтобы она работала) и TimerTrigger который принимает type а не выражение cron, он не сможет скомпилировать с «System.NotImplementedException: свойство« ScheduleType »для атрибута« TimerTriggerAttribute »не является поддерживается в функциях Azure. "
5

Вы можете сделать это так:

public static void Run([TimerTrigger("%MYSCHEDULE%")] TimerInfo myTimer, ILogger log)

где MYSCHEDULE - это переменная окружения, которую вы можете сохранить в файле local.settings.json а также в настройках приложения на портале.

Пример значения для MYSCHEDULE будет:

"MYSCHEDULE": "0 */2 * * * *"
5

Оказывается, это довольно легко в наше время. Просто вставьте настройку приложения в качестве выражения расписания cron, и оно найдет его для вас.

например

public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer

Находит параметр MYCRON и использует оттуда выражение cron

1

AFAIK, вам нужно TimerTrigger параметр scheduleExpression для TimerTrigger в вашем коде или реализовать ваш WeeklySchedule или DailySchedule описанный в этом примере TimerSamples.cs. Для изменения расписания без повторного развертывания вашего кода я предполагаю, что вы могли бы использовать Azure Scheduler для запуска вашего веб-сайта по определенному графику, и вы могли бы изменить настройки расписания, как вы ожидали, без повторного развертывания вашего webjob. Для получения дополнительной информации вы можете обратиться к разделу о добавлении задания планировщика в этот учебник.

  • 1
    Спасибо за ответ. Я искал более настраиваемый способ, а не просто еженедельное или ежедневное планирование. Я нашел способ сделать это с помощью встроенного расширения TimerSchedule Azure SDK. По сути, это то же самое, что WeeklyScedule и DailySchedule , с большим контролем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню