rabbitmq - 在rabbitmq中发生几次nack异常后超时异常
问题描述
我使用 rabbitmq,我想将我的队列限制为 100,000 个消息,所以我添加了这样的策略:rabbitmqctl set_policy my-pol "^two-messages$" '{"max-length":2,"overflow":"reject-publish"}' --apply-to queues
这工作正常并限制了我的队列。
现在,当我遇到 nack 异常时,我希望线程睡眠增量时间,我这样做了:
public static async Task SendMessagage(Uri queueUri, T message, IBus bus, int interval = 10 * 1000)
{
try
{
Task<ISendEndpoint> sendEndpointTask = bus.GetSendEndpoint(queueUri);
Console.WriteLine($"Enter SendMessagage {queueUri.AbsolutePath} interval={interval}");
var result = sendEndpointTask.Result;
await result.Send(message);
Console.WriteLine($"AFTER SEND SendMessagage {queueUri.AbsolutePath} interval={interval}");
interval = 10 * 1000;
}
catch (PublishNackException e)
{
Console.WriteLine($"PublishNack EXCEPTION SendMessagage {queueUri.AbsolutePath} interval={interval}");
interval = interval * 2;
Thread.Sleep(interval);
await SendMessagage(queueUri, message, bus);
}
catch(Exception ex)
{
Console.WriteLine($"EXCEPTION SendMessagage {queueUri.AbsolutePath} interval={interval}");
interval = interval * 2;
Thread.Sleep(interval);
await SendMessagage(queueUri, message, bus);
Console.WriteLine($"EXCEPTION2 SendMessagage {queueUri.AbsolutePath} interval={interval}");
}
}
但一段时间后我得到了超时异常。为什么我会收到此异常,并且有时消费者需要做出回应?
例外是:
The model usage threw an exception
System.TimeoutException: The operation has timed out.
at RabbitMQ.Util.BlockingCell.GetValue(TimeSpan timeout)
at RabbitMQ.Client.Impl.SimpleBlockingRpcContinuation.GetReply(TimeSpan timeout)
at RabbitMQ.Client.Impl.ModelBase.ModelRpc(MethodBase method, ContentHeaderBase header, Byte[] body)
at RabbitMQ.Client.Framing.Impl.Model._Private_ChannelOpen(String outOfBand)
at RabbitMQ.Client.Framing.Impl.Connection.CreateModel()
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MassTransit.RabbitMqTransport.Integration.RabbitMqModelCache.<>c__DisplayClass9_0.<<SendUsingNewModel>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MassTransit.RabbitMqTransport.Integration.RabbitMqModelCache.ModelScope.<Attach>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MassTransit.RabbitMqTransport.Integration.RabbitMqModelCache.<SendUsingExistingModel>d__10.MoveNext()
我在日志文件中看到,在我抓到rabbitmq正在关闭的NackException之后不知道为什么,日志中的消息是:
13/5/2018 16:14:42.594 [Debug] (8) Closing model: 5 / "admin@192.168.153.103:5672/"
解决方案
推荐阅读
- javascript - 如何在 React (Hooks) 中从数组状态中删除元素
- php - PHP Mailer - 454 TLS 连接失败
- python - 如何从多个子流程公开普罗米修斯指标?
- histogram - Stata彼此相邻绘制直方图
- google-cloud-platform - 使用 python 和 Google Cloud Datacatalog 批量标记 Bigquery 列
- javascript - setTimeOut 在 for loop Javascript React 内部不起作用
- c# - Azure WebService 找不到我的程序集之一,但它基于 Azure 控制台存在
- python - 机器学习功能专栏
- python - 从views.py Django编辑列并将数据发送到数据库
- firebase-authentication - 使用 Firebase 联合身份验证对私有路由做出反应?