Почему и как клиент RabbitMQ .NET Core вызывает закрытие приложения - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю клиента следующим образом (exchangeAndQueue2 долговечны и существуют):

var factory = new ConnectionFactory() {
    HostName = hostname,
    Port = port,
    UserName = userName,
    Password = password
};
factory.AutomaticRecoveryEnabled = true;
factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(10);
connection = factory.CreateConnection();
channel = connection.CreateModel();
channel.ExchangeDeclare(exchange1, ExchangeType.Fanout, durable: true);
consumer = new EventingBasicConsumer(channel);
consumer.Registered += (s, e) => { Trace.TraceInformation("Consumer Registered"); };
consumer.ConsumerCancelled += (s, e) => { Trace.TraceInformation("Consumer Cancelled"); };
consumer.Received += NewMessage;
channel.BasicConsume(exchangeAndQueue2, autoAck: false, consumer: consumer);

В большинстве случаев он работает нормально, но НЕКОТОРЫЕ мои приложения полностью отключаются из-за RabbitMQ.Я подписался на события FirstChanceException и ProcessExit

AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => { Trace.TraceError(eventArgs.Exception.ToString()); };
AppDomain.CurrentDomain.ProcessExit += (sender, eventArgs) => {
    Trace.TraceWarning("Application is shutting down...");
    mq.CloseConnection();
}

И вот что мне удалось поймать:

Server Error: 0 : System.Net.Sockets.SocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
Server Error: 0 : System.IO.IOException: Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
Server Error: 0 : System.Net.Sockets.SocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
   at RabbitMQ.Client.Impl.InboundFrame.ReadFrom(NetworkBinaryReader reader)
Server Information: 0 : RabbitMQ Consumer Cancelled
Server Warning: 0 : Application is shutting down...

Что это может быть и как отлаживать такие вещи?Как вообще возможно, что библиотека закрывает все приложение?Весь код обработчика NewMessage заключен в try/catch (Exception ex) ...

Версия сервера 3.1.5, Версия клиента 5.1.0

Мой метод Main заканчивается на channel.BasicConsume вызов, похоже, я не понимаю, как организовать пуленепробиваемый прием.

Я полагаю, что приложение завершается, когда поток получателя завершается ... Как правильно его восстановить?

1 Ответ

0 голосов
/ 27 декабря 2018

Согласно документации RabbitMQ , мне не следует выходить из метода Main.Они используют ReadLine, но я предпочитаю ловить Ctrl + C, как в этот ответ :

static void Main(string[] args) {
    //...
    channel.BasicConsume(exchangeAndQueue2, autoAck: false, consumer: consumer);
    Trace.TraceInformation("Application started. Press Ctrl+C to shut down.");
    var exitEvent = new AutoResetEvent(false);
    Console.CancelKeyPress += (s, e) => { e.Cancel = true; exitEvent.Set(); };
    exitEvent.WaitOne();
    Trace.TraceInformation("Ctrl+C pressed.");
    mq.CloseConnection();
}
...