如何解决此错误:RabbitMQ.Client.Exceptions.BrokerUnreachableException:'没有指定的端点可以访问'

时间:2018-04-25 07:12:37

标签: c# asp.net .net rabbitmq

我在eshop订购篮子项目中工作。我想从这段代码中解决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(); 
        } 
    } 
} 

运行代码时,这是eroor msg:

RabbitMQ.Client.Exceptions.BrokerUnreachableException:&#39;没有指定的端点可以访问&#39;

ArgumentNullException:值不能为null。 ConnectFailureException:连接失败

1 个答案:

答案 0 :(得分:3)

我没有看到你在任何地方设置连接参数。

典型地:

  

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添加一个抽象层。