Hangfire配置多队列不同worker数时仅识别default队列问题
Hangfire多队列配置错误原因及解决方案
核心问题
你在配置AddHangfireServer时的委托写法错误:AddHangfireServer接收的委托是用于直接修改框架传入的BackgroundJobServerOptions实例,你在委托内直接new新的实例返回,该实例不会被框架读取,因此两个Hangfire服务都沿用了默认配置(仅监听default队列、Worker数量为CPU核心数*5),导致serial队列无Worker处理。
修正后的配置代码
services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("DbConnection"))); // 串行队列服务 services.AddHangfireServer(x => { x.ServerName = string.Format("{0}:serial", Environment.MachineName); x.Queues = new[] { "serial" }; x.WorkerCount = 1; }); // 默认队列服务 services.AddHangfireServer(x => { x.ServerName = string.Format("{0}:default", Environment.MachineName); x.Queues = new[] { "default" }; x.WorkerCount = Environment.ProcessorCount * 5; });
验证与使用注意事项
- 启动项目后打开Hangfire仪表盘,进入「服务器」标签页,确认两个服务实例的队列列分别对应
serial和default,即为配置生效 - 任务推入
serial队列时需要明确指定队列:- 任务方法上加
[Queue("serial")]特性 - 或者入队时显式指定队列:
BackgroundJob.Enqueue(() => YourTaskMethod(), "serial");
- 任务方法上加
内容的提问来源于stack exchange,提问作者Hans-Henrik Møller
相关产品推荐
相关产品推荐

