使用Hangfire和Asp.Net Core实现循环执行的任务

13

我有一个服务,其中有一些方法,我希望它们成为循环作业。

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

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

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

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


RecurringJob.AddOrUpdate("MyMethodNameAsID", () => Class.Method(), Cron.Minutely); 我认为这个应该可以运行...也许。如果我正确理解了你的问题的话。 - NooGuy
@NooGuy 是的,它可以工作,但我想使用我的服务代替那段代码。 - mskuratowski
4个回答

15

你的意思是这样的吗?

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

4

以下是如何从启动文件调用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 * * * *");
    }
}

1

我来晚了一年,偶然发现这个问题,当时正在寻找与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);
    }
}

然后只需在 Startup 类的 Configure 方法中告诉 Hangfire 使用您的自定义实现即可。

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

Hangfire Documentation上阅读更多相关信息。

我测试了这个,然后移除了激活器,但是所有的服务仍然能够正确注入。我相信激活器不再是必需的(但以前是必需的,因为你不是唯一一个建议使用它的人)。 - Roman Starkov

-8
Hangfire的缺点在于设置它时比较复杂。为了使其正常工作,需要设置一些额外的表格。我希望您已经在数据库中创建了这些表格。请参考此链接HangFire recurring task data以获取关于如何获取循环任务的信息。我认为它非常适合排队作业或后台任务,但对于循环作业,我建议使用Quartz.net。它不需要任何设置,非常容易集成。到目前为止没有出现任何问题,并且它具有良好的CRON支持。例如,请参考https://www.mikesdotnetting.com/article/254/scheduled-tasks-in-asp-net-with-quartz-net

是的,但我想使用Hangfire,并且正在寻找解决方案,以便我可以做到这一点。 - mskuratowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接