无法访问RabbitMQ服务器后EasyNetQ未重新连接
我正在我的软件中尝试一些边缘案例。因此,我创建了一个非常简单的测试环境:无法访问RabbitMQ服务器后EasyNetQ未重新连接,rabbitmq,easynetq,Rabbitmq,Easynetq,我正在我的软件中尝试一些边缘案例。因此,我创建了一个非常简单的测试环境: 在CentOS 7上运行的RabbitMQ服务器 在CentOS 7下运行的C#中针对.NETCore 2.1编写的消息使用者 邮件发送者针对运行在CentOS 7下的C#中的.NETCore 2.1编写 我每5秒钟发送一条简单的短信。发送方和接收方在同一个UNIX机器上运行,而RabbitMQ服务器在网络中的另一台机器上运行。 到现在为止,一直都还不错。现在,我使用systemctl stop RabbitMQ se
- 在CentOS 7上运行的RabbitMQ服务器
- 在CentOS 7下运行的C#中针对.NETCore 2.1编写的消息使用者
- 邮件发送者针对运行在CentOS 7下的C#中的.NETCore 2.1编写
systemctl stop RabbitMQ server
停止我的RabbitMQ服务器
我收到了预期的发送方和接收方的错误
我使用systemctl start RabbitMQ server
重新启动RabbitMQ服务器
现在,乐趣开始了发送方可以恢复并继续发送消息,但消费者无法恢复且不接收消息。它们累积在RabbitMQ服务器上
以下是发件人提供的我的日志条目(正常工作):
消费者程序按如下方式注册侦听器:
var msgBus = SetupRabbitMqConnection(rabbitServer, vhost, rabbitPort, rabbitUser, rabbitPwd);
RegisterMsgSubscriptions(msgBus);
private static void RegisterMsgSubscriptions(IBus msgBus)
{
Log.Logger.Debug("Starting to register RabbitMQ message subscriptions...");
try
{
#region Queue declarations
var advancedBus = msgBus.Advanced;
var testQueueOne = new EasyNetQ.Topology.Queue(TestQueueOneName, true);
Log.Logger.Debug("Finished declaring queues.");
#endregion
#region Message Queue Handler registrations
advancedBus.Consume(testQueueOne, registration => registration
.Add<RabbitMessage<TestTextMessageDto>>(MessageProcessor.ProcessRabbitTestMessage));
Log.Logger.Debug("Finished registration of message handlers for several queues.");
#endregion
}
catch (Exception ex)
{
Log.Logger.Error($"Error registering message handler. Error: {ex}");
}
}
var msgBus=SetupRabbitMqConnection(rabbitServer、vhost、rabbitPort、rabbitUser、rabbitPwd);
注册订阅(msgBus);
专用静态无效注册表msgSubscriptions(IBus msgBus)
{
Log.Logger.Debug(“开始注册RabbitMQ消息订阅…”);
尝试
{
#区域队列声明
var advancedBus=msgBus.Advanced;
var testQueueOne=new EasyNetQ.Topology.Queue(TestQueueOneName,true);
Log.Logger.Debug(“已完成队列声明”);
#端区
#区域消息队列处理程序注册
Consume(testQueueOne,registration=>registration
.Add(MessageProcessor.processrabbitstmessage));
Debug(“完成了多个队列的消息处理程序注册”);
#端区
}
捕获(例外情况除外)
{
Logger.Error($“注册消息处理程序时出错。错误:{ex}”);
}
}
你知道这里会出什么问题吗??在生产中,我们有100多台服务器使用消息。这些服务器分布在全国各地。RabbitMQ服务器位于数据中心。因此,如果连接丢失,消费服务器必须恢复,否则将无法使用只需在连接的事件上添加订阅逻辑(它将在每个代理连接的事件上激发) 当然,您应该处理在任何连接上不调用subscribe Logic两次等问题
2019-01-22 21:18:25.623 +01:00 [ERR] [EasyNetQ.PersistentConnection] [ThreadId 12] Failed to connect to broker infraserver-tbws2, port 5672, vhost testvh
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> System.AggregateException: One or more errors occurred. (Connection failed) ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 172.16.63.239:5672
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(Exception source)
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
at System.Net.Sockets.Socket.<>c.<ConnectAsync>b__272_0(IAsyncResult iar)
--- End of stack trace from previous location where exception was thrown ---
at RabbitMQ.Client.TcpClientAdapter.ConnectAsync(String host, Int32 port)
at RabbitMQ.Client.Impl.TaskExtensions.TimeoutAfter(Task task, Int32 millisecondsTimeout)
at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectOrFail(ITcpClient socket, AmqpTcpEndpoint endpoint, Int32 timeout)
--- End of inner exception stack trace ---
at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectUsingAddressFamily(AmqpTcpEndpoint endpoint, Func`2 socketFactory, Int32 timeout, AddressFamily family)
at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectUsingIPv4(AmqpTcpEndpoint endpoint, Func`2 socketFactory, Int32 timeout)
at RabbitMQ.Client.Impl.SocketFrameHandler..ctor(AmqpTcpEndpoint endpoint, Func`2 socketFactory, Int32 connectionTimeout, Int32 readTimeout, Int32 writeTimeout)
at RabbitMQ.Client.Framing.Impl.IProtocolExtensions.CreateFrameHandler(IProtocol protocol, AmqpTcpEndpoint endpoint, Func`2 socketFactory, Int32 connectionTimeout, Int32 readTimeout, Int32 writeTimeout)
at RabbitMQ.Client.ConnectionFactory.CreateFrameHandler(AmqpTcpEndpoint endpoint)
at RabbitMQ.Client.EndpointResolverExtensions.SelectOne[T](IEndpointResolver resolver, Func`2 selector)
--- End of inner exception stack trace ---
at RabbitMQ.Client.EndpointResolverExtensions.SelectOne[T](IEndpointResolver resolver, Func`2 selector)
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
--- End of inner exception stack trace ---
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
at RabbitMQ.Client.ConnectionFactory.CreateConnection(String clientProvidedName)
at EasyNetQ.ConnectionFactoryWrapper.CreateConnection()
at EasyNetQ.PersistentConnection.TryToConnect()
2019-01-22 21:18:25.625 +01:00 [ERR] [EasyNetQ.PersistentConnection] [ThreadId 12] Failed to connect to any Broker. Retrying in 00:00:05
private static IBus SetupRabbitMqConnection(string rabbitServer, string rabbitVHost, ushort rabbitPort, string rabbitUser, string rabbitPwd)
{
Log.Logger.Debug($"Creating a connection to RabbitMQ server '{rabbitServer}' on port {rabbitPort.ToString()} " +
$"using the EasyNetQ library....");
try
{
var connStr = $"host={rabbitServer}:{rabbitPort.ToString()};virtualHost={rabbitVHost};username={rabbitUser};" +
$"password={rabbitPwd};publisherConfirms=true;timeout=30;prefetchcount=1;requestedHeartbeat=30";
var msgBus = RabbitHutch.CreateBus(connStr, x => { });
if (!msgBus.IsConnected)
{
var errMsg = $"Currently not connected to RabbitMQ server '{rabbitServer}'.";
Log.Logger.Error(errMsg);
}
Log.Logger.Debug("Successfully connected to RabbitMQ server.");
return msgBus;
}
catch (Exception ex)
{
Log.Logger.Error($"Error to establish a connection to RabbitMQ server '{rabbitServer}'. Error: {ex}");
throw;
}
}
var msgBus = SetupRabbitMqConnection(rabbitServer, vhost, rabbitPort, rabbitUser, rabbitPwd);
RegisterMsgSubscriptions(msgBus);
private static void RegisterMsgSubscriptions(IBus msgBus)
{
Log.Logger.Debug("Starting to register RabbitMQ message subscriptions...");
try
{
#region Queue declarations
var advancedBus = msgBus.Advanced;
var testQueueOne = new EasyNetQ.Topology.Queue(TestQueueOneName, true);
Log.Logger.Debug("Finished declaring queues.");
#endregion
#region Message Queue Handler registrations
advancedBus.Consume(testQueueOne, registration => registration
.Add<RabbitMessage<TestTextMessageDto>>(MessageProcessor.ProcessRabbitTestMessage));
Log.Logger.Debug("Finished registration of message handlers for several queues.");
#endregion
}
catch (Exception ex)
{
Log.Logger.Error($"Error registering message handler. Error: {ex}");
}
}
advancedBus.Connected += (sender, args) => {
// subscribe logic
};