MVC App将Hangfire与多个队列配合使用

时间:2019-02-19 16:38:29

标签: c# asp.net-mvc hangfire

我正在使用ASP.NET MVC应用程序工作,该应用程序使用Hangfire来为项目的不同部分排队工作。

作为参考,该项目被设置为单个应用程序,而多个库被称为我们之前处理过的其他项目。 hangfire服务器是从MVC应用程序设置的,所有调用要入队的作业的方法都位于该应用程序的不同控制器中。不同的引用库有不同的控制器。

我能够为第一个图书馆成功创建工作;他们入队,处理,完成或成功失败。现在的问题是,我试图将第二个库添加到Hangfire设置中,当我尝试加入新工作时,我在Hangfire仪表板中得到一个Could not load type 'SPPC_Jobs.Controllers.FB.FBMetricsController' from assembly 'SPPC_Jobs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'。由于排队是在直接引用和使用该库的控制器中发生的,因此我对发生这种情况的原因感到困惑。我还能够从控制器的操作中直接调用该库的方法,并且它可以正常工作,仅在转到Hangfire时遇到问题。

以下是项目中使用的一些代码来演示设置以及如何尝试将作业入队。

Startup.cs

GlobalConfiguration.Configuration.UseMongoStorage("...");

app.UseHangfireDashboard("/hangfire", new DashboardOptions = { 
    Authorization = System.Linq.Enumerable.Empty<IDashboardAuthorizationFilter() 
});

var options = new BackgroundJobServerOptions { Queues = new[] { "scp", "metrics" } };

app.UseHangfireServer(options);

值得一提的是它正在使用MongoDB配置。我最初在config选项中没有单独的队列,但是在对此进行了一些研究之后,这似乎可能有所帮助。每个控制器的动作都装饰有Queue属性。

控制器1

第一个控制器调用BackgroundJob.Schedule(() => Processor(id), scheduleDate);,它引用了我创建的另一个动作,称为Processor。处理器获取ID,查询数据库(SQL Server DB,不是mongo)以获取记录,然后在引用的库中调用服务ProcessorService

[Queue("scp")]
public Void Processor(int id) {
    var callback = repo.GetSocialCallback(id);

    //-- Referenced library
    var processorService = new ProcessorService();
    processorService.Process(callback);
}

控制器2

第二个控制器以与第一个相同的方式调用第二个库的方法:

BackgroundJob.Enqueue(() => Enqueue(providerClientAccount));

入队方法调用引用的库的方法,如下所示:

[Queue("metrics")]
public void Enqueue(ProviderClientAccount providerAccount) {

    //-- Referenced library
    var metricsService = new MetricsService();
    metricsService.Call(providerAccount);
}

我看到的唯一真正的区别是第二个控制器正在传递整个对象,而不是ID。我也尝试过仅将ID传递给Enqueue方法,查询该方法中的对象然后调用它,但最终还是得到相同的结果。


在类似情况下我能找到的所有问题/教程/错误都使用了多个项目,并为Hangfire仪表板使用了一个中央应用程序,或者使用了与我当前使用的配置不同的配置。我不明白的是,对于第二个库,当我尝试将作业入队时,它引发错误,提示它无法加载类型FBMetricsController,这是从中调用它的控制器,因此我不知道我在想什么。

对此将提供任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

发现更大的问题是,有一个活动的Azure实例正在运行单独的hangfire服务器,而没有最新的代码,因此该实例是在本地而不是本地服务器上获取的。