我真正想做的是在当前使用者拒绝消息的情况下,将消息保留在队列中。在RabbitMQ中,我可以发送一个NACK来完成这个任务。在EasyNetQ中是否支持NACK?还有别的方法来达到我想要的行为吗?
Update:响应不多,所以我想知道人们通常如何处理EasyNetQ中缺少NACK的问题。由于没有与basic.reject相当的功能,消费者只能使用“我可以随时处理每一条消息”的场景。我认为消费者可以抛出一个特定的“拒绝”异常,从而导致EasyNetQ将消息排到错误队列中,并且我可以使用这些错误请求消息。还有其他人有其他的解决办法吗?
发布于 2015-11-14 21:58:55
我使用EasyNetQ已经将近一年了,但是无论我们如何调整它(包括添加了我们自己的IConsumerErrorStrategy实现),我从未真正让它以我想要的方式工作。在RequestAsync处理程序中执行SubscribeAsync时,它是单线程的,这给了我们一些意想不到的行为(有时是死锁)。
我们的解决办法是离开EasyNetQ。在与正式的RabbitMq客户机一起工作了一段时间之后,我花了几天的时间编写了一个超薄的客户机。它受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)上阅读更多有关它的内容。
发布于 2015-10-17 12:46:57
我认为您可以通过实现自己的IConsumerErrorStrategy来改变行为:
但是,如果您需要这种控制,您可以考虑直接使用RabbitMQ客户机吗?
发布于 2016-02-25 21:42:53
听起来你是在尝试处理失败。您可以输入一条消息,但这意味着它位于队列的首位。很好,但这意味着您可能会得到一堆消息,这些消息确实无法被处理,并且您将无法实际处理真正的消息。
我在使用RabbitMQ时一直使用的解决方案是利用EasyNetQ的默认错误处理,并有一个单独的应用程序来重新发送消息。也就是说,当在RabbitMQ中捕获异常时,它会将消息路由到一个名为"EasyNetQ_Default_Error_Queue“的队列。您可以重写这个名称,并让不同的队列转到不同的错误队列,但现在让我们继续使用默认的队列。然后,您可以让Windows Service/Azure Worker角色读取这些消息,并确定该做什么。这可能包括在您的消息信封/包装器上有一个"RetryCount“,以确保它只循环这么多次。总之,这将是一项工作。
您正在发现的是,许多人在使用RabbitMQ/EasyNetQ时遇到了什么。她很生硬。
https://stackoverflow.com/questions/33180108
复制相似问题