我在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:连接失败
答案 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添加一个抽象层。