我正在寻找一种可靠的方法来重新排队的消息,不能正确处理-在这个时候。
我一直在研究http://dotnetcodr.com/2014/06/16/rabbitmq-in-net-c-basic-error-handling-in-receiver/,它似乎支持在RabbitMQ API中对消息进行重新排队。
else //reject the message but push back to queue for later re-try
{
Console.WriteLine("Rejecting message and putting it back to the queue: {0}", message);
model.BasicReject(deliveryArguments.DeliveryTag, true);
}
但是我用的是EasyNetQ,所以我想知道我会怎么做类似的事情。
bus.Subscribe<MyMessage>("my_subscription_id", msg => {
try
{
// do work... could be long running
}
catch ()
{
// something went wrong - requeue message
}
});
如果do work
超过RabbitMQ服务器等待ACK
的超时时间,消息可能会导致问题。
2条答案
按热度按时间pbwdgjma1#
所以我想出了这个解决方案。它取代了EasyNetQ默认的错误策略。
您可以将其替换为:
你必须使用
AdvancedBus
,所以你必须手动设置一切。这将死信一个失败的消息3次。之后,它将进入由EasyNetQ提供的默认错误队列进行错误处理。* 您可以订阅该队列。*
当一个异常传播出你的消费者方法时,一个消息就是死信。
eni9jsuy2#
据我所知,没有办法用EasyNetQ手动发送
ack
、nack
或reject
消息。我看到你有关于这个的opened an issue ticket with the EasyNetQ team ...但是还没有答案。
FWIW,这是一件非常合适的事情。我使用的所有库都支持这个特性集(在NodeJS中),这是常见的。我很惊讶EasyNetQ不支持这个。