使用具有多个队列的Hangfire的MVC应用程序

问题描述 投票:0回答:1

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

作为参考,项目被设置为单个应用程序,其中多个库被引用为我们之前已经处理过的其他项目。 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配置。我最初在配置选项中没有单独的队列,但在对此进行一些研究后,看起来这可能会有所帮助。每个控制器的操作都使用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-mvc hangfire
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.