Запускать лазурную функцию в определенное время только один раз?
Итак, я работаю над отправкой push-уведомлений мобильного приложения, и я уже настроил концентратор уведомлений Azure, но я хотел сделать в нем планирование, я понимаю, что для этого есть опция сборки в лазурном режиме, поскольку это стоит 200 долларов решил создать функции Azure, чтобы справиться с этим,
Я прошел через выражения NCRON, теперь я хотел знать, как запланировать выполнение задания один раз в определенную дату, все, что я смог найти, это те, которые основаны на повторении, а также можно ли запускать задание динамически, как в дате варьироваться
public static class Function1
{
[FunctionName("Function1")]
public static void Run([TimerTrigger("0 0 15 2 Jan")]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
}
Я пытался сделать что-то вроде этого, запустил что-то 2 января в 15:00, похоже, это не работает, мне что-то здесь не хватает и как мне сделать TimerTrigger
динамический Любой ввод будет глубоко оценен
Благодарность
4 ответа
Чтобы четко описать, я перередактирую весь ответ. Надеюсь, на этот раз я смогу ясно объяснить.
В ПОРЯДКЕ. Прежде всего, вам нужно знать, что у функции azure есть раздел объявлений и раздел конфигурации.
На местном уровне раздел объявлений ([TimerTrigger("* * * * * *")]TimerInfo myTimer, ILogger log)
, а раздел конфигурации local.settings.json
файл.
При развертывании в Azure. Меняется. Раздел декларации превращается вfunction.json
, а Application Settings
становится разделом конфигурации.
По вашему запросу вы можете добавить ключ в разделе конфигурации и получить его в своей функции.
Например,
На местном:
function.cs:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace TimeTrigger
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([TimerTrigger("%Schedule%")]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
}
}
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"Schedule": "* * * * * *"
}
}
Вы можете изменить способ срабатывания триггера времени, изменив значение ключа в json (например, с помощью PowerShell для изменения значения. Или вы можете использовать код для изменения).
На портале:
И так же, как на локальном, вы можете сделать это на портале:
Раздел декларации:
Раздел конфигурации:
Вы можете сгенерировать подробное выражение CRON, используя ссылку ниже:
http://corntab.com/?c=0_15_2_1_*
0 0 15 2 Jan *
- это результирующее выражение CRON, которое будет запускаться каждый 2-й день января в 15:00 для любых лет.
Как правильно предложил @Bowman, проверьте и подтвердите выражение из приведенной выше ссылки и посмотрите, поможет ли оно.
Во-первых, основная проблема, которую вы теперь предполагаете, - это ваше выражение, правильный формат выражения, который вы могли бы использовать в выражениях doc:NCRONTAB.
{second} {minute} {hour} {day} {month} {day-of-week}
Затем о ваших требованиях к динамическому запуску задания. Вы можете поместить выражение расписания в параметр приложения и установить для этого свойства имя параметра приложения, заключенное в знаки%, как в этом примере:%ScheduleAppSetting%
. Вы можете проверить это в конфигурации.
Даже с этим выражением он покажет ошибку, но все равно будет работать.
Зачем использовать функцию таймера, если вам нужно запустить ее только один раз?
Я бы сказал, что лучшим решением будет отправить сообщение в очередь, чтобы оно запускалось в запланированное время с использованием атрибута ScheduledEnqueueTimeUtc.
https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-sequencing#scheduled-messages