private void StopListen()
        {
            if (_rabbitMqConnection != null)
            {
                _rabbitMqConnection.BrokerConnection.CallbackException -= OnConnectionCallbackException;
            }

            if (_queueChannel != null)
            {
                _queueChannel.CallbackException -= OnCallbackException;
                //_queueChannel.ModelShutdown -= OnModelShutdown;
            }

            StopListenQueue(ref _consumerTag, ref _queueChannel);
            _rabbitMqConnection = null;
        }
        private void StartListen()
        {
            _rabbitMqConnection = _rabbitMqConnectionPool.Get();
            _rabbitMqConnection.BrokerConnection.CallbackException += OnConnectionCallbackException;

            _queueChannel = _rabbitMqConnection.CreateChannel();
            _queueChannel.CallbackException += OnCallbackException;
            //_queueChannel.ModelShutdown += OnModelShutdown;
            // возвращаем канал в пул
            _rabbitMqConnectionPool.Return(_rabbitMqConnection);

            var consumer = new EventingBasicConsumer(_queueChannel);

            consumer.Received += (ch, ea) =>
            {
                _handleMessageEvent.Reset();
                var cts = new CancellationTokenSource();

                try
                {
                    using (var body = new MemoryStream(ea.Body.ToArray(), 0, ea.Body.Length))
                    {
                        _handler(body, _messageExchangeSerializer).GetAwaiter().GetResult();
                        ConfirmMessage(ea);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    try
                    {
                        AbandonMessage(ea, ex.Message);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("При отклонении сообщения возникла ошибка", e);
                    }
                }
                finally
                {
                    cts.Cancel();
                    _handleMessageEvent.Set();
                }
            };

            _consumerTag = _queueChannel.BasicConsume(_queueName, false, consumer);
        }
Пример #3
0
 public RabbitMQChannel(IModel channel, RabbitMqConnection connection)
 {
     Channel    = channel;
     Connection = connection;
 }