使用Hangfire和Asp.Net Core重复工作

时间:2017-02-06 21:42:53

标签: c# .net asp.net-mvc asp.net-core hangfire

我有一些方法,其中有一些方法我想成为重复工作。

我知道我可以在我的Startup.cs中使用hangfire,例如:

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

但问题是如何在这里使用我的服务?我应该在某种程度上使用(依赖注入吗?)还是在其他地方?

也许我应该将一些cron值放到appsettings.json?

4 个答案:

答案 0 :(得分:5)

你的意思是这样吗?

RecurringJob.AddOrUpdate<IAlertService>(x => 
    x.SendAlerts(emailSettings, link), Cron.MinuteInterval(1));

答案 1 :(得分:1)

这里是如何从启动文件调用 hangfire 服务的方法。就我而言,我将 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 * * * *");
    }
}

答案 2 :(得分:0)

我参加这个派对已经晚了一年,在找到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在Startup类中使用您的自定义实现&#39; Configure方法。

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

Hangfire Documentation

上阅读更多内容

答案 3 :(得分:-2)

我遇到的篝火的缺点是设置它的复杂性。它需要很少的额外表来设置它才能工作。我希望你在数据库中为它创建表。请看这个如何获得经常性的工作.- HangFire recurring task data。我认为这对于排队工作或后台工作非常有用,但对于重复工作, 我建议去 Quartz.net 。它不需要这样的设置,也很容易集成。到目前为止没有问题,它有很好的CRON支持。示例 - https://www.mikesdotnetting.com/article/254/scheduled-tasks-in-asp-net-with-quartz-net