首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EasyNetQ支持nack吗?

EasyNetQ支持nack吗?
EN

Stack Overflow用户
提问于 2015-10-16 21:51:55
回答 3查看 3.7K关注 0票数 0

我真正想做的是在当前使用者拒绝消息的情况下,将消息保留在队列中。在RabbitMQ中,我可以发送一个NACK来完成这个任务。在EasyNetQ中是否支持NACK?还有别的方法来达到我想要的行为吗?

Update:响应不多,所以我想知道人们通常如何处理EasyNetQ中缺少NACK的问题。由于没有与basic.reject相当的功能,消费者只能使用“我可以随时处理每一条消息”的场景。我认为消费者可以抛出一个特定的“拒绝”异常,从而导致EasyNetQ将消息排到错误队列中,并且我可以使用这些错误请求消息。还有其他人有其他的解决办法吗?

EN

回答 3

Stack Overflow用户

发布于 2015-11-14 21:58:55

我使用EasyNetQ已经将近一年了,但是无论我们如何调整它(包括添加了我们自己的IConsumerErrorStrategy实现),我从未真正让它以我想要的方式工作。在RequestAsync处理程序中执行SubscribeAsync时,它是单线程的,这给了我们一些意想不到的行为(有时是死锁)。

我们的解决办法是离开EasyNetQ。在与正式的RabbitMq客户机一起工作了一段时间之后,我花了几天的时间编写了一个超薄的客户机。它受EasyNetQ的影响,支持EasyNetQ所拥有的大多数概念。但是,我添加了一些整洁的特性,比如可插拔的消息上下文。我认为我刚才添加的IAdvancedMessageContext的Nack功能可以为您提供如下内容:

代码语言:javascript
复制
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)上阅读更多有关它的内容。

票数 4
EN

Stack Overflow用户

发布于 2015-10-17 12:46:57

我认为您可以通过实现自己的IConsumerErrorStrategy来改变行为:

https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ/Consumer/DefaultConsumerErrorStrategy.cs

但是,如果您需要这种控制,您可以考虑直接使用RabbitMQ客户机吗?

票数 2
EN

Stack Overflow用户

发布于 2016-02-25 21:42:53

听起来你是在尝试处理失败。您可以输入一条消息,但这意味着它位于队列的首位。很好,但这意味着您可能会得到一堆消息,这些消息确实无法被处理,并且您将无法实际处理真正的消息。

我在使用RabbitMQ时一直使用的解决方案是利用EasyNetQ的默认错误处理,并有一个单独的应用程序来重新发送消息。也就是说,当在RabbitMQ中捕获异常时,它会将消息路由到一个名为"EasyNetQ_Default_Error_Queue“的队列。您可以重写这个名称,并让不同的队列转到不同的错误队列,但现在让我们继续使用默认的队列。然后,您可以让Windows Service/Azure Worker角色读取这些消息,并确定该做什么。这可能包括在您的消息信封/包装器上有一个"RetryCount“,以确保它只循环这么多次。总之,这将是一项工作。

您正在发现的是,许多人在使用RabbitMQ/EasyNetQ时遇到了什么。她很生硬。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33180108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档