Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法访问RabbitMQ服务器后EasyNetQ未重新连接_Rabbitmq_Easynetq - Fatal编程技术网

无法访问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编写
我每5秒钟发送一条简单的短信。发送方和接收方在同一个UNIX机器上运行,而RabbitMQ服务器在网络中的另一台机器上运行。 到现在为止,一直都还不错。现在,我使用
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
};