Исключение тайм-аута после пары исключений nack в rabbitmq - PullRequest
0 голосов
/ 13 мая 2018

Я использую 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()

Я видел в файле журнала, что после того, как NackException, что я поймал, rabbitmq закрывается, не знаю почему, сообщение в журнале:

13/5/2018 16:14:42.594 [Debug] (8) Closing model: 5 / "admin@192.168.153.103:5672/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...