EasyNetQ中PrefetchCount参数失效问题求助
EasyNetQ设置PrefetchCount=1仍并发处理任务的问题解决
核心问题出在你的回调方法使用了async void,EasyNetQ无法正确跟踪这类方法的执行生命周期,会错误地认为回调已经完成,进而提前从队列拉取下一条消息,完全忽略了PrefetchCount=1的限制。
解决方案
将回调方法的返回类型从async void改为async Task,让EasyNetQ能够等待任务执行完毕后再处理下一条消息。
修改后的代码示例
- 调整回调方法:
async Task ApplyPackageService(applypkg msg) { var g = Guid.NewGuid(); Log.Information($"Callback started: {g}"); await Task.Delay(20000); Log.Information($"Callback ended: {g}"); }
- 调整订阅代码(两种写法都可以):
写法一:
await _bus.PubSub.SubscribeAsync<applypkg>( "topic", async (req) => await ApplyPackageService(req), (cfg) => cfg.WithPrefetchCount(1));
写法二(更简洁):
await _bus.PubSub.SubscribeAsync<applypkg>( "topic", ApplyPackageService, (cfg) => cfg.WithPrefetchCount(1));
额外说明
- 无需同时在
ConnectionConfiguration和订阅配置中重复设置PrefetchCount,订阅级别的配置优先级更高,保留其中一处即可。 - 关于EasyNetQ版本:只要是支持异步订阅的版本(v3及以上均支持),只要正确使用
async Task回调,就能解决该问题,无需刻意寻找特定适配版本。
预期运行结果
修改后任务会串行执行,日志输出会类似:
===> 08:37:41 [Information] Callback started: 6f27a664-977b-47ca-9eac-81a124066403 ===> 08:38:01 [Information] Callback ended: 6f27a664-977b-47ca-9eac-81a124066403 ===> 08:38:01 [Information] Callback started: cbb15964-f69d-47c6-9225-3c4fc39b326e ===> 08:38:21 [Information] Callback ended: cbb15964-f69d-47c6-9225-3c4fc39b326e ===> 08:38:21 [Information] Callback started: 7c086690-7b7f-449c-b74e-615dda001a27 ===> 08:38:41 [Information] Callback ended: 7c086690-7b7f-449c-b74e-615dda001a27
内容的提问来源于stack exchange,提问作者Kal800
相关产品推荐
相关产品推荐

