2012-10-10 20 views
7

Mam superwizora ze strategią restartu One_for_one. Czy można ustawić czas między ponownym uruchomieniem procesu potomnego?Erlang supervisor restart interval

F.e. zdalny db zgnieciony i chcę poczekać 10 sekund między próbą nawiązania połączenia.

Odpowiedz

4

Właściwie można pozwolić przełożonego natychmiast ponownie uruchomić swoje dzieci i realizowania tzw leniwe inicjowanie:

  1. Nadzorca (re) rozpoczyna się (bezpośrednio) dziecko (powiedzmy, gen_server)
  2. gen_server zwraca 0 limit czasu w funkcji init
  3. w handle_info zrobić aktywnego oczekiwania (twoi 10 sekund), aby upewnić się, że DB jest prawidłowo zainicjowany

W ten sposób zapewnia się, że wszystkie żądania do serwera gen_server są przetwarzane po pomyślnym zainicjowaniu bazy danych.

+0

Dziękuję, ale nie mam problemu z procesem gen_server, chcę mieć interwał czasowy (uśpienie) pomiędzy próbami ponownego uruchomienia. – kolchanov

+2

Myślę, że to, co sugeruje @Robert Aloi, zadziała. Inicjator gen_server nie próbowałby ponownie się połączyć, zamiast tego zwraca 0 timeout, który zaspokoi opiekuna, że ​​dziecko się zaczęło. Następnie w funkcji handle_info wykonujesz "prawdziwą" inicjalizację ... Po spaniu przez 10 sekund – Jr0

+0

Lub jeszcze lepiej po upewnieniu się, że DB jest żywy. Oczekiwanie na ustaloną ilość czasu jest źródłem wszelkiego zła. –