Повторяющиеся задания с Hangfire и Asp.Net Core

У меня есть сервис, в котором есть метод, который я хотел бы использовать в качестве повторяющейся работы.

Я знаю, что могу использовать Hangfire в своем Startup.cs, например:

RecurringJob.AddOrUpdate(() => Console.WriteLine("I'm a recurring job"), Cron.Minutely);

Но вопрос в том, как я могу здесь пользоваться своими услугами? Должен ли я как-то использовать здесь (внедрение зависимостей?) или в другом месте?

Может быть, мне следует добавить некоторые значения cron в appsettings.json?


person mskuratowski    schedule 06.02.2017    source источник
comment
RecurringJob.AddOrUpdate("MyMethodNameAsID", () => Class.Method(), Cron.Minutely); Думаю, сработает... Возможно. Если я правильно понял ваш вопрос.   -  person NooGuy    schedule 07.02.2017
comment
@NooGuy Да, это работает, но вместо этого кода я хотел бы использовать свой сервис   -  person mskuratowski    schedule 07.02.2017


Ответы (4)


Недостатком Hangfire, который я заметил, была сложность его настройки. Для его работы требуется несколько дополнительных таблиц. Я надеюсь, что у вас есть таблицы, созданные для него в вашей базе данных. Пожалуйста, посмотрите, как получить повторяющиеся задания.- данные повторяющихся задач HangFire. Я чувствую, что это очень хорошо для заданий в очереди или для фоновых задач, но для повторяющихся заданий я бы посоветовал использовать Quartz.net. Он не нуждается в такой настройке и очень легко интегрируется. Пока проблем нет, и у него хорошая поддержка CRON. Пример — https://www.mikesdotnetting.com/article/254/scheduled-tasks-in-asp-net-with-quartz-net

person Arathy T N    schedule 07.02.2017
comment
Да, но я хотел бы использовать Hangfire и ищу решение, как мне это сделать. - person mskuratowski; 07.02.2017

Вы имеете в виду что-то вроде этого?

RecurringJob.AddOrUpdate<IAlertService>(x => 
    x.SendAlerts(emailSettings, link), Cron.MinuteInterval(1));
person Cake or Death    schedule 21.02.2017

Вот как вы можете вызвать сервис для зависания из файла запуска. В моем случае у меня есть IMediator в качестве конструктора моего сервиса. У вас может быть один или несколько других, которые вы можете добавить в AddTransient.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages()
            .AddRazorRuntimeCompilation()
            .AddMvcOptions(options => options.EnableEndpointRouting = false);
    
         serviceCollection.AddTransient<INotificationSchedulerService>
        (
           serviceProvider => new NotificationSchedulerService
           (
               serviceProvider.GetService<IMediator>()
           )
        );
      
          services.AddHangfire(x => x.UseSqlServerStorage("Server=SQLEx\\SQLSERVER2019;Database=Tempdatabase;User ID=sa;Password=xuz@de5234;MultipleActiveResultsets=true"));
        services.AddHangfireServer();
    }

    public void Configure(IApplicationBuilder applicationBuilder, IWebHostEnvironment hostEnvironment)
    { 
         RecurringJob.AddOrUpdate<INotificationSchedulerService>(x => x.ScheduleLikeNotifications(),"*/2 * * * *");
    }
}
person prisan    schedule 18.03.2021

Я опоздал на эту вечеринку на год и наткнулся на этот вопрос, когда искал что-то, связанное с Hangfire, и решил, что отвечу, поскольку на заданный вопрос нет ответа.

Вы абсолютно можете использовать внедрение зависимостей в Hangfire, не полагаясь на конструкторы по умолчанию или создание экземпляров в своем классе.

Вы можете наследовать от JobActivator и переопределить метод ActivateJob(Type), в то время как ваша собственная реализация использует метод IServiceProvider.

public class DependencyJobActivator : JobActivator
{
    private readonly IServiceProvider _serviceProvider;

    public DependencyJobActivator(IServiceProvider serviceProvider)
    { 
        _serviceProvider = serviceProvider;
    }

    public override object ActivateJob(Type jobType) {
        return _serviceProvider.GetService(jobType);
    }
}

Затем просто скажите Hangfire использовать вашу пользовательскую реализацию в методе Configure класса Startup.

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    app.UseHangfireDashboard();
    app.UseHangfireServer(new BackgroundJobServerOptions { Activator = new DependencyJobActivator(serviceProvider) });
    app.UseMvc();
}

Подробнее читайте в документации по Hangfire.

person ColinM    schedule 03.03.2018
comment
Я протестировал это, затем удалил активатор, но все мои сервисы по-прежнему корректно внедряются. Я считаю, что активатор больше не требуется (но раньше был, так как ваш ответ не единственный, предлагающий это). - person Roman Starkov; 15.05.2018