我使用 EasyNetQ 将近一年,但无论我们如何调整它(其中添加了我们自己的实现IConsumerErrorStrategy
),我从来没有真正让它按照我想要的方式工作。RequestAsync
在SubscribeAsync
处理程序中执行时,它是单线程的这一事实给了我们一些意想不到的行为(有时是死锁) 。
我们的解决方案是从 EasyNetQ 迁移。在使用了官方的 RabbitMq Client 一段时间后,我花了几天时间在此基础上编写了一个超瘦客户端。它受 EasyNetQ 的影响,支持 EasyNetQ 的大部分概念。但是,我添加了一些简洁的功能,例如可插入的消息上下文。我认为IAdvancedMessageContext
我刚刚添加的 Nack 功能可能适合您:
var client = service.GetService<IBusClient<AdvancedMessageContext>>();
client.RespondAsync<BasicRequest, BasicResponse>((req, ctx) =>
{
ctx?.Nack(); // the context implements IAdvancedMessageContext.
return Task.FromResult<BasicResponse>(null);
}, cfg => cfg.WithNoAck(false));
如果您有兴趣,可以在Github 页面(尤其是NackTests.cs
)上阅读更多相关信息。