Как решить эту ошибку: RabbitMQ.Client.Exceptions.BrokerUnreachableException: «Ни одна из указанных конечных точек не была достижимой» - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю в корзине заказов в интернет-магазине.Мне нужна помощь для решения ошибки rabbitmq из этого кода:

using Microsoft.Extensions.Logging; 
using Polly; 
using Polly.Retry; 
using RabbitMQ.Client; 
using RabbitMQ.Client.Events; 
using RabbitMQ.Client.Exceptions; 
using System; 
using System.IO; 
using System.Net.Sockets; 

namespace InfiniteWorx.MRU.BuildingBlocks.EventBusRabbitMQ 
{ 
    public class DefaultRabbitMQPersistentConnection 
       : IRabbitMQPersistentConnection 
    { 
        private readonly IConnectionFactory _connectionFactory;  
        private readonly ILogger<DefaultRabbitMQPersistentConnection> _logger; 
        private readonly int _retryCount; 
        IConnection _connection; 
        bool _disposed; 
        object sync_root = new object(); 
        public DefaultRabbitMQPersistentConnection(IConnectionFactory 
connectionFactory, ILogger<DefaultRabbitMQPersistentConnection> logger, int 
retryCount = 5) 
        { 
            _connectionFactory = connectionFactory ?? throw new 
ArgumentNullException(nameof(connectionFactory)); 
            _logger = logger ?? throw new 
ArgumentNullException(nameof(logger)); 
            _retryCount = retryCount; 
        } 
        public bool IsConnected 
        { 
            get 
            { 
                return _connection != null && _connection.IsOpen && 
!_disposed; 
            } 
        } 
        public IModel CreateModel() 
        { 
            if (!IsConnected) 
            { 
                throw new InvalidOperationException("No RabbitMQ connections 
are available to perform this action"); 
            } 

            return _connection.CreateModel(); 
        } 

        public void Dispose() 
        { 
            if (_disposed) return; 

            _disposed = true; 

            try 
            { 
                _connection.Dispose(); 

            } 
            catch (IOException ex) 
            { 
                _logger.LogCritical(ex.ToString()); 
            } 
        } 

        public bool TryConnect() 
        { 
            _logger.LogInformation("RabbitMQ Client is trying to connect"); 

            lock (sync_root) 
            { 
                var policy = RetryPolicy.Handle<SocketException>() 
                    .Or<BrokerUnreachableException>() 
                    .WaitAndRetry(_retryCount, retryAttempt => 
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) => 
                    { 
                        _logger.LogWarning(ex.ToString()); 
                    } 
                ); 

                policy.Execute(() => 
                { 
                    _connection = _connectionFactory 
                          .CreateConnection(); 
                }); 

                if (IsConnected) 
                { 
                    _connection.ConnectionShutdown += OnConnectionShutdown; 
                    _connection.CallbackException += OnCallbackException; 
                    _connection.ConnectionBlocked += OnConnectionBlocked; 

                    _logger.LogInformation($"RabbitMQ persistent connection 
acquired a connection {_connection.Endpoint.HostName} and is subscribed to 
failure events"); 

                    return true; 
                } 
                else 
                { 
                    _logger.LogCritical("FATAL ERROR: RabbitMQ connections 
could not be created and opened"); 

                    return false; 
                } 
            } 
        } 

        private void OnConnectionBlocked(object sender, 
ConnectionBlockedEventArgs e) 
        { 
            if (_disposed) return; 

            _logger.LogWarning("A RabbitMQ connection is shutdown. Trying to 
re-connect..."); 

            TryConnect(); 
        } 

        void OnCallbackException(object sender, CallbackExceptionEventArgs e) 
        { 
            if (_disposed) return; 

            _logger.LogWarning("A RabbitMQ connection throw exception. 
Trying to re-connect..."); 

            TryConnect(); 
        } 

        void OnConnectionShutdown(object sender, ShutdownEventArgs reason) 
        { 
            if (_disposed) return; 

            _logger.LogWarning("A RabbitMQ connection is on shutdown. Trying to re-connect..."); 

            TryConnect(); 
        } 
    } 
} 

Это сообщение об ошибке при запуске кода:

RabbitMQ.Client.Exceptions.BrokerUnreachableException: 'Ни одна из указанных конечных точек не быладостижимая '

ArgumentNullException: значение не может быть нулевым.ConnectFailureException: соединение не удалось

1 Ответ

0 голосов
/ 25 апреля 2018

Я не вижу, чтобы вы устанавливали параметры подключения в любом месте.

Обычно:

RabbitMQ.Client.Exceptions.BrokerUnreachableException: 'Ни одна из указанных конечных точек не была доступна

означает, что параметры подключения неверны, поэтому проверьте их.


С сайта RabbitMQ :

ConnectionFactory factory = new ConnectionFactory();
// "guest"/"guest" by default, limited to localhost connections
factory.UserName = user;
factory.Password = pass;
factory.VirtualHost = vhost;
factory.HostName = hostName;

IConnection conn = factory.CreateConnection();

Или ласково:

ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://user:pass@hostName:port/vhost";

IConnection conn = factory.CreateConnection();

Итак, я предполагаю, что один из этих параметров неверен для вашей настройки. Пожалуйста, проверьте их.

Обратите внимание:

гостевая учетная запись доступна только с localhost.

Если возможно, вы можете проверить Masstransit , который добавляет уровень абстракции к MQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...