c# - 使用具有多个队列的 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
,它是从中调用它的控制器,所以我不知道我错过了什么。
对此的任何帮助或建议将不胜感激。
解决方案
事实证明,更大的问题是有一个活动的 Azure 实例正在运行一个单独的 hangfire 服务器,而没有最新的代码,所以它被在那里而不是本地服务器获取。
推荐阅读
- sql-server - 将 SSIS 包移至生产环境
- java - 传递适配器时自定义 RecyclerView 为空
- c# - 如何在 Xamarin.Android 中使用 Value Animator?
- javascript - 使用父母选择器过滤
- node.js - cucumber hooks(@Before and @After)中的标签如何组织
- python - python中if else语句中的字符串输出比较
- java - 在创建客户端时使用已创建的配置时,泽西客户端出现 Http 不支持错误。Https 工作正常
- python - 为什么我的 Opencv 没有响应或没有执行任何操作?
- oracle - 使用 DBMS_REDEFINITION 对现有表进行分区
- node.js - 如何使用“webpack-node-externals”将“node_modules”复制到生产环境中的目录?