Может ли Hangfire работать как простой метод таймера? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть приложение .NET Core Web API.Приложение содержит модели для доступа к БД и способ отправки электронных писем пользователям.Моя конечная цель - вызвать метод по ночам (чтобы отправить пользователям по электронной почте уведомление об истечении срока их регистрации и пометить его как устаревшее в базе данных).

Итак, я могу создать конечную точку и вызывать ее вручную каждую ночь.Или создайте службу Windows для вызова конечной точки.Или создайте службу Windows, чтобы сделать работу.Но я хочу сохранить логику в одном приложении.

Моим идеальным решением было бы запустить таймер внутри моего приложения и вызывать метод в службе каждые 24 часа.Конечно, это невозможно, поэтому я смотрю на Hangfire.Официальная документация , похоже, указывает на значительные накладные расходы.

Hangfire хранит фоновые задания и другую информацию, относящуюся к обработке, в постоянном хранилище.Постоянство помогает фоновым заданиям выживать при перезапуске приложений, перезагрузках сервера и т. Д.

Нужно ли это, если я просто хочу вызвать метод?

Фоновые задания обрабатываютсясервером Hangfire.Он реализован в виде набора выделенных (не пулов потоков) фоновых потоков, которые извлекают задания из хранилища и обрабатывают их.Сервер также отвечает за поддержание чистоты хранилища и автоматическое удаление старых данных.

Нужны ли мне задания?

Есть ли способ ПРОСТО вызвать вызов метода без всех этих затрат сHangfire?

tl; dr: Существуют ли варианты отказа от панели мониторинга, подключения к базе данных и т. Д. И просто использовать Hangfire в качестве таймера?

1 Ответ

0 голосов
/ 08 октября 2018

Моим идеальным решением было бы, чтобы таймер работал внутри моего приложения и вызывал метод в службе каждые 24 часа.Конечно, это невозможно ...

На самом деле это очень возможно, используя IHostedService.Вам нужно некоторое время, чтобы прочитать полную документацию , но просто, для вашего сценария, вам просто понадобится что-то вроде:

internal class NightlyEmailHostedService : IHostedService, IDisposable
{
    private Timer _timer;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromHours(24));
        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        // send email
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _timer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

Затем в Startup.cs просто добавьте:

services.AddHostedService<NightlyEmailHostedService>();

Это очень наивный подход.По сути, он просто запускает таймер, который будет запускаться раз в 24 часа, но в зависимости от того, когда запускается ваше приложение, он не всегда может быть ночью.В действительности, вы, вероятно, захотите, чтобы таймер запускался каждую минуту или около того, и сравнивайте с конкретным временем, когда вы действительно хотите, чтобы электронная почта выходила.Существует интересная реализация обработки времени в стиле cron через IHostedService, на которую вы можете сослаться.

Суть в том, что очень возможно сделать все это в вашем приложении,не требуя ничего дополнительного, как Hangfire.Тем не менее, вам придется выполнить немного больше работы, чем, конечно, использовать что-то вроде Hangfire.

...