【问题标题】:Recurring jobs with Hangfire and Asp.Net CoreHangfire 和 Asp.Net Core 的重复性工作
【发布时间】:2017-02-06 21:42:53
【问题描述】:

我有一些服务,其中有一些我想成为经常性工作的方法。

我知道我可以在 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 是的,它正在工作,但是我想使用我的服务的代码

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


【解决方案1】:

你的意思是这样的吗?

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我迟到了一年,在寻找与 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 类的 Configure 方法中使用您的自定义实现。

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

      Hangfire Documentation 上阅读更多信息

      【讨论】:

      • 我对此进行了测试,然后删除了激活器,但我的所有服务仍然可以正确注入。我相信不再需要激活器(但曾经是,因为你的不是唯一的答案)。
      【解决方案4】:

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

      【讨论】:

      • 是的,但我想使用hangfire,我正在寻找解决方案,我该怎么做。
      猜你喜欢
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多