Что если разница между «Settings.job» и «TimerTrigger» в Azure WebJobs SDK 3.0 - PullRequest
0 голосов
/ 11 июня 2019

Существует множество учебных пособий, использующих следующий код для создания веб-заданий с помощью библиотеки WebJob SDK 3.0.В частности, TimerTrigger

    public void DoSomethingUseful([TimerTrigger("0 */1 * * * *", RunOnStartup = false)] TimerInfo timerInfo, TextWriter log)
    {
        // Act on the DI-ed class:
        string thing = _usefulRepository.GetFoo();
        Console.WriteLine($"{DateTime.Now} - {thing}");
    }

Приведенный выше пример должен запускать этот метод как веб-задание каждую 1 минуту.Однако это не работает.

Мне удалось заставить работать веб-работу при включении файла setting.job.

setting.job: {  "schedule": "0 */1 * * * *" }

Мой вопрос: чем они отличаются?

1 Ответ

1 голос
/ 12 июня 2019

Обновление:

Пожалуйста, перейдите в журнал веб-заданий azure, и вы увидите, что он на самом деле работает в соответствии с параметром timerTrigger, определенным в SDK (даже если Расписание отсутствует, а файл settings.job пуст,это не имеет значения):

enter image description here

Короче говоря, при использовании webjob sdk 3.x вы можете использовать атрибут TimerTrigger для запуска функции какза время, которое вы определили.Не используя SDK для веб-заданий (например, используйте файл .zip или опубликуйте консольный проект из Visual Studio), вы можете использовать setting.job для заданного таймера вместо атрибута TimerTrigger.

1.При использовании веб-заданийSDK 3.x для запуска по таймеру, вы должны добавить следующую строку кода: config.AddTimers();.

Вот мой код с использованием webjobs SDK 3.x (это консольный проект .net core 2.2, созданный в visual studio):

Пакеты с последней версией: Microsoft.Azure.WebJobs / Microsoft.Azure.WebJobs.Extensions / Microsoft.Extensions.Logging.Console

Код в Program.cs:

    class Program
    {
        static void Main(string[] args)
        {
            var builder = new HostBuilder()
                .ConfigureWebJobs(config =>
                {
                    config.AddTimers();
                    config.AddAzureStorageCoreServices();
                })
                .ConfigureLogging((context, b) =>
                {
                    b.AddConsole();
                }
                )
                 .Build();

            builder.Run();
        }
    }

Затем создайте новыйфайл, такой как SayHelloWebJob.cs, и код в нем:

    public class SayHelloWebJob
    {
        public void ProcessCollateFiles([TimerTrigger("0 */1 * * * *", RunOnStartup = false)]TimerInfo timerInfo,TextWriter writer)
        {
            writer.WriteLine("hi, it is a testing running");
            Console.WriteLine("test");
        }
    }

Обратите внимание, что в файле appsettings.json добавьте строку подключения к хранилищу, как показано ниже:

{
  "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net"
}

Затем запуститеВ проекте вы можете увидеть, что функция запускается за 1 минуту:

enter image description here

2.Для настройки.job, например.если вы просто создаете консольный проект и не используете webjobs sdk.Поскольку вы не используете webjobs sdk, вы не можете использовать атрибут timerTrigger.В этот момент вы можете включить файл settings.job (в его свойстве установите «Копировать в выходной каталог» как «копировать, если новее») в этот проект и настроить запланированный таймер, как вы делали в своем посте.После публикации в качестве веб-задания (в Visual Studio при публикации выберите «Режим выполнения веб-работы» как «запуск по требованию»), он может запускаться согласно расписанию, заданному вами в settings.job.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...