首页 > 解决方案 > 使用具有多个队列的 Hangfire 的 MVC 应用程序

问题描述

我正在开发一个 ASP.NET MVC 应用程序,它使用 Hangfire 将项目的不同部分的作业排入队列。

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

我能够成功地为第一个图书馆创造就业机会;他们很好地排队,处理并完成或成功失败。现在的问题是我试图将第二个库添加到 Hangfire 设置中,Could not load type 'SPPC_Jobs.Controllers.FB.FBMetricsController' from assembly 'SPPC_Jobs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'当我尝试将新工作排入队列时,我在 Hangfire 仪表板中得到一个。由于排队是从直接引用和使用库的控制器发生的,所以我不知道为什么会发生这种情况。我还可以从控制器的操作中直接调用库的方法,它工作正常,只有在前往 Hangfire 时才会遇到问题。

这是项目中使用的一些代码,用于演示设置以及如何尝试将作业排入队列。

启动.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 配置。我最初在配置选项中没有单独的队列,但是在对此进行了一些研究之后,看起来这可能会有所帮助。每个控制器的动作都装饰有一个 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));

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

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

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

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


我在类似情况下可以找到的所有问题/教程/错误都使用了多个项目,其中一个中央应用程序用于 Hangfire 仪表板,或者与我目前使用的配置不同。我不明白的是,对于第二个库,当我尝试将作业排入队列时,它会抛出一个错误,说它无法加载类型FBMetricsController,它是从中调用它的控制器,所以我不知道我错过了什么。

对此的任何帮助或建议将不胜感激。

标签: c#asp.net-mvchangfire

解决方案


事实证明,更大的问题是有一个活动的 Azure 实例正在运行一个单独的 hangfire 服务器,而没有最新的代码,所以它被在那里而不是本地服务器获取。


推荐阅读