Запускать лазурную функцию в определенное время только один раз?

Итак, я работаю над отправкой 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

Другие вопросы по тегам