Używam serwera rabbitMQ z amq.Połączenie w serwerze RabbitMQ automatycznie utracone po 600s
Mam trudny problem. Po opuszczeniu serwera przez około 10 minut połączenie zostanie utracone.
Co może być przyczyną?
Używam serwera rabbitMQ z amq.Połączenie w serwerze RabbitMQ automatycznie utracone po 600s
Mam trudny problem. Po opuszczeniu serwera przez około 10 minut połączenie zostanie utracone.
Co może być przyczyną?
Jeśli spojrzeć na dokumentacji klienta Erlang http://www.rabbitmq.com/erlang-client-user-guide.html widać sekcję Podłączanie do Brokera
To daje kilka różnych opcji, które można określić podczas konfigurowania połączenia z serwerem RabbitMQ, jedną z opcji jest heartbeat
, jak widać domyślna wartość to 0
, więc nie określono tętna.
Nie wiem dokładnie notację Erlang, ale trzeba będzie zrobić coś takiego:
{ok, Connection} = amqp_connection:start(#amqp_params_network{heartbeat = 5})
Timeout tętno jest określony w sekundach. Więc to spowodowałoby, że użytkownik będzie pulsować z powrotem do serwera co 5 sekund.
wziąć także spojrzeć na tej dyskusji: https://groups.google.com/forum/?fromgroups=#!topic/rabbitmq-discuss/u227xzvqOr8
Domyślny limit czasu połączenia dla fabryki połączeń RabbitMQ jest 600 sekund (przynajmniej w kliencie Java API), stąd twoje 10 minut. Możesz to zmienić, podając do fabryki połączeń swój czas oczekiwania.
Dobrze jest upewnić się, że połączenie jest uwalniane i odtwarzane po określonym czasie, aby zapobiec ewentualnym wyciekom i nadmiernym zasobom. Twój kod powinien zapewnić, że szuka poprawnego połączenia, które nie jest bliskie przekroczenia limitu czasu, i ponownie ustanowić nowe połączenie z tymi, z którymi upłynął czas. Ogólnie rzecz biorąc, przyjmij podejście oparte na połączeniu. Przykładem Java -
:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(this.serverName);
factory.setPort(this.serverPort);
factory.setUsername(this.userName);
factory.setPassword(this.userPassword);
factory.setConnectionTimeout(YOUR-TIMEOUT-IN-SECONDS);
Connection = factory.newConnection();
Fałsz. Istnieją dwa limity czasu - jeden zapisany serwer i jeden, który jest właśnie przekazywany do 'Socket.new'. Ten ostatni domyślnie przyjmuje wartość 0 == nieskończony i jest kontrolowany przez 'factory.setConnectionTimeout'. – djechlin
próbowałeś ustawienie wartości pulsu podczas tworzenia połączenia? – kzhen
@kzhen: Jak ustawiasz wartość pulsu? – Hyeongsik
jakiego klienta używasz? – kzhen